springmvc中非常重要的两个接口HandlerMapping和HandlerAdapter,第一个用来通过url找到对应的处理类,第二个用来执行和url对应的方法。

这两个接口的实现类可以自己编写并通过配置文件加载,如果不编写的话构架提供了几个默认的实现类,具体在DispatcherServlet.properties定义了有哪些默认的类。如果编写的话,就不会加载这些默认的类。

对于HandlerMapping,系统默认会注册多个实现类,然后根据request去匹配,找到合适的进而找到和url对应的处理类handler

对于HandlerAdapter,与HandlerMapping类似,系统也会默认会注册多个实现类,然后根据handler的类型进行匹配,找到合适的adapter,然后调用handle方法。这里用到了适配器模式,就是为了各种handler的实现不同,然后通过找到对应的适配器,调用统一的handler方法handle。

默认:

实现了HttpRequestHandler的controller使用HttpRequestHandlerAdapter 

实现了Controller的controller使用SimpleControllerHandlerAdapter

自定义的controller使用RequestMappingHandlerAdapter


HandlerMapping这个接口可以自己实现,主要就是维护好request中url与对应处理类的关系,当request到来时可以根据这个对应关系找到相应的处理类,然后再与相应的拦截器组成HandlerExecutionChain对象即可。举例来说,DispatcherServlet.properties提供了两个默认的HandlerMapping(BeanNameUrlHandlerMapping和RequestMappingHandlerMapping)

对于BeanNameUrlHandlerMapping,它需要配置文件来记录url与处理类的对应关系,例如:

springmvc HandlerMapping HandlerAdapter_Mapping

这里url的名字会与Bean的id或name匹配,进而找到处理类,这些处理类要实现HttpRequestHandler接口。这个与struts1 非常类似,struts1也是利用配置文件,配置文件也是类似下面:

springmvc HandlerMapping HandlerAdapter_springmvc_02

这里是用path属性与url匹配。

对于RequestMappingHandlerMapping,它是通过注解@RequestMapping来记录url与对应处理类的关系,这个@RequestMapping非常灵活,可见另一篇博客