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