延續上篇「修改 form action」方式,本文介紹 Struts2 通配符機制,通過單一 <action> 配置替代多個重複定義,進一步消除冗余。
name="*" 匹配任意 action 名稱。method="{1}" 將第一個通配符捕獲的值作為方法名。*-*、Book_* 等複雜模式,亦可在 class、result 中引用 {1}、{2}。<form action="Login" method="post" id="form">
姓名:<input type="text" name="name" /><br><br>
密碼:<input type="password" name="password" /><br><br>
<input type="submit" value="登錄">
<input type="submit" value="註冊">
</form>
<script>
$("input:eq(3)").click(function(){
$("#form").attr("action","Create"); // 註冊按鈕點擊時修改 action
});
</script>
<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>
解析: 用戶點擊「登錄」提交 action="Login",通配符 * 匹配 "Login",method="{1}" 解析為 "Login",調用 Action 的 Login() 方法;同理「註冊」調用 Create()。
package action;
import com.opensymphony.xwork2.ActionSupport;
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"; }
}
<!-- 通用 action,直接轉發到同名 JSP -->
<action name="*">
<result>/WEB-INF/jsp/{1}.jsp</result>
</action>
請求 a.action → 跳轉 a.jsp;請求 b.action → 跳轉 b.jsp,無需編寫任何 Java 代碼。
通配符映射大幅減少 struts.xml 體積,配合動態方法調用,實現「一個 Action 類處理多業務、一個配置項覆蓋多路徑」的極簡開發模式。