解决大型项目中 Action 命名冲突、配置文件臃肿、结果跳转多样化、公共错误页面复用等实战问题。
默认 namespace="/" 下无法区分同名 <action name="add">。方案:按业务模块划分 namespace。
<package name="user" namespace="/user" extends="struts-default">
<action name="add" class="action.UserAction" method="add">
<result>addUser.jsp</result>
</action>
</package>
<package name="house" namespace="/house" extends="struts-default">
<action name="add" class="action.HouseAction" method="add">
<result>addHouse.jsp</result>
</action>
</package>
访问路径:/user/add、/house/add,互不干扰。
<!-- struts.xml --> <struts> <include file="struts-user.xml"/> <include file="struts-house.xml"/> </struts>
<!-- struts-user.xml -->
<struts>
<package name="user" namespace="/user" extends="struts-default">
<action name="add" class="action.UserAction" method="add">
<result>addUser.jsp</result>
</action>
</package>
</struts>
每个模块独立维护,主文件仅聚合,降低合并冲突。
| 常量 | 含义 | |
|---|---|---|
| SUCCESS | 执行成功,展示视图 | |
| NONE | 成功但无视图(如 AJAX) | |
| ERROR | 执行失败,展示错误页 | |
| INPUT | 校验失败,返回输入页 | |
| LOGIN | 未登录,跳转登录页 |
| type | 行为 | 典型场景 |
|---|---|---|
| dispatcher | 请求转发(默认) | JSP 渲染 |
| redirect | 重定向 | POST 后跳转、跨应用 |
| redirectAction | 重定向到另一 Action | 动态决定目标 Action |
| chain | Action 链式调用 | 共享 ActionContext |
| json | 返回 JSON | REST API |
场景:登录成功,管理员跳后台,普通用户跳首页。
public class DynamicAction extends ActionSupport {
private String nextDispatch; // 动态目标 Action 名
// getter/setter
public String login() {
if ("common".equals(user.getPassword())) nextDispatch = "common";
else if ("admin".equals(user.getUsername())) nextDispatch = "admin";
else return INPUT;
return SUCCESS;
}
}
<action name="login" class="action.DynamicAction" method="login">
<result name="success" type="redirectAction">${nextDispatch}</result>
</action>
<action name="common" class="action.CommonAction">
<result>common.jsp</result>
</action>
<action name="admin" class="action.AdminAction">
<result>admin.jsp</result>
</action>
利用 OGNL 表达式 ${nextDispatch} 取值,配合 redirectAction 实现动态分发。
<package name="user" namespace="/user" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="add" ...> ... </action>
</package>
包内所有 Action 返回 error 均跳转 /error.jsp,无需逐个配置。