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...)