Struts 1.2.9升级至2.0.0时DispatchAction无法识别的替代方案咨询
关于Struts 2中DispatchAction的替代方案
没错,DispatchAction确实在Struts 2里被彻底移除了——它是Struts 1架构下的核心组件,而Struts 2从底层架构到请求处理流程都和Struts 1完全不同,所以这个类没有被保留下来。
不过Struts 2提供了更灵活的方式来实现Struts 1中DispatchAction的核心功能(一个Action类处理多个请求方法),下面是几种平滑过渡的方案:
1. 直接配置多方法Action(最常用)
Struts 2不需要你继承特定的基类来实现多方法调用,你只需要在Action类中定义普通的业务方法,然后在配置文件中指定对应的方法名即可:
编写Action类
你可以选择继承ActionSupport(它提供了表单验证、消息国际化等工具方法,推荐使用),或者完全自定义:
public class UserAction extends ActionSupport { // 对应Struts1中DispatchAction的save方法 public String save() { // 处理用户保存逻辑 return SUCCESS; } // 对应Struts1中DispatchAction的update方法 public String update() { // 处理用户更新逻辑 return SUCCESS; } // 对应Struts1中DispatchAction的delete方法 public String delete() { // 处理用户删除逻辑 return SUCCESS; } }
配置struts.xml
为每个方法单独配置Action节点,通过method属性指定要调用的方法:
<package name="user" namespace="/user" extends="struts-default"> <action name="saveUser" class="com.example.UserAction" method="save"> <result name="success">/user/saveSuccess.jsp</result> </action> <action name="updateUser" class="com.example.UserAction" method="update"> <result name="success">/user/updateSuccess.jsp</result> </action> <action name="deleteUser" class="com.example.UserAction" method="delete"> <result name="success">/user/deleteSuccess.jsp</result> </action> </package>
2. 通过请求参数指定方法(接近DispatchAction的用法)
如果你想更贴近Struts1中DispatchAction的使用方式(一个Action URL对应多个方法),可以通过请求参数来动态指定要调用的方法:
简化struts.xml配置
只配置一个Action节点,不指定method属性:
<package name="user" namespace="/user" extends="struts-default"> <action name="userAction" class="com.example.UserAction"> <result name="success">/user/commonSuccess.jsp</result> </action> </package>
调用方式
通过请求参数method来指定要执行的方法,比如:
- 调用save方法:
/user/userAction.action?method=save - 调用update方法:
/user/userAction.action?method=update
另外,你也可以通过Struts2的感叹号语法来调用:/user/userAction!save.action,这种方式默认是开启的,无需额外配置。
平滑过渡的注意事项
- 不要强行照搬Struts1的思路:Struts2的Action是POJO,不需要依赖特定的基类,参数传递是通过Action类的属性注入(OGNL),和Struts1的FormBean差异很大,尽量适应这种新的方式。
- 逐步迁移:先从单个DispatchAction开始,把它拆分成多个方法并配置对应的Action,测试通过后再迁移下一个,避免一次性修改大量代码导致问题。
- 利用ActionSupport的工具方法:如果你的Struts1 Action用到了验证、消息提示等功能,ActionSupport提供了对应的方法(比如
addActionError()、validate()),可以直接复用。
内容的提问来源于stack exchange,提问作者oxyt
相关产品推荐
相关产品推荐

