首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts2 數據驗證完全指南:validate 方法與 XWork 驗證框架雙軌並行

     編輯:Java 相關知識

一、Struts2 驗證機制概覽

Struts2 提供兩種驗證方式,可混合使用:

  1. Action 級編程式驗證:重寫 validate() / validateXxx() 方法
  2. 聲明式驗證:基於 XWork 框架的 XML 配置文件

驗證失敗自動返回 input 結果,錯誤信息存入 fieldErrors,頁面通過 <s:fielderror/> 顯示。

二、方式一:Action 方法驗證

1. 通用 validate()


public class UserAction extends ActionSupport {
    private String username;
    private String password;
    
    public String login() { return SUCCESS; }
    public String register() { return SUCCESS; }
    
    // 所有 Action 方法執行前調用
    @Override
    public void validate() {
        if (StringUtils.isBlank(username)) {
            addFieldError("username", "用戶名不能為空");
        }
        if (StringUtils.isBlank(password)) {
            addFieldError("password", "密碼不能為空");
        } else if (password.length() < 6) {
            addFieldError("password", "密碼長度至少 6 位");
        }
    }
    
    // 特定方法驗證:validate + 方法名(首字母大寫)
    public void validateRegister() {
        validate();  // 復用通用邏輯
        if (!password.equals(confirmPassword)) {
            addFieldError("confirmPassword", "兩次密碼不一致");
        }
    }
}

2. struts.xml 配置


<package name="default" extends="struts-default">
    <action name="userLogin" class="com.example.UserAction" method="login">
        <result name="success">/welcome.jsp</result>
        <result name="input">/login.jsp</result>  <!-- 驗證失敗跳轉 -->
    </action>
    
    <action name="userRegister" class="com.example.UserAction" method="register">
        <result name="success">/success.jsp</result>
        <result name="input">/register.jsp</result>
    </action>
</package>

3. 頁面顯示錯誤


<!-- login.jsp -->
<s:form action="userLogin">
    <s:textfield name="username" label="用戶名"/>
    <s:password name="password" label="密碼"/>
    <s:fielderror />  <!-- 顯示所有字段錯誤 -->
    <s:submit value="登錄"/>
</s:form>

三、方式二:XWork XML 聲明式驗證

1. 命名規則

  • 通用:Action類名-validation.xml
  • 方法級:Action類名-方法名-validation.xml
  • 優先級:方法級 > 通用級 > validate() 方法

2. 字段驗證器語法


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.3//EN"
  "https://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
    <field name="username">
        <field-validator type="requiredstring">
            <message>用戶名不能為空</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">20</param>
            <message>用戶名長度 3-20 位</message>
        </field-validator>
    </field>
    
    <field name="password">
        <field-validator type="requiredstring">
            <message>密碼不能為空</message>
        </field-validator>
        <field-validator type="regex">
            <param name="expression">^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,}$</param>
            <message>密碼需含字母數字,至少 6 位</message>
        </field-validator>
    </field>
    
    <field name="email">
        <field-validator type="email">
            <message>郵箱格式不正確</message>
        </field-validator>
    </field>
</validators>

3. 非字段驗證器語法(跨字段業務規則)


<validators>
    <validator type="expression">
        <param name="expression">password == confirmPassword</param>
        <message>兩次密碼輸入不一致</message>
    </validator>
    
    <validator type="fieldexpression">
        <param name="fieldName">age</param>
        <param name="expression">age >= 18 && age <= 100</param>
        <message>年齡必須在 18-100 之間</message>
    </validator>
</validators>

四、Struts2 內置驗證器速查表

類型驗證器關鍵參數說明
基礎required—非 null(字符串允許空串)
requiredstringtrim (true/false)非 null 且 trim 後非空
stringlengthminLength, maxLength, trim長度範圍
格式email—郵箱格式
url—URL 格式
regexexpression, caseSensitive正則表達式
datemin, max, format日期範圍
數值intmin, max整數範圍
doublemin, max浮點範圍
longmin, max長整數範圍
業務expressionexpression (OGNL)任意 OGNL 表達式
業務fieldexpressionfieldName, expression字段級 OGNL 表達式
組合visitorcontext, appendPrefix驗證嵌套對象(遞歸)
轉換conversion—類型轉換錯誤捕獲

五、國際化(I18n)錯誤消息


# UserAction.properties
username.requiredstring = 用戶名不能為空
password.stringlength = 密碼長度必須在 ${minLength}-${maxLength} 之間
email.email = 請輸入合法的郵箱地址

XML 中使用 Key:


<message key="username.requiredstring"/>

六、最佳實踐與避坑

  1. 分層驗證:前端 JS 做體驗優化,後端 Action/XWork 做安全底線
  2. 複雜業務規則用 validateXxx() 或 expression:XML 表達能力有限
  3. 避免在驗證中做 DB 查詢:驗證應輕量,業務唯一性檢查放 Service 層
  4. 字段名一致性:Action 屬性、表單 name、XML field 名三者嚴格對應
  5. 類型轉換錯誤:配置 conversion 驗證器捕獲 NumberFormatException 等
  6. 驗證順序:XML 定義順序 = 執行順序,建議 required 放最前

Struts2 雙軌驗證機制兼顧了編程靈活性與聲明式簡潔性。通用邏輯用 XML,業務定製用 validateXxx(),配合完善的國際化消息體系,構建健壯的表單防護層。現代項目多遷移至 Spring MVC + Bean Validation (JSR-380),但理解 Struts2 驗證原理有助於掌握 MVC 框架驗證設計精髓。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved