【spring mvc】handlerMapping接口和实现类

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以便于让用户更方便的实现自定义的实现类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值