




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
知識點前端技術(shù)分享SpringMVC工作原理和配置SpringMVC和前端技術(shù)分享前端技術(shù)分享參考地址:SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置一.SpringMVC的控制器DispatcherServlet
使用SpringMVC,配置DispatcherServlet是第一步。DispatcherServlet是一個Servlet,所以可以配置多個DispatcherServlet。DispatcherServlet是前置控制器,配置在web.xml文件中的。攔截匹配的請求,Servlet攔截匹配規(guī)則要自已定義,把攔截下來的請求,依據(jù)某某規(guī)則分發(fā)到目標(biāo)Controller來處理。DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制流程,主要職責(zé)如下:1、文件上傳解析,如果請求類型是multipart將通過MultipartResolver進行文件上傳解析;2、通過HandlerMapping,將請求映射到處理器(返回一個HandlerExecutionChain,它包括一個處理器、多個HandlerInterceptor攔截器);3、通過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器);4、通過ViewResolver解析邏輯視圖名到具體視圖實現(xiàn);5、本地化解析;6、渲染具體的視圖等;7、如果執(zhí)行過程中遇到異常將交給HandlerExceptionResolver來解析。SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置DispatcherServlet是一個Servlet,可以同時配置多個,每個DispatcherServlet有一個自己的上下文對象(WebApplicationContext),稱為子上下文(子容器),子上下文可以訪問父上下文中的內(nèi)容,但父上下文不能訪問子上下文中的內(nèi)容。它也保存在ServletContext中,key是"org.springframework.web.servlet.FrameworkServlet.CONTEXT"+Servlet名稱。當(dāng)一個Request對象產(chǎn)生時,會把這個子上下文對象(WebApplicationContext)保存在Request對象中,key是DispatcherServlet.class.getName()+".CONTEXT"??梢允褂霉ぞ哳惾〕錾舷挛膶ο螅篟equestContextUtils.getWebApplicationContext(request);SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置二.DispatcherServlet的默認(rèn)配置DispatcherServlet的默認(rèn)配置在DispatcherSperties(和DispatcherServlet類在一個包下)中,而且是當(dāng)Spring配置文件中沒有指定配置時使用的默認(rèn)策略:DispatcherServlet默認(rèn)使用WebApplicationContext作為上下文,因此我們來看一下該上下文中有哪些特殊的Bean:1、Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉(zhuǎn)移到前端控制器了,用于對請求進行處理;2、HandlerMapping:請求到處理器的映射,如果映射成功返回一個HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象;如BeanNameUrlHandlerMapping將URL與Bean名字映射,映射成功的Bean就是此處的處理器;3、HandlerAdapter:HandlerAdapter將會把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計模式的應(yīng)用,從而很容易支持很多類型的處理器;如SimpleControllerHandlerAdapter將對實現(xiàn)了Controller接口的Bean進行適配,并且掉處理器的handleRequest方法進行功能處理;4、ViewResolver:ViewResolver將把邏輯視圖名解析為具體的View,通過這種策略模式,很容易更換其他視圖技術(shù);如InternalResourceViewResolver將邏輯視圖名映射為jsp視圖;SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置5、LocalResover:本地化解析,因為Spring支持國際化,因此LocalResover解析客戶端的Locale信息從而方便進行國際化;6、ThemeResovler:主題解析,通過它來實現(xiàn)一個頁面多套風(fēng)格,即常見的類似于軟件皮膚效果;7、MultipartResolver:文件上傳解析,用于支持文件上傳;8、HandlerExceptionResolver:處理器異常解析,可以將異常映射到相應(yīng)的統(tǒng)一錯誤界面,從而顯示用戶友好的界面(而不是給用戶看到具體的錯誤信息);9、RequestToViewNameTranslator:當(dāng)處理器沒有返回邏輯視圖名等相關(guān)信息時,自動將請求URL映射為邏輯視圖名;10、FlashMapManager:用于管理FlashMap的策略接口,F(xiàn)lashMap用于存儲一個請求的輸出,當(dāng)進入另一個請求時作為該請求的輸入,通常用于重定向場景SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置二.SpringMVC的配置<!--
自動掃描的包名
-->
<context:component-scan
base-package="com.app,com.core,JUnit4"
></context:component-scan>
<!--
默認(rèn)的注解映射的支持
-->
<mvc:annotation-driven
/>
這是一種簡寫形式,完全可以手動配置替代這種簡寫形式,會自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter兩個bean,是springMVC為@Controllers分發(fā)請求所必須的。
<!--
視圖解釋類
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property
name="prefix"
value="/WEB-INF/jsp/"/>
<property
name="suffix"
value=".jsp"/><!--可為空,方便實現(xiàn)自已的依據(jù)擴展名來選擇視圖解釋類的邏輯
-->
<property
name="viewClass"
value="org.springframework.web.servlet.view.JstlView"
/>
</bean>
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置
<!--
對靜態(tài)資源文件的訪問
方案一
(二選一)
-->
<mvc:default-servlet-handler/>
會把"/**"url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態(tài)資源的訪問由HandlerMapping轉(zhuǎn)到org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler處理并返回.
DefaultServletHttpRequestHandler使用就是各個Servlet容器自己的默認(rèn)Servlet.
<!--
對靜態(tài)資源文件的訪問
方案二
(二選一)-->
<mvc:resources
mapping="/images/**"
location="/images/"
cache-period="31556926"/>
</beans>
在spring3.0.4以后版本提供了mvc:resources,使用<mvc:resources/>元素,把mapping的URI注冊到SimpleUrlHandlerMapping的urlMap中,
key為mapping的URIpattern值,而value為ResourceHttpRequestHandler
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置
<!--
攔截器
-->
org.springframework.web.servlet.HandlerInterceptor接口,org.springframework.web.servlet.handler.HandlerInterceptorAdapter適配器,
實現(xiàn)這個接口或繼承此類,可以非常方便的實現(xiàn)自己的攔截器。
分別實現(xiàn)預(yù)處理、后處理(調(diào)用了Service并返回ModelAndView,但未進行頁面渲染)、返回處理(已經(jīng)渲染了頁面)
在preHandle中,可以進行編碼、安全控制等處理;
在postHandle中,有機會修改ModelAndView;
在afterCompletion中,可以根據(jù)ex是否為null判斷是否發(fā)生了異常,進行日志記錄。攔截器會在什么時候執(zhí)行呢?一個請求交給一個HandlerMapping時,這個HandlerMapping先找有沒有處理器來處理這個請求,如何找到了,就執(zhí)行攔截器,執(zhí)行完攔截后,交給目標(biāo)處理器。
如果沒有找到處理器,那么這個攔截器就不會被執(zhí)行。
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置
在springMVC的配置文件中配置有三種方法1.<mvc:interceptors>
<bean
class="com.app.mvc.MyInteceptor"
/>
</mvc:interceptors>
只要請求被HandlerMapping上,即只找到一個處理器,這個攔截器總會被執(zhí)行的。起到了總攔截器的作用。如果是REST風(fēng)格的URL,靜態(tài)資源也會被攔截。方案二,(近似)總攔截器,攔截匹配的URL<mvc:interceptors
>
<mvc:interceptor>
<mvc:mapping
path="/user/*"
/>
<!--
/user/*
-->
<bean
class="com.mvc.MyInteceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<mvc:interceptors><mvc:interceptor><mvc:mappingpath="/user/*"/><!--/user/*--><beanclass="com.mvc.MyInteceptor"></bean></mvc:interceptor></mvc:interceptors>就是比方案一多了一個URL匹配。如果是REST風(fēng)格的URL,靜態(tài)資源也會被攔截。
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置<bean
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property
name="interceptors">
<list>
<bean
class="com.mvc.MyInteceptor"></bean>
</list>
</property>
</bean>如果是REST風(fēng)格的URL,靜態(tài)資源就不會被攔截。因為我們精準(zhǔn)的注入了攔截器。如果使用了<mvc:annotation-driven/>,
它會自動注冊DefaultAnnotationHandlerMapping與AnnotationMethodHandlerAdapter這兩個bean,所以就沒有機會再給它注入interceptors屬性,就無法指定攔截器。
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置三.SpringMVC的數(shù)據(jù)綁定1).常用注釋1、@RequestParam綁定單個請求參數(shù)值;2、@PathVariable綁定URI模板變量值;3、@CookieValue綁定Cookie數(shù)據(jù)值4、@RequestHeader綁定請求頭數(shù)據(jù);5、@ModelValue綁定參數(shù)到命令對象;6、@SessionAttributes綁定命令對象到session;7、@RequestBody綁定請求的內(nèi)容區(qū)數(shù)據(jù)并能進行自動類型轉(zhuǎn)換等。8、@RequestPart綁定“multipart/data”數(shù)據(jù),除了能綁定@RequestParam能做到的請求參數(shù)外,還能綁定上傳的文件等。例如:@RequestMapping(value
=
"/error1")
public
String
error1(UserModel
user,
BindingResult
result)
可以直接得到提交的表單數(shù)據(jù)user,和對user驗證
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置2)url數(shù)據(jù)綁定1、普通URL路徑映射@RequestMapping(value={"/test1",
"/user/create"}):多個URL路徑可以映射到同一個處理器的功能處理方法。2、URI模板模式映射@RequestMapping(value="/users/{userId}"):{×××}占位符,請求的URL可以是“/users/123456”或“/users/abcd”,通過@PathVariable可以提取URI模板模式中的{×××}中的×××變量。@RequestMapping(value="/users/{userId}/create"):這樣也是可以的,請求的URL可以是“/users/123/create”。3、Ant風(fēng)格的URL路徑映射@RequestMapping(value="/users/**"):可以匹配“/users/abc/abc”,但“/users/123”將會被【URI模板模式映射中的“/users/{userId}”模式優(yōu)先映射到】@RequestMapping(value="/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置3.數(shù)據(jù)轉(zhuǎn)換springMVC實際是先利用java.beans.PropertyEditor中的setAdText方法來把string格式的輸入轉(zhuǎn)換為bean屬性1.利用@InitBinder來注冊customerpropertyEditor即在controller類中增加一個使用@InitBinder標(biāo)注的方法,在其中注冊customerEditor@InitBinder
publicvoidinitBinder(WebDataBinderbinder){
SimpleDateFormatdateFormat=newSimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class,newCustomDateEditor(
dateFormat,false));
}
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置2.繼承WebBindingInitializer接口來實現(xiàn)全局注冊
publicclassCustomerBindingimplementsWebBindingInitializer并修改servletcontextxml配置文件<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<propertyname="webBindingInitializer">
<bean
class="net.zhepu.web.customerBinding.CustomerBinding"/>
</property>
</bean>但這樣一來就無法使用mvc:annotation-driven
了。3.使用conversion-service來注冊自定義的converter
DataBinder實現(xiàn)了PropertyEditorRegistry,TypeConverter這兩個interface
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置<beanid="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<propertyname="converters">
<list>
<beanclass="net.zhepu.web.customerBinding.CustomerConverter"/>
</list>
</property>
</bean>需要修改springservicecontextxml配置文件中的annotation-driven,增加屬性conversion-service指向新增的conversionServicebean。<mvc:annotation-drivenvalidator="validator"
conversion-service="conversionService"/>
SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置<beanid="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<propertyname="converters">
<list>
<beanclass="net.zhepu.web.customerBinding.CustomerConverter"/>
</list>
</property>
</bean>需要修改springservicecontextxml配置文件中的annotation-driven,增加屬性conversion-service指向新增的conversionServicebean。<mvc:annotation-drivenvalidator="validator"
conversion-service="conversi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 書法教學(xué)中的情感教育教案范文
- 消防安全年度工作總結(jié)與整改計劃
- 城市綠化工程質(zhì)量檢測計劃
- 人工智能應(yīng)用開發(fā)質(zhì)量管理措施
- 幼兒園園長崗位職責(zé)與政教管理
- 小學(xué)數(shù)學(xué)與科技結(jié)合的教學(xué)計劃
- 零售業(yè)風(fēng)控部門的職能與責(zé)任
- 三年級道德與法治主題班會策劃
- 九年級數(shù)學(xué)線上教學(xué)工作計劃
- 幼兒園大班科學(xué)《神奇的風(fēng)》課件
- 紅旗E-HS3保養(yǎng)手冊
- 畜牧業(yè)的動物保護與福利
- 寫作:說明的關(guān)鍵在說得“明”+課件-【中職專用】高一語文(高教版2023基礎(chǔ)模塊下冊)
- 《鋼鐵是怎樣煉成的》選擇題100題(含答案)
- 機器人比賽教學(xué)課件
- 端午健康養(yǎng)生知識講座
- 市場主體遷移申請書(一照通行)
- 大班音樂《畢業(yè)歌》課件
- 應(yīng)急演練評估表模板
- 中醫(yī)-脾胃詳細(xì)版課件
- 勞務(wù)外包服務(wù)項目投標(biāo)方案(技術(shù)方案)
評論
0/150
提交評論