在 Struts2 中,動態方法調用(Dynamic Method Invocation,DMI)允許一個 Action 類包含多個業務處理方法,根據用戶操作動態決定調用哪個方法。本文重點演示「修改表單 action 屬性」這一實現方式。
同一個表單包含多個提交按鈕(如「登錄」與「註冊」),通過 JavaScript 動態修改 <form> 的 action 屬性,將請求路由到同一 Action 類的不同方法。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<script src="js/jquery-1.7.2.js"></script>
<script type="text/javascript">
$(function(){
$("input:eq(3)").click(function(){ // 註冊按鈕
$("#form").attr("action","userCreate");
});
});
</script>
</head>
<body>
<form action="userLogin" 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>
</body>
</html>
<struts>
<package name="myP" extends="struts-default">
<action name="in" class="action.Action" method="go">
<result name="login">WEB-INF/jsp/index.jsp</result>
</action>
<action name="userLogin" class="action.Action" method="test">
<result name="userLogin">WEB-INF/jsp/userLogin.jsp</result>
</action>
<action name="userCreate" class="action.Action" method="create">
<result name="userCreate">WEB-INF/jsp/userCreate.jsp</result>
</action>
</package>
</struts>
package action;
import com.opensymphony.xwork2.ActionSupport;
public class Action extends ActionSupport {
private String name;
private String password;
// getter/setter 省略
public String go() { System.out.println("去登錄註冊頁面!!"); return "login"; }
public String test() { System.out.println("用戶登錄"); return "userLogin"; }
public String create() { System.out.println("用戶註冊"); return "userCreate"; }
}
此方式通過前端腳本動態切換 action,後端配置多個 <action> 映射不同方法,實現了單表單多業務處理。實戰中需補全業務校驗邏輯。