1、 首先用戶發送請求——>DispatcherServlet,前端控制器收到請求后自己不進行處理,而是委托給其他的解析器進行處理,作為統一訪問點,進行全局的流程控制;
2、 DispatcherServlet——>HandlerMapping,HandlerMapping 將會把請求映射為 HandlerExecutionChain 對象(包含一個 Handler 處理器(頁面控制器)對象、多個 HandlerInterceptor 攔截器)對象,通過這種策略模式,很容易添加新的映射策略;
3、 DispatcherServlet——>HandlerAdapter.Controller(HandlerAdapter 將會把Controller包裝為適配器,HandlerAdapter 將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理);
4、 業務處理方法(Service)
5、 HandlerAdapter.Controller返回一個 ModelAndView 對象(包含模型數據、邏輯視圖名);
6、 ModelAndView 的邏輯視圖名——> ViewResolver, ViewResolver 將把邏輯視圖名解析為具體的 View,通過這種策略模式,很容易更換其他視圖技術;
7、 View——>渲染,View 會根據傳進來的 Model 模型數據進行渲染,此處的 Model 實際是一個 Map 數據結構,因此很容易支持其他視圖技術;
8、 返回控制權給 DispatcherServlet,由 DispatcherServlet 返回響應給用戶,到此一個流程結束。
開發步驟:
1、 DispatcherServlet 在 web.xml 中的部署描述,從而攔截請求到 Spring Web MVC
2、 HandlerMapping 的配置,從而將請求映射到處理器
4種HandlerMapping的配置方式:
2.1 基於注解:
<!--Spring3.1開始的注解 HandlerMapping --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--Spring3.1開始的注解 HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
2.2 顯示的指定url對應關系:
prop的key值->請求,后面指定處理這個請求的Controller
<!-- 3:SimpleUrlHandlerMapping --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/springMVC.d">/HelloWorld</prop> </props> </property> </bean>
2.3 基於BeanName找到Controller:
<!-- 4:BeanNameUrlHandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
2.4 基於Controller的Class Name找到Controller:
<!-- 5:ControllerClassNameHandlerMapping --> <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
3、 HandlerAdapter 的配置,從而支持多種類型的處理器
1.DispatcherServlte會根據配置文件信息注冊HandlerAdapter,如果在配置文件中沒有配置,那么DispatcherServlte會獲取HandlerAdapter的默認配置,如果是讀取默認配置的話,DispatcherServlte會讀取DispatcherServlte.properties文件,該文件中配置了三種HandlerAdapter:HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter和AnnotationMethodHandlerAdapter(3.1以后已經過時,使用RequestMappingHandlerAdapter)。DispatcherServlte會將這三個HandlerAdapter對象存儲到它的handlerAdapters這個集合屬性中,這樣就完成了HandlerAdapter的注冊。
2.DispatcherServlte會根據handlerMapping傳過來的controller與已經注冊好了的HandlerAdapter一一匹配,看哪一種HandlerAdapter是支持該controller類型的,如果找到了其中一種HandlerAdapter是支持傳過來的controller類型,那么該HandlerAdapter會調用自己的handle方法,handle方法運用java的反射機制執行controller的具體方法來獲得ModelAndView,例如SimpleControllerHandlerAdapter是支持實現了controller接口的控制器,如果自己寫的控制器實現了controller接口,那么SimpleControllerHandlerAdapter就會去執行自己寫控制器中的具體方法來完成請求。
4、 ViewResolver 的配置,從而將邏輯視圖名解析為具體視圖技術
4.1 InternalResourceViewResolver:
配置表示,將在Controller返回的ModelAndView的基礎上,加上目錄前綴/WEB-INF/jsp/,
加后文件名稱后綴.jsp,由此等待下個頁面如/WEB-INF/jsp/showCats.jsp
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"><value>org.springframework.web.servlet.view.JstlView</value></property> <property name="prefix"><value>/WEB-INF/jsp/</value></property> <property name="suffix"><value>.jsp</value></property> </bean>
4.2 ResourceBundleViewResolver:
在properties文件中維護class與視圖資源的配置關系
5、 處理器(頁面控制器)的配置,從而進行功能處理