springmvc處理請求的流程

DispacherServlet做爲一個入口,請求來了以後,都是到DispacherServlet中,會走它的doService方法,在doService方法中,調用doDispatch方法。而後分發請求web

doDispatch方法以下(簡化以後)spring

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {

   try {
      ModelAndView mv = null;
      try {
         // 根據request來獲取相對應的handler(也就是controller)
         mappedHandler = getHandler(processedRequest);
         // 根據request來獲取相對應要調用的controller中的具體方法(能夠這麼理解)
         HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
         // 具體調用controller中的方法,返回視圖
         mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
         // 這些都是視圖相關的了吧
         applyDefaultViewName(processedRequest, mv);
         mappedHandler.applyPostHandle(processedRequest, response, mv);
      }
   }

根據源代碼知道,springmvc作了兩件事,才找到要執行的方法。mvc

一、找handler(即controller)app

二、找adapter(即controller中方法)url

流程以下spa

從流程能夠知道,Springmvc的兩個很重要的接口 HandlerMapping 和 HandlerAdapter.net

request經過 HandlerMapping 找到 HandlerExecutionChain(handler+攔截器)component

而後再經過 HandlerAdapter 找到 對應的處理映射,來執行 handler中具體的方法。接口

HandlerMapping 和 HandlerAdapter 是兩個頂級接口,它們分別都有幾個實現開發

HandlerMapping 的具體實現

一、BeanNameUrlHandlerMapping (Springmvc默認):做用是找handler,根據springmvc的配置文件中配置的<bean name="/url" class="Controller"></bean> 來找到對應的Controller。這樣url和Controller就一一對應了,一個controller的bean對應一個url

二、SimpleUrlHandlerMapping 推薦使用:做用是找handler,在springmvc的配置文件中配置,配置以下

<bean id="test1" class="com.pptv.controller.Test1Controller"></bean>

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
   <property name="mappings">
      <props>
         <prop key="/hello.do">test1</prop>
      </props>
   </property>
</bean>

這個就把controller 的 bean 和 url 分開來了,更加方便維護。

三、ControllerClassNameHandlerMapping 不推薦:做用是找handler,在springmvc的配置文件中配置,訪問時,經過controller類名能夠訪問,類名首字母小寫。如配置爲

<bean class="com.pptv.controller.TestController"></bean>

那麼訪問時,url能夠爲 /test、/test1十一、 /testController ...均可以訪問到(待驗證)。

四、RequestMappingHandlerMapping 這個是註解開發相關的。在Controller類加上@Controller就能夠找到對應的了。

 

HandlerAdaper的具體實現

一、SimpleControllerHandlerAdapter:須要controller實現接口Controller,並實現方法

handleRequest,這個方法返回一個視圖。

二、HttpRequestHandlerAdapter:須要controller實現接口HttpRequestHandler,並實現方法

handlerRequest,這個方法返回void。

三、RequestMappingHandlerAdapter 這個是註解開發相關的,和RequestMappingHandlerMapping配對使用。

 

HandlerMapping 和 HandlerAdaper 分別 還有個具體實現,叫 Annotation...的,名字記不清楚,不過這個是3.0版本之前用的,也是註解相關,如今分別用RequestMappingHandlerMapping 和 RequestMappingHandlerAdaper 代替。

要想使用 RequestMappingHandlerMapping 和 RequestMappingHandlerAdaper 。在springmvc的配置文件中必須添加

<context:component-scan base-package="com.pptv.controller"/>
<mvc:annotation-driven/>

這兩個配置,第一個是告訴spring,要註冊@Controller、@Component, @Service, @Repository等等這些類

第二個配置,是告訴springmvc,要用註解驅動。這個配置其實就是註冊了一些類,最重要的兩個就是

RequestMappingHandlerMapping 和 RequestMappingHandlerAdaper (3.0版本以後,以前是Annotation...)

相關文章
相關標籤/搜索