Struts 2 提供多種動態方法調用方式,其中通配符映射能以單一 Action 配置處理多業務邏輯,大幅減少 struts.xml 冗餘配置。本文詳細解析通配符語法、映射規則與實戰應用。
| 方式 | 配置位置 | 優點 | 缺點 |
|---|---|---|---|
| 表單 action 屬性 | JSP 頁面 | 直觀簡單 | 前端耦合後端方法名 |
| struts.xml method 屬性 | 配置文件 | 集中管理 | 需配置多個 action,冗餘嚴重 |
| 通配符映射 | struts.xml | 單 action 處理多方法,零冗餘 | 需理解映射規則 |
<action name="*" class="action.Action" method="{1}">
<result name="userLogin">WEB-INF/jsp/userLogin.jsp</result>
<result name="userCreate">WEB-INF/jsp/userCreate.jsp</result>
</action>
name="*":匹配任意 action 名稱 (如 Login、Create)method="{1}":{1} 代表第一個 * 匹配的值,即動態決定調用方法Login.action → 匹配 * = "Login" → 調用 Login() 方法Create.action → 匹配 * = "Create" → 調用 Create() 方法<form action="Login" method="post" id="form">
姓名:<input type="text" name="name" /><br>
密碼:<input type="password" name="password" /><br>
<input type="submit" value="登入">
<input type="submit" value="註冊" onclick="$('#form').attr('action','Create')">
</form>
public class Action extends ActionSupport {
private String name;
// getter/setter 省略
public String Login() {
System.out.println("用戶登入");
return "userLogin";
}
public String Create() {
System.out.println("用戶註冊");
return "userCreate";
}
}
<struts>
<package name="myP" extends="struts-default">
<action name="*" class="action.Action" method="{1}">
<result name="userLogin">/WEB-INF/jsp/userLogin.jsp</result>
<result name="userCreate">/WEB-INF/jsp/userCreate.jsp</result>
</action>
</package>
</struts>
| 模式 | 匹配範例 | 應用場景 |
|---|---|---|
*-* | User-Login、Order-Delete | 模組-操作風格,{1}=模組,{2}=操作 |
Book_* | Book_List、Book_Add | 前綴分組,{1}=後綴 |
* (配合 result) | 任意 action | <result>/WEB-INF/jsp/{1}.jsp</result> 直接跳轉同名頁面 |
<action name="*" class="action.{1}Action" method="execute">
<!-- 動態決定 Action 類 -->
</action>
<action name="*-*" class="action.{1}Action" method="{2}">
<!-- 模組-方法雙重動態 -->
</action>
<result name="success">/WEB-INF/jsp/{1}.jsp</result>
<!-- 動態結果頁面 -->
method="!*" 排除危險方法,或使用 AllowedMethods 介面白名單Struts2-REST-Plugin 實現真正 RESTful 映射No result defined for action...:Result 名稱與 Action 返回值不匹配Method not found:Action 類缺少對應方法,或方法非 publicstruts.enable.DynamicMethodInvocation 是否為 true (預設開啟)掌握通配符映射,能讓 Struts 2 配置更精簡、維護性更強,是中大型專案配置優化的關鍵技巧。