在 Struts2 開發中,Action 接收前端傳遞的參數是核心基礎。本文將系統講解三種主流的參數接收形式,並示範如何利用 addFieldError() 實現簡單的表單驗證,幫助你快速掌握實戰技巧。
最直觀的方式是在 Action 類中聲明與表單字段同名的私有屬性,並提供 Getter/Setter。Struts2 會自動將請求參數注入這些屬性。
/**
* 基本參數接收示例
* 請求範例:https://localhost:8080/Struts3/index!login?name=123&password=456
*/
@SuppressWarnings("serial")
public class User extends ActionSupport {
private String name;
private int pwd;
// Getter/Setter 省略
public String login() {
System.out.println("name=" + name + " Pwd=" + pwd);
if (123456 == pwd) {
return SUCCESS;
} else {
return ERROR;
}
}
}
優點:簡單直接,適合少量參數。缺點:屬性過多時類會膨脹,難以維護。
將相關參數封裝成一個獨立的 JavaBean(如 User),Action 中只需持有該對象的引用。請求參數需以 user.name、user.password 形式傳遞。
// 實體類
public class User {
private String name;
private String password;
// Getter/Setter 省略
}
// Action 類
/**
* Domain Model 模式
* 請求範例:https://localhost:8080/Struts4/index!login?user.name=123&user.password=456
*/
@SuppressWarnings("serial")
public class UserAction extends ActionSupport {
private User user;
// Getter/Setter 省略
public String login() {
System.out.println("name=" + user.getName() + " Pwd=" + user.getPassword());
return SUCCESS;
}
}
優點:結構清晰,符合面向對象設計,便於複雜表單處理。
Action 實現 ModelDriven<User> 並實例化模型對象。此時請求參數可直接用 name、password 傳遞,框架自動將數據填充到模型對象中。
/**
* Model Driven 模式
* 請求範例:https://localhost:8080/Struts5/index!login?name=123&password=456
*/
@SuppressWarnings("serial")
public class UserAction extends ActionSupport implements ModelDriven<User> {
private User user = new User();
public String login() {
System.out.println("name=" + user.getName() + " Pwd=" + user.getPassword());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
優點:結合了前兩者優點,參數名簡潔,又保持領域模型結構。注意:getModel() 返回的對象不能為 null,否則會拋出空指針異常。
Struts2 提供 addFieldError(String fieldName, String errorMessage) 將錯誤信息綁定到指定字段,配合 JSP 標簽 <s:fielderror> 顯示。
@SuppressWarnings("serial")
public class InputErrorFilter extends ActionSupport {
private String name;
// Getter/Setter 省略
public String login() {
System.out.println(name);
if (name != null && name.equals("hpu")) {
return SUCCESS;
} else {
this.addFieldError("nameError", "用戶名輸入有誤");
this.addFieldError("nameError", "ul li 形式輸出錯誤信息");
return ERROR;
}
}
}
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<html>
<body>
操作失敗 <br>
輸入參數:<s:text name="name" /><br/>
<s:fielderror fieldName="nameError" theme="simple"/><br/>
<s:property value="errors.nameError[0]"/><br/>
<s:debug></s:debug>
</body>
</html>
說明:theme="simple" 會以簡單的 ul/li 列表輸出所有錯誤信息;也可用 <s:property> 取特定索引的錯誤。
表單驗證只需在 Action 中調用 addFieldError,配合前端標簽即可實現友好的錯誤提示。實際項目中建議結合 Struts2 的驗證框架(XML 或註解驗證)實現更複雜的業務規則。