接上文《動態調用 Action 與 Action 中方法(一)》,本文介紹另外兩種實現「一個 Action 類對應多個業務邏輯入口」的方式。
核心思想:在 struts.xml 中定義多個 <action> 元素,class 指向同一個 Action 類,method 屬性指定不同的業務方法。
<action name="addUser" class="ssh.org.web.UserAction" method="addUser">
<result name="success">/user/success.jsp</result>
<result name="input">/user/user.jsp</result>
</action>
<action name="getUser" class="ssh.org.web.UserAction" method="getUserList">
<result name="success">/user/success.jsp</result>
<result name="input">/user/user.jsp</result>
</action>
package ssh.org.web;
public class UserAction extends ActionSupport {
public String addUser() { /* 添加用戶邏輯 */ return SUCCESS; }
public String getUserList() { /* 查詢用戶列表 */ return SUCCESS; }
// 驗證方法:validateAddUser()、validateGetUserList() 自動關聯
}
https://host/app/addUser.action → 執行 addUser()https://host/app/getUser.action → 執行 getUserList()| 優點 | 缺點 |
|---|---|
| 配置直觀、聲明式、無需通配符解析 | Action 類方法增多時,XML 膨脹、重複配置 class/result |
支援方法級驗證(validateXxx()) |
邏輯 Action 數量 = 物理 Action 數量,不利於大規模維護 |
ActionName!methodName.action核心機制:Struts2 默認的 ActionMapping 解析器識別 ! 分隔符,將 URL 映射為 {actionName} + {methodName}。
<action name="user" class="ssh.org.web.UserAction">
<result name="success">/user/success.jsp</result>
<result name="input">/user/user.jsp</result>
</action>
https://host/app/user!addUser.action → 執行 addUser()https://host/app/user!getUserList.action → 執行 getUserList()allowedMethods 白名單:<action name="user" class="ssh.org.web.UserAction" method="addUser,getUserList">
<!-- 僅允許這兩個方法被動態調用 -->
</action>
或在 struts.xml 全局設置:<constant name="struts.enable.DynamicMethodInvocation" value="false"/> 禁用該特性(默認開啟)。
| 維度 | 通配符映射(上文) | 多 Action 映射 | 驚嘆號語法 |
|---|---|---|---|
| 配置複雜度 | 低(一行配置) | 高(每方法一個 action) | 極低(零額外配置) | URL 語義化 | 高(REST 風格) | 高 | 一般(含特殊符號) | 方法級驗證支援 | 支援 | 支援 | 支援 | 安全性 | 可通過通配符限制 | 顯式聲明最安全 | 需額外配置白名單 | 推薦場景 | CRUD 規律性強 | 方法少、邏輯差異大 | 快速原型、內部系統 |
Struts2 提供了靈活的動態方法調用機制:
根據項目規模、團隊習慣、安全要求選擇最適方案。