Springmvc HandlerAdapter解析_晏无心_新浪博客

springmvc中HanlderMapping和HandlerAdapter一般是对应出现(并不是一一对应,一个HandlerAdapter可以匹配处理多个HandlerMapping,一个HandlerMapping应该也可以被多个HandlerAdapter处理,但具体配置时应该只是一个,配置多个没有意义,只会被order值小的HandlerAdapter处理)。
————————————————————————————————————
华丽的分割线。
对HandlerMapping和HandlerAdapter深入分析后发现,HandlerMapping和HandlerAdapter是解耦的,并不存在对应的关系。
HandlerMapping只关心请求URL与处理的handler如何映射,作用是将请求URL映射到handler上,至于handler如何处理(直接调用执行还是交给HandlerAdapter处理或者是其他方式),并不关心;
HandlerAdapter只关心是否能够匹配上handler的类型,匹配上了之后,就去调用执行handler,至于handler是如何和请求URL映射的,并不关心。
所以,HandlerMapping和HandlerAdapter唯一的关联就是handler,但HandlerMapping和HandlerAdapter之间,不存在任何耦合的地方。
之前的认为HandlerMapping和HandlerAdapter存在对应关系的理解,是错误的。

HandlerMapping将请求映射到对应的handler后,去匹配HandlerAdapter,找到对应的HandlerAdapter将handler交给HandlerAdapter处理:
Springmvc <wbr>HandlerAdapter解析
Springmvc <wbr>HandlerAdapter解析
从类成员变量this.handlerAdapters中循环匹配HandlerAdapter,找到支持handler的HandlerAdapter。
this.handlerAdapters的赋值在DispatcherServlet的初始化的时候:
Springmvc <wbr>HandlerAdapter解析
这里同样对HandlerAdapter的order属性进行了排序,如果配置了多个HandlerAdapter可以支持某一个handler,只会获取order值较小的进行匹配。

再来看看HandlerAdapter的supports()方法,不同的HandlerAdapter的supports()方法实现也不一样,这里来看看其中两种:
RequestMappingHandlerAdapter:
Springmvc <wbr>HandlerAdapter解析

Springmvc <wbr>HandlerAdapter解析
RequestMappingHandlerAdapter主要处理常用的Controller里添加了@RequestMapping注解的方法(这里的一个方法就是一个handler),根据handler的类型是否为HandlerMethod进行匹配;

HttpRequestHandlerAdapter:
Springmvc <wbr>HandlerAdapter解析
HttpRequestHandlerAdapter主要处理普通HttpRequest请求的handler,当springmvc访问静态资源时,HttpRequestHandlerAdapter会直接调用DefaultServletHttpRequestHandler的handleRequest()
方法,将请求交给web容器的DefaultServlet处理。
这里匹配handler类型为HttpRequestHandler的handler。

再回到DispatcherServlet继续往下看,获取到HandlerAdapter后,由HandlerAdapter来执行具体的handler:
Springmvc <wbr>HandlerAdapter解析
spingmvc在这里使用了适配器设计模式。HandlerMapping映射请求到具体的handler后,并没有直接进行调用处理,而是将handler交给了可以支持的HandlerAdapter,由HandlerAdapter来进行具体的调用。这是因为handler的类型有多种,可以是method、controller、servlet等,使用适配器模式可以使DispatcherServlet统一透明的对handler进行处理。

还是来看看其中两个Adapter的handle()方法处理:
RequestMappingHandlerAdapter:
Springmvc <wbr>HandlerAdapter解析

Springmvc <wbr>HandlerAdapter解析
可以看出最终是通过反射来执行Controller里的method。

HttpRequestHandlerAdapter:
Springmvc <wbr>HandlerAdapter解析
这个比较简单,执行handler的handleRequest()方法,常用于对静态资源的访问,将请求交给web容器的DefaultServlet处理。

HandlerAdapter执行完后得到的是一个ModelAndView对象,这个对象将处理将请求结果映射到具体的视图,这个下一篇文章将会接着分析。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值