SpringMVC 如何根据url获取到执行的方法

更多博客内容访问[火龙蛋博客],点击[火龙蛋博客]


Spring MVC请求处理架构图:

![](https://img-blog.csdn.net/20170410163040493?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg0NjgxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  

      1、DispatchServlet:Spring MVC的核心控制器,作为SpringMVC请求处理以及请求返回的统一入口,进行全局的流程控制。

        2、HandlerMapping:处理映射器,根据请求的url映射到对应的处理器(Controller)的某个处理方法上,映射成功后返回一个HandlerExecutionChain对象(处理器执行链),其中包括处理器(Controller)以及拦截器。

常用的HandlerMapping实现类:

a、BeanNameUrlHandlerMapping:根据url和Bean的name进行映射找到处理器对象Controller,Bean的name属性定义是已“/"开头,如:

 <bean name="/user/login.do" class="com.spring.web.controller.LoginController"/>

  通常Controller要实现Controller接口,实现要处理请求的方法handleRequest,与SimpleControllerHandlerAdapter联合使用。

b、SimpleUrlHandlerMapping:和BeanNameUrlHandlerMapping一样根据url和bean的name进行映射,但是功能更强大。

c、DefaultAnnotationHandlerMapping:spring3.1之前spring2.5后使用,用于根据注解@Controller和@RequestMapping和url进行映射找到对应的处理器Controller和处理方法

d、RequestMappingHandlerMapping:spring3.1后使用,也是根据注解@Controller和@RequestMapping和url进行映射匹配对象的处理器Controller和处理方法。

注意:HandlerMapping接口定义一个方法:

  HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;

由具体的HandlerMapping实现类来实现,其中定义了映射规则,根据映射规则找到合适的处理器对象和指定方法,最终返回一个HandlerExecutionChain 对象。

                DispatchServlet接收到请求后,会根据顺序遍历Spring容器中的HandlerMapping对象(可以注册多个HandlerMapping处理器映射器对象),根据每个HandlerMapping对象的映射规则找到对应的处理器Controller和处理方法,如当遍历到RequestMappingHandlerMapping对象时,RequestMapping HandlerMapping对象会遍历容器中的所有使用了@Controller注解的bean,在根据@RequestMapping注解和url进行匹配,找到对应的Controller对象和处理方法。当找到合适的Controller和处理方法后,则停止遍历HandlerMapping对象。

                DispatchServlet请求处理方法doDispatch()方法中实现:

![](https://img-blog.csdn.net/20170410163158041?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg0NjgxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)              

                 getHandler()方法实现,就是遍历所有HandlerMapping对象,进行处理器映射:

![](https://img-blog.csdn.net/20170410163232019?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg0NjgxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  

3、HandlerAdapter:处理器适配器,使用了适配器模式,将处理器映射器找到的处理器对象和处理方法适配成DispatchServlet所需要的请求处理方法(目标接口),这样DispatchServlet调用统一的请求处理接口完成请求处理,处理器适配器HandlerAdapter的功能就是将我们自定义的前端控制器Controller适配成DispatchServlet需要的接口。

 根据Spring MVC实现前端控制器的方式不同,则对应的适配器要不同,常见的HandlerAdapter有:

      a、SimpleControllerHandlerAdapter:要求Controller控制器实现Controller接口,以及实现接口中的方法handleRequest()方法来处理请求,通常和处理映射器BeanNameUrlHandlerMapping或者SimpleUrlHandlerMapping联合使用。

   b、DefaultAnnotationHandlerAdapter:适配使用注解@Controller和@RequestMapping标识的处理器,spring3.1之前spring2.5后使用,和DefaultAnnotationHandlerMapping联合使用。

     c、RequestMappingHandlerAdapter:适配使用注解@Controller和@RequestMapping标识的处理器,spring3.1后使用,替换了DefaultAnnotationHandlerAdapter,和RequestMappingHandler Mapping联合使用。

**注意:handlerAdapter接口中定义了几个方法,有具体处理器适配器来实现:**

boolean supports(Object handler);

判断该适配器能否支持适配当前的处理器handler

ModelAndView handle(HttpServletRequest request,HttpServletResponse  response, Object handler) throws Exception;

 DispatchServlet处理请求所需要的目标接口,在其方法实现中完成适配,来处理及准备ch处理器方法中的参数及Annotation,最后调用处理器的指定方法.

DispatchServlet遍历HandlerMapping获取HandlerExecutionChain对象后,遍历spring容器中的所有HandlerAdapter对象,查看当前处理器适配器对象是否能够支持适配找到的处理器对象Controller,能则调用适配器的接口handle()方法处理请求,处理前有拦截器的先执行拦截处理

 DispatchServlet请求处理方法doDispatch()方法中实现:

![](https://img-blog.csdn.net/20170410163259025?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg0NjgxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)

 getHandlerAdapter()方法实现:

![](https://img-blog.csdn.net/20170410163322332?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTg0NjgxOA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)  

        4、ViewResolver:视图解析器,请求处理完后,DispatchServlet会受到请求处理结果(包括模型数据和逻辑视图),DispatchServlet会找到Spring容器中的ViewResolver对象将逻辑视图解析成物理页面文件。注意对于使用了@ResponseBody注解的方法,DispatchServlet会使用合适的消息转换器将请求处理结果转换后返回给前台。

         5、DispatchServlet找到物理视图文件后,DispatchServlet使用视图模板引擎将模型数据渲染到物理视图页面中,最后DispatchServlet将渲染后的页面返回给前台,请求结束。

  

  

  

  

参考文档:

[http://www.cnblogs.com/dreamworlds/p/5396209.html](http://www.cnblogs.com/dreamworlds/p/5396209.html)

[http://starscream.iteye.com/blog/1062667](http://starscream.iteye.com/blog/1062667)

[http://sishuok.com/forum/blogPost/list/0/6117.html](http://sishuok.com/forum/blogPost/list/0/6117.html)

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值