SPRING MVC 中的 MULTIACTIONCONTROLLER 用法详解 (转载)

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了。在单个的基础上,再新加两三个叫做丰富,再多就未必是好事,反而会令人缩手新闻片脚,无从定夺。
多数 Controller 都是只完成一个任务,不过也有一个像 Struts 的 DispatchAction 的那样的 Conntroller,
org.springframework.web.servlet.mvc.multiaction.MultiActionController,意即在一个 Controller 中处理多个动作,
如同一个业务的增、删、改可以放在一起了。不至于增、删、改各自为政,造成代码混乱、重复难以维护。

 本文中的 web.xml 的 org.springframework.web.servlet.DispatcherServlet 所处理的 url-pattern 是 *.html,
 如何搭建 Spring MVC 项目不细加说明,可参考我前面同系列的文章。

例如,下面的 UserController,有两个签名一样的 updateUser() 和 deleteUser() 方法

public class UserController extends MultiActionController { 
  public ModelAndView updateUser(HttpServletRequest request, 
      HttpServletResponse response) { 
    System.out.println("updateUser");//方便于跟踪执行了哪个方法 
    return new ModelAndView("userList","from","updateUser"); 
  } 
  public ModelAndView deleteUser(HttpServletRequest request, 
      HttpServletResponse response) { 
    System.out.println("deleteUser");//方便于跟踪执行了哪个方法 
    return new ModelAndView("userList","from","deleteUser"); 
  } 
} 

用过 Struts 的 DispatchAction 的都知道,是通过 http://.../userAction.do?method=updateUser 的方式来指定执行哪个方法。
那 Spring MVC中是如何定位到所需方法上呢?

  Spring MVC 除了有一个叫做 HandlerMapping(把 URL 解析到 Controller) 的东西,还要把操作进一步解析到方法名上,
即要找到的 Controller 上的哪个方法并执行之。缺省的方法名解析器是 InternalPathMethodNameResolver,它根据 URL 样式解析方法名。

  在缺省的 BeanNameUrlHandlerMapping 和缺省的 InternalPathMethodNameResolver 协调之下,Bean 上下文可以这样配置:

<bean name="/updateUser.html" class="com.unmi.UserController"/> 
<bean name="/deleteUser.html" class="com.unmi.UserController"/> 

  这样分别通过下面的 URL 就能执行到正确的方法上去了:

  http://.../updateUser.html -- 将被 UserController.updateUser() 处理

  http://.../deleteUser.html  --  将被 UserController.deleteUser() 处理

  但是,你应该注意到了,上面的 com.unmi.UserController 配置了两次,一来碍眼、二来原来只要 Singleton 的 UserController 实例不再是那么回事了。
所以要引入 SimpleUrlHandlerMapping 对 Bean 配置进一步紧凑一下:

<bean id="userController" class="com.unmi.UserController"/> 
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">userController</prop> 
      <prop key="/deleteUser.html">userController</prop> 
    </props> 
  </property> 
</bean> 


说是紧凑,倒不如说 Bean 配置复杂了,反正不用配置两个相同的 UserController 实例了。还是通过上面那两个 URL 来访问执行到相应的方法。

  除了缺省的方法名解析器 InternalPathMethodNameResolver(注意了,Spring 中缺省的 XXX 很多用 InternalXXX 的命名),还有两种其他类型的方法名解析器:

  ·ParameterMethodNameResolver -- 根据请求中的参数解析执行方法名,相当于 Struts 的 DispathAction

  ·PropertiesMethodNameResolver -- 根据查询一个 key/value 列表解析执行方法名,相当于 Struts 的 MappingDispatchAction(用得很少)

  下面逐一介绍使用上面两种方法名解析器时的 Bean 配置及相应访问的 URL。

 使用 ParameterMethodNameResolver 时的 Bean 配置(为简单起见,又用回了缺省的 HandlerMapping):

<bean name="/user.html" class="com.unmi.UserController">
 <property name="methodNameResolver">
 <ref bean="methodNameResolver"/>
 </property>
</bean>
<bean name="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
 <property name="paramName">
 <value>method</value>
 </property>
</bean>
这时候分别用下面的 URL 就能访问到相应的方法

  http://.../user.html?method=updateUser -- 将被 UserController.updateUser() 处理

  http://.../user.html?method=deleteUser -- 将被 UserController.deleteUser() 处理

 通过参数的方式使得 HTML 表单表现用户选择成为可能,例如把 method 参数可放在一个下拉框或隐藏域中。

  使用 PropertiesMethodNameResolver 时的 Bean 配置

<bean id="userController" class="com.unmi.UserController" /> 
<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">userController</prop> 
      <prop key="/deleteUser.html">userController</prop> 
    </props> 
  </property> 
</bean> 
<bean id="methodNameResolver"  class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> 
  <property name="mappings"> 
    <props> 
      <prop key="/updateUser.html">updateUser</prop> 
      <prop key="/deleteUser.html">deleteUser</prop> 
    </props> 
  </property> 
</bean> 

 这种配置有点复杂,PropertiesMethodNameResolver 不仅与 SimpleUrlHandlerMapping 相仿又有重叠,而且必须把 SimpleUrlHandlerMapping 拉进来,
 无法使用默认的 HandlerMapping。从上面的配置我们可以明显的看出 HandlerMapping 和 MethodNameResolver 不同职责了,一个是定位 Controller,
 一个是定位 Method。

  这时候分别用下面的 URL 来访问到相应 Controller 的方法

  http://.../updateUser.html -- 将被 UserController.updateUser() 处理

  http://.../deleteUser.html  --  将被 UserController.deleteUser() 处理

  这里的 URL 恰巧和使用 InternalPathMethodNameResolver 时是一样的,但一定要理解其实他们的机制是一样的。

  PropertiesMethodNameResolver 把事性搞这么复杂,被誉为最复杂的方法名解析器。可我还真看不出它还有什么独到之处,或值得一用的理由,
同时也不难理解 Struts 的 MappingDispatchAction 鲜为人知的缘由了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值