Struts1 時代靠 DispatchAction/MappingDispatchAction 實現一個 Action 類包含多業務方法。Struts2 通過通配符機制提供更強大、更靈活的動態映射能力。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="struts2" extends="struts-default">
<!-- 關鍵配置:三個屬性均支援通配符 -->
<action name="*Action_*" class="ssh.org.web.{1}Action" method="{2}">
<result name="success">/user/success.jsp</result>
<result name="input">/user/user.jsp</result>
</action>
</package>
</struts>
| URL 示例 | 匹配模式 | {1} 值 | {2} 值 | 實際調用 |
|---|---|---|---|---|
/UserAction_addUser.action | *Action_* | User | addUser | ssh.org.web.UserAction.addUser() |
/OrderAction_create.action | *Action_* | Order | create | ssh.org.web.OrderAction.create() |
/ProductAction_list.action | *Action_* | Product | list | ssh.org.web.ProductAction.list() |
關鍵點:
name 屬性的通配符 * 按順序捕獲分組class、method 中用 {1}、{2}... 反向引用分組User ≠ userpackage ssh.org.web;
public class UserAction extends ActionSupport {
private String username;
private int age;
private Date birthday;
private List<String> aihao;
public String addUser() { /* 添加邏輯 */ return SUCCESS; }
public void validateAddUser() { // 方法級驗證:validate + 方法名首字母大寫
if (username == null || username.isEmpty()) {
addFieldError("username", "用戶名不能為空");
}
}
public String getUserList() { /* 查詢邏輯 */ return SUCCESS; }
public void validateGetUserList() { /* 驗證邏輯 */ }
// getter/setter 省略
}
<action name="page_*" class="ssh.org.web.HrefAction">
<result name="success">{1}.jsp</result> <!-- page_home.action → home.jsp -->
</action>
當多個
<action>的通配符模式均能匹配同一 URL 時,按 struts.xml 文件中聲明順序從上到下,第一個匹配成功的生效。
最佳實踐:將具體路徑(無通配符)配置在通配符配置之前,確保精確匹配優先。
| 特性 | 通配符映射 | 多 Action 映射 | 驚嘆號語法 |
|---|---|---|---|
| 配置行數 | 1 行覆蓋 N 個方法 | N 行(每方法一行) | 0 額外行(零配置) |
| URL 風格 | /UserAction_addUser | /addUser | /user!addUser |
| REST 語義 | 好(資源_動作) | 好 | 一般 |
| 安全控制 | 模式限制 | 顯式聲明 | 需額外白名單 |
Struts2 通配符映射是實現「一個 Action 類承載多業務方法」的首選方案:
資源_動作 模式)validateXxx())掌握 {1}、{2} 分組引用與優先級規則,即可構建清晰、可維護的 Struts2 動態調用體系。