spring学习笔记之handler mapping源码解读


spring学习笔记之handler mapping源码解读


   用 handler mapping 可以映射请求到合适的 handler ,比如用 SimpleUrlHandlerMapping 或者 BeanNameUrlHandlerMapping 。首先我们来看 handler mapping 这个概念。

   最基本的 HandlerMapping 提供的功能是 HandlerExecutionchain 的传递,必须包括请求匹配的处理器,也可能包括一系列应用于这个请求的的拦截器。当请求发生时, DispatcherServlet 将请求递交给 hangler mapping, 让其检测请求并提出一个合适的 HandlerExecutionChain.DispatcherServlet 将执行该处理器和拦截器。

   Handler mappings 对拦截器的配置是可选的,包括前,后执行或者前后都执行,功能很强大。很多已经支持的功能可以在 HandlerMappings 配置中定制。选择一个处理器的 handler mapping 定制不仅基于请求的 URL ,而且基于请求相关的 session 的状态。

所有 handler mapping 类都要继承 AbstractHandlerMapping 。下面是共有的属性。

Interceptors: 拦截器

defaultHandler: 默认的处理器,当没有匹配的处理器时使用。

Order: 基于 order 属性的值。

   BeanNameUrlHandlerMapping 简单而强大,根据定义在 web 应用环境的 bean 的名字映射 http 请求。比如说我们要让一名用户增加一帐号,我们已经提供了合适的表单控制器, jsp 或者 velocity 视图渲染表单。

如果使用 BeanNameUrlHandlerMapping, 请求 http://samples.com/editaccoutn.form. 配置如下: <beans>



所有请求的 url editaccount.form 都会被 SimpleFormController 处理。当然在 web.xml 也要作如下的配置。


需要注意的是,你想用 BeanNameUrlHandlerMapping 是,并不需要定义。如果没有定义处理类,则 DispatcherServlet 默认创建它。

SimpleUrlHandlerMapping 功能更强大。下面是例子


上面例子表示以 .form 或者 .html 结尾的请求都会被下面的处理器处理。



上面配置的意思很容易看明白的。


我们也可以用 HandlerInterceptor 拦截请求。拦截器必须实现 HandlerInterceptor 接口。这个接口定义了三个方法。见代码:

上面三个方面分别负责预处理,后置处理和请求完成后的处理。下面是例子:




我们看到,拦截器类是继承了 HandlerInterceptorAdapter ,而 HandlerInterceptorAdapter 基本实现了 HandlerInterceptor 接口,接下来就是我们根据需要改写上面的三个某些方法了,而不需要全部实现。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring MVC 和 Struts 都是基于MVC架构的Web框架,但是它们的实现方式有所不同。在 Struts 中,使用 action 来处理请求,而在 Spring MVC 中则使用 handler mapping。 在 Spring MVC 中,handler mapping 是一个重要的组件,用于将请求映射到相应的处理程序。Handler mapping 可以根据请求的 URL、参数、请求头等信息来确定应该调用哪个处理程序来处理请求。 在处理 Struts action 时,可以通过自定义一个 HandlerMapping 来将 Struts action 映射到 Spring MVC 的处理程序中。具体实现方法如下: 1. 创建一个自定义的 HandlerMapping 类,并实现 SpringHandlerMapping 接口。 2. 在自定义的 HandlerMapping 类中,重写 determineHandler 方法,根据请求中的 action 名称来确定应该调用哪个 Spring MVC 的处理程序。 3. 将自定义的 HandlerMapping 配置到 Spring MVC 的配置文件中。 示例代码如下: ```java public class StrutsActionHandlerMapping implements HandlerMapping { @Override public Object getHandler(HttpServletRequest request) throws Exception { String actionName = request.getParameter("action"); if ("login".equals(actionName)) { return new LoginController(); } else if ("register".equals(actionName)) { return new RegisterController(); } return null; } } ``` 在配置文件中,需要将自定义的 HandlerMapping 添加到 Spring MVC 的处理程序映射器中: ```xml <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="order" value="0" /> <property name="interceptors"> <list> <ref bean="localeChangeInterceptor" /> </list> </property> </bean> <bean id="strutsActionHandlerMapping" class="com.example.StrutsActionHandlerMapping" /> <bean id="loginController" class="com.example.LoginController" /> <bean id="registerController" class="com.example.RegisterController" /> <bean name="/index.jsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` 在上面的配置中,首先配置了一个默认的 BeanNameUrlHandlerMapping,然后将自定义的 StrutsActionHandlerMapping 添加到处理程序映射器中。同时,还配置了 LoginController 和 RegisterController 的 Bean。最后,配置了一个视图解析器,用于解析 JSP 视图。 这样,当请求的 action 为 login 时,就会调用 LoginController 进行处理;当请求的 action 为 register 时,就会调用 RegisterController 进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值