Struts2 的驗證框架相較於 Struts1 更為簡潔易讀,充分發揮配置檔案的作用,實現了邏輯與驗證規則的解耦。本文將以一個完整的用戶註冊流程為例,逐步拆解 JSP 頁面、Action 處理、JavaBean 定義、驗證 XML 配置以及 Struts 核心配置檔案的編寫要點。
register.jsp頁面使用 Struts2 標籤庫輸出表單欄位錯誤訊息,並建立用戶名、密碼、確認密碼、年齡、生日等輸入框。注意 <s:fielderror> 會自動顯示對應欄位的驗證錯誤。
<?xml:namespace prefix = s /><s:fielderror></s:fielderror>
<!-- 讀取顯示提示信息 -->
<TABLE>
<TR><TD>用戶名:</TD><TD><s:textfield name="user.userName" /></TD></TR>
<TR><TD>密碼:</TD><TD><s:password name="user.password" /></TD></TR>
<TR><TD>確認密碼:</TD><TD><s:password name="user.rePassword" /></TD></TR>
<TR><TD>年齡:</TD><TD><s:textfield name="user.age" /></TD></TR>
<TR><TD>生日:</TD><TD><s:textfield name="user.birthday" /></TD></TR>
<TR><TD colspan="2"><s:submit value="註冊" /></TD></TR>
</TABLE>
welcome.jsp註冊成功後導向此頁,透過 OGNL 表達式直接取得 Action 中 user 物件的屬性值。
congratulations! ${user.userName}
RegisterAction繼承 ActionSupport 即可獲得驗證與國際化支援。在 execute() 中手動檢查兩次密碼是否一致,若不符則加入欄位錯誤並返回 input 結果,導回註冊頁顯示錯誤。
package org.kingtoon.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.kingtoon.bean.User;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
private User user;
@Override
public String execute() throws Exception {
if (!(user.getPassword().equals(user.getRePassword()))) {
this.addFieldError("password", "請輸入相同的密碼");
return INPUT;
} else {
HttpServletRequest request = ServletActionContext.getRequest();
request.setAttribute("user", user);
return SUCCESS;
}
}
public User getUser() { return user; }
public void setUser(User user) { this.user = user; }
}
User.java標準 POJO,包含驗證所需的所有屬性與 Getter/Setter。
package org.kingtoon.bean;
import java.util.Date;
public class User {
private String userName;
private String password;
private String rePassword;
private Integer age;
private Date birthday;
// 省略 Getter/Setter ...
}
RegisterAction-validation.xml檔案命名慣例:Action類名-validation.xml。使用 <field-validator> 針對各欄位定義規則:
requiredstring:必填且去除空白stringlength:長度範圍int:整數範圍date:日期範圍<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"https://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<!-- 用戶名 -->
<field name="user.userName">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用戶名不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">2</param>
<param name="maxLength">18</param>
<message>用戶名長度應在2到18個字符間</message>
</field-validator>
</field>
<!-- 密碼 -->
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密碼不能為空</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">18</param>
<message>密碼長度應在6到18個字符之間</message>
</field-validator>
</field>
<!-- 年齡 -->
<field name="user.age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年齡應在1到150之間</message>
</field-validator>
</field>
<!-- 生日 -->
<field name="user.birthday">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2008-10-16</param>
<message>出生日期應在1900-01-01到2008-10-16</message>
</field-validator>
</field>
</validators>
struts.xml定義套件、國際化資源、Action 與結果導向。
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messageResource" />
<package name="default" extends="struts-default">
<action name="register" class="org.kingtoon.action.RegisterAction">
<result name="success">/welcome.jsp</result>
<result name="input">/register.jsp</result>
</action>
</package>
</struts>
web.xml配置 Struts2 核心 Filter 與啟動頁面。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://java.sun.com/xml/ns/j2ee"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<filter>
<filter-name>struts-cleanup</filter-name>
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
</filter>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts-cleanup</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>register.jsp</welcome-file>
</welcome-file-list>
</web-app>
Action類名-validation.xml 格式,框架才會自動載入。type 必須與 JavaBean 中對應屬性的類型一致,否則會拋出型別轉換錯誤。