核心流程及配置
核心流程
首先用戶發(fā)送請求-------->DispatcherServlet,前端控制器收到請求后自己不進行處理坟桅,而是委托給其他的解析器進行處理锰镀,作為同一訪問點,進行全局的流程控制
DispatcherServlet--------->HandlerMapping纯露,HandlerMapping將會把請求映射為HandlerExecutionChain對象(包含一個Handler處理器對象、多個HandlerInterceptor攔截器),通過策略模式击吱,很容易添加新的映射策略
DispatcherServlet---------->HandlerAdapter,HandlerAdapter將會把處理器包裝為適配器们镜,從而支持多種類型的處理器币叹,即適配設(shè)計模式的應(yīng)用,從而很容易支持很多類型的處理器
HandlerAdapter------------->處理器功能處理方法的調(diào)用模狭,HandlerAdapter將會根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法颈抚,完成功能處理,并返回一個ModelAndView對象
ModelAndView的邏輯視圖名-------->ViewResolver嚼鹉,ViewResolver將把邏輯視圖解析為具體的View贩汉,通過這種策略模式,很容易更換其他視圖技術(shù)
View------>渲染锚赤,View會根據(jù)傳進來的Model模型進行渲染匹舞,此處的Model實際是一個Map
返回控制權(quán)給DispatcherServlet,有DispatcherServlet返回響應(yīng)給用戶
配置
DispatcherServlet
DispatcherServlet充當SpringMVC的前端控制器线脚。與其他Servlet一樣赐稽,DispatcherServlet必須在Web應(yīng)用程序的web.xml文件中進行配置
web.xml配置
<!-- springmvc會過濾掉.html的 導(dǎo)致視圖解析器無法找到
如果只是使用jsp資源而未使用html的話可以不配置該項
-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化參數(shù):配置Springmvc配置文件的位置和名稱
默認配置文件為:/WEB-INF/<servlet-name>-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 處理靜態(tài)資源 -->
<mvc:resources mapping="/images/**" location="/images/" cache-period="31556926"></mvc:resources>
<mvc:resources mapping="/js/**" location="/js/" cache-period="31556926"></mvc:resources>
<mvc:resources mapping="/css/**" location="/css/" cache-period="31556926"></mvc:resources>
靜態(tài)資源請求問題
因為DispatcherServlet的<url-pattern>配置的是/,針對的是所有請求浑侥,所以對于一些的靜態(tài)資源(如.js姊舵、.css)等也會經(jīng)過DispatcherServlet,但是DispatcherServlet是處理動態(tài)請求的寓落,無法處理靜態(tài)資源
配置<mvc:default-servlet-handler/>來解決括丁,作用是處理靜態(tài)資源,將在SpringMVC上下文中定義一個DefaultServletHttpRequestHandler,會對進行DispatcherServlet的請求進行篩選伶选,如果發(fā)現(xiàn)是沒有經(jīng)過映射的請求史飞,就將請求交給WEB服務(wù)器默認的Servlet來處理,否則交由DispatcherServlet來處理
default-servlet-name默認是default仰税,如果不是default需要顯式的進行配置(看所使用的web服務(wù)器构资,tomcat是default
<mvc:default-servlet-handler default-servlet-name="default"/>
需要注意的是,配置了<mvc:default-servlet-handler/>之后陨簇,@RequestMapping的映射會失效蚯窥,需要加上<mvc:annotation-driven/>配置
HandlerMapping
spring自帶了多個處理器映射實現(xiàn)
BeanNameUrlHandlerMapping 根據(jù)控制器Bean的名字將控制器映射到URL
ControllerBeanNameHandlerMapping 與BeanNameUrlHandlerMapping類似
ControllerClassNameHandlerMapping 通過使用控制器的類名作為URL基礎(chǔ)將控制器映射到URL
DefaultAnnotationHandlerMapping 將請求映射給使用@RequestMapping注解的控制器和控制器方法
SImplerUrlHandlerMapping 使用定義在Spring應(yīng)用上下文的集合將控制器映射到URL
<!-- 開啟注解 -->
<mvc:annotation-driven/>
<bean id="defaultAnnotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
mvc:annotation-driven配置的作用
- <mvc:annotation-driven/>會自動注冊RequestMappingHandlerMapping、RequestMappingHandlerAdater塞帐、ExceptionHandlerExceptionResolver三個bean
- 支持使用ConversionService實例對表單參數(shù)進行類型轉(zhuǎn)換
- 支持使用@NumberFormatannotation拦赠、@DataTimeFormat注解完成數(shù)據(jù)類型的格式化
- 支持使用@Vaild注解對JavaBean實例進行JSR 303驗證
- 支持使用@RequestBody和@ResponseBody注解
HandlerAdapter
<bean id="annotationMethodHandlerAdapter"
class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
配置視圖
InternalResourceViewResolver將邏輯視圖名稱解析為View對象,架構(gòu)該對象渲染的任務(wù)委托給Web應(yīng)用程序上下文的一個模板
<!-- 配置視圖解析器葵姥,將ModelAndView及字符串解析為具體的頁面 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
由于本身的博客百度沒有收錄荷鼠,博客地址http://zhhll.icu