Dispatcher Servlet 簡單理解及項(xiàng)目配置
本文主要介紹Spring中Dispatcher Servlet在項(xiàng)目中的配置和基本理解
一取视、簡介
DispatcherServlet是前端控制器設(shè)計(jì)模式的實(shí)現(xiàn)打厘,提供Spring Web MVC的集中訪問點(diǎn)垒玲,而且負(fù)責(zé)職責(zé)的分派鳖擒,與Spring IoC容器無縫集成顾翼,從而可以獲得Spring的所有好處台腥。
DispatcherServlet配置在web.xml文件中宏赘,攔截匹配的請求,Servlet攔截匹配規(guī)則要自己定義黎侈,把攔截下來的請求察署,依據(jù)相應(yīng)的規(guī)則分發(fā)到目標(biāo)Controller來處理,是配置spring MVC的第一步峻汉。
二贴汪、作用
DispatcherServlet主要用作職責(zé)調(diào)度工作,本身主要用于控制流程休吠,主要職責(zé)如下:
1扳埂、文件上傳解析,如果請求類型是multipart將通過MultipartResolver進(jìn)行文件上傳解析瘤礁;
2阳懂、通過HandlerMapping,將請求映射到處理器(返回一個(gè)HandlerExecutionChain,它包括一個(gè)處理器岩调、多個(gè)HandlerInterceptor攔截器)巷燥;
3、通過HandlerAdapter支持多種類型的處理器(HandlerExecutionChain中的處理器)号枕;
4缰揪、通過ViewResolver解析邏輯視圖名到具體視圖實(shí)現(xiàn);
5葱淳、本地化解析钝腺;
6、渲染具體的視圖等赞厕;
7拍屑、如果執(zhí)行過程中遇到異常將交給HandlerExceptionResolver來解析。
三坑傅、web.xml 配置
web.xml 文件配置:
<!-- 上下文 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath*:/applicationContext.xml
</param-value>
</context-param>
<listener>
<description>Spring監(jiān)聽</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC -->
<servlet>
<!-- 配置的Dispatcher Servlet名稱及Class類 -->
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 表示啟動(dòng)容器時(shí)初始化該Servlet -->
<load-on-startup>1</load-on-startup>
<!-- 如若不配置init-param僵驰,DispatcherServlet默認(rèn)使用WebApplicationContext作為上下文,Spring默認(rèn)配置文件為“/WEB-INF/[servlet名字]-servlet.xml” -->
<!-- 自定義初始化上下文 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 引用spring-mvc.xml文件 -->
<param-value>classpath*:/spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 攔截匹配的請求唁毒,Servlet攔截匹配規(guī)則 -->
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.do</url-pattern>
<url-pattern>*.json</url-pattern>
<!-- 配置“/“攔截所有 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
spring-mvc.xml 文件配置:
<!-- 使用Annotation自動(dòng)注冊Bean,只掃描@Controller -->
<!-- base-package 如果多個(gè)蒜茴,用“,”分隔 -->
<context:component-scan base-package="com.xxx.web.**.*,com.xxx.common.web.**.*" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
<!-- Spring3.2新注解@ControllerAdvice,使用@Component注解 -->
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
<!-- 不掃描Service -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 默認(rèn)的注解映射的支持浆西,org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping -->
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="fastJsonHttpMessageConverter" />
<ref bean="stringHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 國際化 -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
<!-- 異常 -->
<bean class="com.xxx.common.interceptor.ExceptionInterceptor" />
<!-- 用戶Session -->
<bean class="com.xxx.web.interceptor.UserLoginInterceptor"/>
</mvc:interceptors>
<!-- 上傳限制 -->
<beanid="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="utf-8" />
<!-- 延遲解析文件 -->
<property name="resolveLazily" value="true" />
</bean>
<!-- freemark視圖分析器 -->
<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true" />
<property name="prefix" value="/views/" />
<property name="suffix" value=".html" />
<property name="contentType" value="text/html; charset=UTF-8" />
<property name="exposeRequestAttributes" value="true" />
<property name="exposeSessionAttributes" value="true" />
<property name="exposeSpringMacroHelpers" value="true" />
<property name="requestContextAttribute" value="request" />
</bean>
四粉私、特殊Bean
DispatcherServlet中使用的特殊的Bean:
DispatcherServlet默認(rèn)使用WebApplicationContext作為上下文,該上下文中特殊的Bean有:
1近零、Controller:
處理器/頁面控制器诺核,做的是MVC中的C的事情,但控制邏輯轉(zhuǎn)移到前端控制器了久信,用于對請求進(jìn)行處理窖杀;
2、HandlerMapping:
請求到處理器的映射裙士,如果映射成功返回一個(gè)HandlerExecutionChain對象
(包含一個(gè)Handler處理器(頁面控制器)對象入客、多個(gè)HandlerInterceptor攔截器)對象;
如BeanNameUrlHandlerMapping將URL與Bean名字映射腿椎,映射成功的Bean就是此處的處理器桌硫;
3、HandlerAdapter:
HandlerAdapter將會(huì)把處理器包裝為適配器啃炸,從而支持多種類型的處理器铆隘,即適配器設(shè)計(jì)模式的應(yīng)用,
從而很容易支持很多類型的處理器南用;
如SimpleControllerHandlerAdapter將對實(shí)現(xiàn)了Controller接口的Bean進(jìn)行適配膀钠,
并且按處理器的handleRequest方法進(jìn)行功能處理掏湾;
4、ViewResolver:
ViewResolver將把邏輯視圖名解析為具體的View托修,通過這種策略模式,很容易更換其他視圖技術(shù)恒界;
如InternalResourceViewResolver將邏輯視圖名映射為jsp視圖睦刃;
5、LocalResover:
本地化解析十酣,因?yàn)镾pring支持國際化涩拙,因此LocalResover解析客戶端的Locale信息從而方便進(jìn)行國際化;
6耸采、ThemeResovler:
主題解析兴泥,通過它來實(shí)現(xiàn)一個(gè)頁面多套風(fēng)格,即常見的類似于軟件皮膚效果虾宇;
7搓彻、MultipartResolver:
文件上傳解析,用于支持文件上傳嘱朽;
8旭贬、HandlerExceptionResolver:
處理器異常解析,可以將異常映射到相應(yīng)的統(tǒng)一錯(cuò)誤界面搪泳,從而顯示用戶友好的界面(而不是給用戶看到具體的錯(cuò)誤信息)稀轨;
9、RequestToViewNameTranslator:
當(dāng)處理器沒有返回邏輯視圖名等相關(guān)信息時(shí)岸军,自動(dòng)將請求URL映射為邏輯視圖名奋刽;
到此本文已結(jié)束,后續(xù)有時(shí)間繼續(xù)詳解dispatcher servlet初始化及具體實(shí)現(xiàn)艰赞。
文章部分內(nèi)容參照百度百科佣谐,如有問題,請大家留言指出方妖。
掃描下面二維碼台谍,關(guān)注我的公眾號(hào)哦!S醵稀趁蕊!