`
wangzhen5
  • 浏览: 80766 次
  • 性别: Icon_minigender_1
  • 来自: 河南省
社区版块
存档分类
最新评论

Spring MVC 中的 MultiActionController 用法详解 (转载)

阅读更多
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 鲜为人知的缘由了。

分享到:
评论

相关推荐

    Spring MVC框架 多动作控制器详解 spring mvc 2.5

    本代码使用了Spring MVC框架(spring2.5架包) 演示了(Controller接口的试用方法)和 MultiActionController多动作控制器 数据库连接试用Spring JDBC 并且着重介绍了MultiActionController多动作控制器的两种方法名...

    Spring MVC

    ### Spring MVC 框架详解 #### 一、Spring MVC 概述 Spring MVC 是 Spring 框架中的一部分,主要用于构建基于 Java 的 Web 应用程序。它遵循 MVC(Model-View-Controller)设计模式,能够清晰地将业务逻辑、用户...

    spring mvc

    【Spring MVC注解详解】 Spring MVC 是 Spring 框架的一部分,主要负责处理 Web 应用中的请求和响应。在 Spring 2.5 版本之后,Spring MVC 引入了注解驱动的功能,极大地简化了控制器(Controller)的配置和使用。...

    毕设 外文文献翻译--Spring的web-MVC-构架模式

    ### Spring的Web MVC架构模式详解 #### 一、Spring架构简介及特点 Spring是一个轻量级的开源Java应用框架,最初由Rod Johnson创建,并由Juergen Hoeller等人继续开发和完善。Spring框架的设计目的是简化企业级应用...

    SpringMVC - MultiActionController

    创建一个MultiActionController需要继承`org.springframework.web.servlet.mvc.MultiActionController`基类。然后,你可以定义多个处理方法,每个方法对应一个特定的请求。例如: ```java public class Test...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant...

    Spring-Reference_zh_CN(Spring中文参考手册)

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant...

    Spring中文帮助文档

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    spring 技术手册

    ### Spring技术手册知识点详解 #### 一、Spring简介 Spring是一个轻量级的Java应用框架,主要用于构建企业级应用程序。它的核心是一个实现了控制反转(IoC)模式的容器,能够帮助开发者更好地管理对象间的依赖关系...

    Spring 2.0 开发参考手册

    6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. ...

    spring chm文档

    6.8.4. 在Spring应用中使用AspectJ Load-time weaving(LTW) 6.9. 其它资源 7. Spring AOP APIs 7.1. 简介 7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant...

    Spring API

    6.8.1. 在Spring中使用AspectJ进行domain object的依赖注入 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来配置AspectJ的切面 6.8.4. 在Spring应用中使用AspectJ加载时织入(LTW) 6.9. 更多资源 7...

    Spring入门

    - **示例**:在Controller方法中创建一个ModelAndView对象,设置视图名称和模型数据。 #### Spring MVC框架类图与顺序图 - **类图**:展示了Spring MVC框架中各个组件之间的类层次关系。 - **顺序图**:描绘了...

    Spring培训资料

    ### Spring培训资料知识点详解 #### 一、Spring框架概览 **1.1 Spring框架简介** Spring是一个开源的Java平台框架,它提供了全面的基础架构支持,使得开发者可以轻松地构建可伸缩的企业级应用程序。Spring的主要...

    spring与struts的整合

    - **MultiActionController**:在Struts中,一个Action可以对应多个处理方法。这里通过`DispatchController`实现了一个多方法控制器,并通过`ParameterMethodNameResolver`解析请求参数来确定调用哪个方法。例如,...

    springmvc注解详解

    Controller 类,添加了@Controller 注解的类就可以担任控制器(Action)的职责,不使用注解,定义 SpringMVC 的控制类,则要继承 Spring 的 Controller 接口,如:MultiActionController 等。使用@Controller 注解...

    (完整word版)SSM英文文献翻译.docx

    【SSM框架详解】 SSM框架,全称为Spring、SpringMVC和MyBatis的集成框架,是Java Web开发中的主流框架组合。本篇文档主要介绍了Spring框架的特性以及其Web MVC模块的设计理念。 首先,Spring框架是一个通用的轻量...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    6.3 Log4j的使用方法 6.3.1 配置Log4j 6.3.2 配置根Logger 6.3.3 指定日志输出位置 6.3.4 指定日志输出格式 6.3.5 指定日志输出优先级 6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant...

Global site tag (gtag.js) - Google Analytics