Struts1迁移至Struts2.5:同Action名按method参数路由实现
你遇到的问题核心原因很明确:在Struts2的配置中,同名的<action>节点会被后续定义的覆盖——你写了两个name="menumanager"的action,最终生效的是第二个指定method="deleteuser"的配置,所以不管你传什么method参数,都会执行deleteuser方法。
其实Struts2原生就支持类似Struts1 DispatcherAction的逻辑,只需要调整配置方式就行,下面给你两种最贴合原有使用习惯的方案:
方案1:使用默认的method参数匹配(最推荐)
只需要定义一个menumanager action,不要指定method属性,Struts2会自动从请求参数中读取method的值,调用Action类中对应的方法。
配置示例(struts.xml)
<action name="menumanager" class="X.Action"> <result name="login">Some JSP</result> <result name="logout">Some JSP</result> <!-- 其他方法对应的result可以按需添加 --> </action>
对应的Action类示例
你的Action类需要包含adduser()和deleteuser()两个公共方法,返回值为String(对应配置中的result name):
public class XAction extends ActionSupport { public String adduser() { // 处理添加用户的业务逻辑 return "login"; // 对应配置里的<result name="login"> } public String deleteuser() { // 处理删除用户的业务逻辑 return "logout"; // 对应配置里的<result name="logout"> } }
这样访问../menumanager.do?method=adduser就会触发adduser()方法,访问../menumanager.do?method=deleteuser就会触发deleteuser()方法,和你在Struts1中的使用逻辑完全一致。
方案2:开启动态方法调用(DMI,可选)
Struts2.5默认关闭了动态方法调用(出于安全考虑),如果需要更灵活的调用方式(比如支持../menumanager!adduser.do这种URL格式),可以在struts.xml中开启:
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
开启后,方案1中的?method=xxx方式依然有效,同时还能通过actionName!methodName.do的格式直接调用方法。
注意事项
- Struts2的Action方法必须是public修饰、无参数、返回String类型,这是框架的规范要求。
- 建议Action类继承
ActionSupport,它提供了很多通用的工具方法和默认实现,能减少重复代码。 - 如果遇到方法找不到的错误,可以开启开发模式查看详细日志:
<constant name="struts.devMode" value="true" />
内容的提问来源于stack exchange,提问作者user3842475

