單個 Action 類包含多個業務方法(add/update/delete/list),需根據請求路由到不同方法,避免編寫大量重複 <action> 配置。
<package name="user" extends="struts-default">
<action name="userAdd" class="com.demo.UserAction" method="add">
<result name="success">/user/add.jsp</result>
</action>
<action name="userUpdate" class="com.demo.UserAction" method="update">
<result name="success">/user/update.jsp</result>
</action>
<action name="userDelete" class="com.demo.UserAction" method="delete">
<result name="success">/user/list.jsp</result>
</action>
</package>
缺點:方法增加需同步修改 XML,維護成本高。
<!-- struts.xml 啟用開關 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<action name="userAction" class="com.demo.UserAction">
<result name="add">/user/add.jsp</result>
<result name="update">/user/update.jsp</result>
</action>
<!-- JSP 鏈接 -->
<a href="userAction!add">新增</a>
<a href="userAction!update">修改</a>
// Action
public class UserAction extends ActionSupport {
public String add() { return "add"; }
public String update() { return "update"; }
}
風險:任意公共方法可被 URL 直接調用,暴露內部邏輯,易遭惡意調用。Struts 2.5+ 默認關閉,強烈建議不用。
<action name="user*Action" class="com.demo.UserAction" method="{1}">
<result name="add">/user/add.jsp</result>
<result name="update">/user/update.jsp</result>
<result name="delete">/user/list.jsp</result>
<result name="list">/user/list.jsp</result>
</action>
<!-- JSP -->
<a href="userAddAction">新增</a>
<a href="userUpdateAction">修改</a>
<a href="userDeleteAction">刪除</a>
<a href="userListAction">列表</a>
原理:* 匹配任意字符,{1} 引用第一個分組內容作為方法名。支持多通配符 user*_*Action → method="{1}_{2}"。
<action name="user*Action" class="com.demo.UserAction" method="{1}">
<result name="{1}">/user/{1}.jsp</result> <!-- 方法名直接對應視圖 -->
</action>
配合 struts.convention.result.path 進一步簡化。
struts.enable.DynamicMethodInvocation(默認 false)。public 僅限業務方法,內部輔助方法用 private/protected。MethodPrefixInterceptor 或自定義攔截器白名單校驗方法名。| 方式 | 配置量 | 安全性 | 維護性 | 推薦度 |
|---|---|---|---|---|
| method 屬性 | 大 | 高 | 低 | ★☆☆ |
| 感嘆號 | 小 | 低 | 中 | ★☆☆ (禁用) |
| 通配符 | 極小 | 高 | 高 | ★★★ (首選) |