文章目录
1. 什么是HandlerMapping
Spring MVC的Control主要由HandlerMapping和HandlerAdapter两个组件提供。HandlerMapping负责映射用户的URL和对应的处理类。
2. 常用的HandlerMapping
Spring MVC提供了许多HandlerMapping的实现,默认使用的是BeanNameUrlHandlerMapping,可以根据Bean的name属性映射到URL中。
默认值可能会变化,具体参考《SpringMVC 默认配置 DispatcherServlet.properties(5.0.4.RELEASE) 文件》
同时,我们可以为DispatcherServlet提供多个HandlerMapping供其使用。DispatcherServlet在选用HandlerMapping的过程中,将根据我们指定的一系列HandlerMapping的优先级进行排序,然后优先使用优先级
高的HandlerMapping。
HandlerMapping类相关的结构图:
从上图得知,Spring MVC提供了一个HandlerMapping接口的抽象类AbstractHandlerMapping,而AbstractHandlerMapping同时还实现了Ordered接口,可以让HandlerMapping通过设置setOrder()方法提高优先级。
2.1 BeanNameUrlHandlerMapping
使用BeanNameUriHandlerMapping进行Web请求到具体Handler的映射管理,需要我们保证视图
模板中的请求路径,必须与容器中对应的Handler的beanName一致,如图24-1所示。
也就是说,BeanNameUrlHandlerMapping只做了一个传话人,并没有对请求路径与Handler之间的映射做太多的关注(有点儿不动脑子的意思)。
从好的方面说,遵循Convention Over Configuration的理念可以减少配置量,提高开发效率。从坏的方面说,BeanNameUrlHandlerMapping强制我们的Handler的bean定义名称,必须去匹配视图中的链接路径。如果表现层和Web层分别由不同的人员开发,并且人员之间没有合适的交流渠道,那么就有些令双方人员勉为其难了。
2.2 SimpleUrlHandlerMapping
SimpleUrlHandlerMapping比BeanNameUrlHandlerMapping做的工作要多一些,可以说尽到了自己作为中间人的那份职责。它允许视图一方和handler一方自由活动,只不过最后由SimpleUrlHandlerMapping进行"统筹”。
SimpleUrlHandlerMapping中增加一层映射,更灵活:
<beans>
<bean id="handlerMapping"
class="org.springframework.Web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--增加一层映射,更灵活-->
<prop keys="ttmRateLlst.do">ttxnRateListController</prop>
</props>
</property>
</bean>
<bean name="ttmRateListController" class="..TTWRateListController">
<property name="ttmRateService" ref="tcmRateService"></property>
<property name="viewName" value="ttmRateList"></property>
</bean>
<bean id="viewResolver"
class="org.springframework.Web.servlet.view.intemalResourceViewResolver">
<property name="prefix" value="/WEB-INF/j sp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
现在,TTMRateListController可以起任何名字,视图中的链接也可以独立提供,只需要通过
SimpleUrlHandlerMapping明确指定一下二者的对应关系就行。SimpleUrlHandlerMapping不对二者做任何限制,如图24-2所示:
使用SimpleUrlHandlerMapping的另一个好处就是,我们可以使用类似于ANT路径形式的模式匹配,这样我们就可以通过各种表达式,将一组或者多组拥有某种相似特征的Web处理请求映射给相应的Handler处理,类似于代码清单24-2所示的样子:
<bean id="handlerMapping"
class="org.springframework.Web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
ttmRateList.do=ttmRateListController
/**/*list.do=genericListingController
/user*.do=userManagerController
/module/*.do=ModuleInOneController
</value>
</property>
</bean>
当然,说了这些不是说SimpleUrlHandlerMapping要比BeanNameUrlHandlerMapping有多好。
我们更注重的是,在开发的过程中,可以根据情况,灵活地选用相应的HandlerMapping来使用。
2.3 DefaultAnnotationHandlerMapping和RequestMappingHandlerMapping
spring2.5后:
需要通过处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter来开启支持@Controller 和 @RequestMapping注解的处理器。
Spring3.1使用:
新的HandlerMapping 和 HandlerAdapter来支持@Contoller和@RequestMapping注解处理器。
新的@Contoller和@RequestMapping注解支持类:处理器映射RequestMappingHandlerMapping 和 处理器适配器RequestMappingHandlerAdapter组合来代替Spring2.5开始的处理器映射DefaultAnnotationHandlerMapping和处理器适配器AnnotationMethodHandlerAdapter,提供更多的扩展点。
在spring mvc 3.1中,对应变更为 :
DefaultAnnotationHandlerMapping -> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter -> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver
2.4 总结
以上都在使用了annotation-driven
后自动注册。
而且对应分别提供了AbstractHandlerMethodMapping , AbstractHandlerMethodAdapter和 AbstractHandlerMethodExceptionResolver以便于让用户更方便的实现自定义的实现类