版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quá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ā)到目標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名稱。當一個Request對象產(chǎn)生時,會把這個子上下文對象(WebApplicationContext)保存在Request對象中,key是DispatcherServlet.class.getName()+".CONTEXT"??梢允褂霉ぞ哳惾〕錾舷挛膶ο螅篟equestContextUtils.getWebApplicationContext(request);SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置二.DispatcherServlet的默認配置DispatcherServlet的默認配置在DispatcherSperties(和DispatcherServlet類在一個包下)中,而且是當Spring配置文件中沒有指定配置時使用的默認策略:DispatcherServlet默認使用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:當處理器沒有返回邏輯視圖名等相關(guān)信息時,自動將請求URL映射為邏輯視圖名;10、FlashMapManager:用于管理FlashMap的策略接口,F(xiàn)lashMap用于存儲一個請求的輸出,當進入另一個請求時作為該請求的輸入,通常用于重定向場景SpringMVC和前端技術(shù)分享SpringMVC工作原理和配置二.SpringMVC的配置<!--
自動掃描的包名
-->
<context:component-scan
base-package="com.app,com.core,JUnit4"
></context:component-scan>
<!--
默認的注解映射的支持
-->
<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容器自己的默認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í)行完攔截后,交給目標處理器。
如果沒有找到處理器,那么這個攔截器就不會被執(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)資源就不會被攔截。因為我們精準的注入了攔截器。如果使用了<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標注的方法,在其中注冊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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 情侶婚紗租賃合同范例
- 2024至2030年實驗室敞口高剪切乳化機項目投資價值分析報告
- 2024至2030年便攜式涂料攪拌器項目投資價值分析報告
- 賠付違約金并解除合同范例
- 陜西鐵路工程職業(yè)技術(shù)學(xué)院《高級商務(wù)翻譯》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年度教師繼續(xù)教育課程開發(fā)與推廣合同3篇
- 陜西師范大學(xué)《草書臨摹》2023-2024學(xué)年第一學(xué)期期末試卷
- 陜西青年職業(yè)學(xué)院《數(shù)學(xué)模型設(shè)計》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年電纜懸掛浮球液位開關(guān)項目可行性研究報告
- 工程合同供貨合同范例
- 哈爾濱冰雪大世界
- 【珠江啤酒公司盈利能力的杜邦分析(7400字論文)】
- 傳染科護理敏感指標建立
- 舊房翻新培訓(xùn)課件教學(xué)
- 2023-2024學(xué)年安徽省蕪湖市無為市八年級(上)期末數(shù)學(xué)試卷(含解析)
- 《反滲透系統(tǒng)簡介》課件
- 醫(yī)療安全不良事件警示教育課件
- illustrator練習(xí)試題附答案
- 華為公司管理決策流程
- 車輛理賠權(quán)益轉(zhuǎn)讓協(xié)議
- 《我的家鄉(xiāng)天津》課件
評論
0/150
提交評論