HandlerMapping解析

  • Spingmvc中的HandlerMapping负责解析请求URL,对应到Handler进行处理(这里的Handler一般为Controller里的一个方法method,也可以为servlet或者Controller等)

来看一个http请求的入口DispatcherServlet:

 

 

  • DispatcherServlet继承FrameworkServlet,FrameworkServlet继承HttpServletBean,HttpServletBean继承HttpServlet。

可以看出,springmvc的DispatcherServlet是在Servelt的基础上做了扩展处理。

doService方法为servlet处理请求的入口,DispatcherServlet中做了方法覆盖,doService方法中的doDispatch(request,response)方法,是springmvc处理整个请求流程的关键。

  • mappedHandler =getHandler(processedRequest);
  • 这行代码实现了为请求寻找处理handler,返回的是HandlerExecutionChain;
  • HandlerAdapter ha =getHandlerAdapter(mappedHandler.getHandler());
  • 找到处理handler后,再去找匹配的HandlerAdapter,HandlerAdapter将完成后续处理。

继续看是如何找到请求对应的处理handler的:

  • 可以看出是从类变量this.handlerMappings中循环获取,当找到与之匹配的HandlerMapping时,返回类型为HandlerExecutionChain的handler。

这里this.handlerMappings中的值是从哪获取的呢?DispatcherServlet初始化的时候会给this.handlerMappings赋值:

  • 从这里可以看出,在servlet初始化的时候,会对springmvc的HandlerMappings、HandlerAdapters等做初始化。
  • 这里三个步骤,先对springmvc.xml里配置的HandlerMapping进行初始化、实例化,再对this.handlerMappings赋值,最后对this.handlerMappings进行排序。
  • 这里的排序就是对HandlerMapping的order属性进行排序,这样,order属性值小的,就可以先对请求进行匹配。
  • 从tomcat启动日志里可以看到HandlerMapping的初始化:

 
这里涉及到两个HandlerMapping:

  • 第一个是BeanNameUrlHandlerMapping,初始化时会将urlpath做映射存储;
  • 第二个是RequestMappingHandlerMapping,初始化时会将Controller中配置@RequestMapping注解的方法做映射存储。

HandlerMapping初始化时,会将映射与handler存储到map里;处理请求时,从map里取出对应的处理handler。

这就是HandlerMapping在springmvc里的大致处理流程。

  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值