在 Struts2 開發中,Action 接收前端傳遞的參數是最基礎也最關鍵的環節。本文將系統梳理三種主流接收方式——Action 屬性直接接收、Domain Model 封裝接收、ModelDriven 模型驅動接收,並深入講解 List 集合與巢狀物件的綁定技巧,助你靈活應對各類表單提交場景。
這是最符合直覺的做法:在 Action 類中定義與表單字段同名的私有屬性,並提供對應的 Getter/Setter。Struts2 的參數攔截器會自動根據名稱匹配完成賦值。
步驟 1:建立登入頁面 login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用戶登入</title>
</head>
<body>
<form action="loginAction.action" method="post">
用戶名:<input type="text" name="username">
密碼:<input type="password" name="password">
<input type="submit" value="登入">
</form>
</body>
</html>
步驟 2:編寫 LoginAction
package com.zzh.action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username;
private String password;
// Getter/Setter 省略
public String login() {
System.out.println("接收到用戶名:" + username);
// 此處可接續業務邏輯驗證
return SUCCESS;
}
}
步驟 3:配置 struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "https://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="login" extends="struts-default" namespace="/">
<action name="loginAction" method="login" class="com.zzh.action.LoginAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
步驟 4:建立成功頁面 success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <html><body>你好!歡迎登入系統</body></html>
啟動 Tomcat 訪問 https://localhost:8080/專案名/login.jsp,輸入用戶名密碼提交,控制台即可輸出接收到的參數,頁面跳轉至成功頁。
隨著業務增長,Action 中堆砌大量屬性會導致代碼膨脹。此時應引入領域模型(如 User 類)封裝相關屬性,Action 僅持有模型對象引用。
1. 建立 User 實體類
package com.zzh.us;
public class User {
private String username;
private String password;
// Getter/Setter 省略
}
2. 修改 LoginAction 持有 User 對象
package com.zzh.action;
import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private User user;
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
public String login() {
System.out.println("Domain Model 接收:" + user.getUsername());
return SUCCESS;
}
}
3. 關鍵點:JSP 中需指定屬性所屬對象
<form action="loginAction.action" method="post">
用戶名:<input type="text" name="user.username">
密碼:<input type="password" name="user.password">
<input type="submit" value="登入">
</form>
表單字段名採用 對象名.屬性名 格式,OGNL 表達式引擎會自動實例化 User 並賦值。若頁面存在多個同屬性名的對象,此寫法可有效避免衝突。
實現 ModelDriven<T> 介面,Action 直接成為模型的代理,JSP 表單字段無需前綴即可映射,代碼更乾淨。
package com.zzh.action;
import com.zzh.us.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class LoginAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = 1L;
private User user = new User(); // 必須預先實例化
@Override
public User getModel() {
return user;
}
public String login() {
System.out.println("ModelDriven 接收:" + user.getUsername());
return SUCCESS;
}
}
<form action="loginAction.action" method="post">
用戶名:<input type="text" name="username">
密碼:<input type="password" name="password">
<input type="submit" value="登入">
</form>
注意:一個 Action 僅能對應一個 Model,不適用於需綁定多個獨立模型的場景。
實際開發中常需接收列表數據(如多書籍、多收貨地址),Struts2 透過下標或屬性鏈完美支援。
User 類新增屬性
private List<String> bookList; // 含 Getter/Setter
JSP 使用下標命名
書籍1:<input type="text" name="bookList[0]"> 書籍2:<input type="text" name="bookList[1]">
Action 驗證
System.out.println(user.getBookList().get(0)); // 輸出第一本書名
若書單變為物件列表,JSP 需進一步指定屬性:
書籍1:<input type="text" name="bookList[0].username"> 書籍2:<input type="text" name="bookList[1].username">
Action 取值同理:
System.out.println(user.getBookList().get(0).getUsername());
測試結果顯示後台完美接收到巢狀物件屬性值。
| 方式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| Action 屬性 | 簡單直觀,零配置 | 屬性多時類膨脹,難維護 | 極簡表單、原型開發 |
| Domain Model | 物件導向清晰,支援多模型共存 | JSP 需加前綴,稍繁瑣 | 中大型專案、多模型表單 |
| ModelDriven | 代碼最精簡,JSP 無前綴 | 單 Action 單模型,靈活度受限 | 單一核心模型的 CRUD 操作 |
實戰中建議:以 Domain Model 為主,輔以 ModelDriven 處理核心單一模型,複雜集合綁定靠下標/屬性鏈解決。掌握三種方式的優劣與轉換,才能在 Struts2 參數接收上遊刃有餘。





