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

相关文章
相关标签/搜索