1、 用戶發送請求至前端控制器DispatcherServlet
2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一並返回給DispatcherServlet。
4、 DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
5、 執行處理器(Controller,也叫后端控制器)。
6、 Controller執行完成返回ModelAndView
7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、 ViewReslover解析后返回具體View
10、 DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
11、 DispatcherServlet響應用戶
一.HandlerMapping,處理器映射器
1.BeanNameUrl處理器映射器,根據請求的url與spring容器中定義的bean的name進行匹配,從而從spring容器中找到bean實例。
<!—beanName Url映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
2.SimpleUrlHandlerMapping
simpleUrlHandlerMapping是BeanNameUrlHandlerMapping的增強版本,它可以將url和處理器bean的id進行統一映射配置。
<!—簡單url映射 --
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
<property name="mappings">
<props>
<prop key="/items1.action">controller的bean id</prop>
<prop key="/items2.action">controller的bean id</prop>
</props>
</property>
</bean>
二.HandlerAdapter,處理器適配器
HandlerAdapter會根據適配器接口對后端控制器進行包裝(適配),包裝后即可對處理器進行執行,通過擴展處理器適配器可以執行多種類型的處理器,這里使用了適配器設計模式。
1.SimpleControllerHandlerAdapter
SimpleControllerHandlerAdapter簡單控制器處理器適配器,所有實現了org.springframework.web.servlet.mvc.Controller 接口的Bean通過此適配器進行適配、執行。
適配器配置如下:
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
2.HttpRequestHandlerAdapter
HttpRequestHandlerAdapter,http請求處理器適配器,所有實現了org.springframework.web.HttpRequestHandler 接口的Bean通過此適配器進行適配、執行。
適配器配置如下:
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
Controller實現如下:
public class ItemList2 implements HttpRequestHandler{}
從上邊可以看出此適配器器的handleRequest方法沒有返回ModelAndView,可通過response修改定義響應內容,比如返回json數據:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串")
三.注解映射器和適配器
1.組件掃描器
使用組件掃描器省去在spring容器配置每個controller類的繁瑣。使用<context:component-scan自動掃描標記@controller的控制器類,配置如下:
<!-- 掃描controller注解,多個包中間使用半角逗號分隔 -->
<context:component-scan base-package="cn.itcast.springmvc.controller.first"/>
2.RequestMappingHandlerMapping
注解式處理器映射器,對類中標記@ResquestMapping的方法進行映射,根據ResquestMapping定義的url匹配ResquestMapping標記的方法,
匹配成功返回HandlerMethod對象給前端控制器,HandlerMethod對象中封裝url對應的方法Method。
從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成注解式處理器映射。
配置如下:
<!--注解映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
3.RequestMappingAdapter
注解式處理器適配器,對標記@ResquestMapping的方法進行適配。
從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成注解式處理器適配。
配置如下:
<!--注解適配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
4.<mvc:annotation-driven/>
springmvc使用<mvc:annotation-driven>自動加載RequestMappingHandlerMapping和RequestMappingHandlerAdapter,
可用在springmvc.xml配置文件中使用<mvc:annotation-driven>替代注解處理器和適配器的配置。