Web 表單常包含多個提交按鈕(如「保存」、「打印」、「刪除」),傳統 Struts 1.x 需用 LookupDispatchAction 或 EventDispatchAction 處理,配置繁瑣。Struts 2 提供極簡機制:通過 URL 參數 actionName!methodName.action 或表單按鈕的 method 屬性,直接映射到 Action 不同方法,無需額外配置。本文通過完整範例演示如何輕鬆實現。
name 與 method 屬性決定調用哪個 Action 方法。submit!save.action、submit!print.action 指定方法。execute)。<%@ page language="java" pageEncoding="GBK"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head><title>多提交按鈕處理</title></head>
<body>
<s:form action="submit.action">
<s:textfield name="msg" label="輸入內容"/>
<s:submit name="save" value="保存" method="save"/>
<s:submit name="print" value="打印" method="print"/>
</s:form>
</body>
</html>
兩個 <s:submit> 分別指定 method="save"、method="print"。
package action;
import javax.servlet.http.HttpServletRequest;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletRequestAware;
public class MoreSubmitAction extends ActionSupport implements ServletRequestAware {
private String msg;
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public String save() throws Exception {
request.setAttribute("result", "成功保存[" + msg + "]");
return "save";
}
public String print() throws Exception {
request.setAttribute("result", "成功打印[" + msg + "]");
return "print";
}
// getter/setter 省略
}
關鍵點:
ServletRequestAware 獲取 HttpServletRequest(Struts 2 Action 方法無參數)。save()、print() 方法必須存在,否則拋出 NoSuchMethodException。<package name="demo" extends="struts-default">
<action name="submit" class="action.MoreSubmitAction">
<result name="save">/result.jsp</result>
<result name="print">/result.jsp</result>
</action>
</package>
結果名稱對應方法返回字串。
<%@ page pageEncoding="GBK"%>
<html><head><title>提交結果</title></head>
<body><h1>${result}</h1></body></html>
https://localhost:8080/moresubmit/more_submit.jsp,點擊「保存」/「打印」觀察結果。https://localhost:8080/moresubmit/submit!save.actionhttps://localhost:8080/moresubmit/submit!print.action
| 特性 | Struts 1.x | Struts 2 |
|---|---|---|
| 處理多提交 | 需繼承 LookupDispatchAction/EventDispatchAction,配置映射 | 零配置,直接方法映射 |
| 獲取 Request | execute 方法參數直接提供 | 實現 ServletRequestAware 接口 |
| 方法簽名 | 固定 execute(...) 簽名 | 任意公共方法,返回 String |
Struts 2 以約定優於配置的思想,將「一個表單多提交」這一常見需求簡化為:
method 屬性<result>無需繼承特殊基類、無需屬性文件映射,代碼清爽、易維護。