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

Struts Validator 驗證框架深度解析與實戰配置

     編輯:Java 相關知識

前言

Apache Commons Validator 成為 Struts 內建驗證框架,透過 XML 宣告式配置替代硬編碼 validate() 方法,實現驗證邏輯與業務代碼分離。本文系統講解 validator-rules.xml、validation.xml 核心配置、ActionForm 整合、客戶端 JavaScript 生成及擴展要點。

核心依賴

  • commons-validator.jar:驗證規則引擎、內建驗證器(required、email、mask 等)
  • jakarta-oro.jar:正則表達式引擎(Validator 1.4+ 已內建 java.util.regex,舊版需此包)

兩大配置文件職責劃分

文件職責修改頻率
validator-rules.xml定義全域驗證規則(validator 實現類、錯誤訊息鍵、JS 函數)低(升級框架時更新)
validation.xml針對具體 Form 組合規則、配置參數、錯誤訊息高(隨業務變更)

最佳實踐:勿直接修改 validator-rules.xml,需擴展規則時在 validation.xml <global> 區定義常量或自訂 validator。

validation.xml 完整結構解析

<form-validation>
  <global>
    <constant>
      <constant-name>pwdRegex</constant-name>
      <constant-value>^(?=.*[a-z])(?=.*\d)[\w]{6,20}$</constant-value>
    </constant>
  </global>
  
  <formset>
    <form name="loginForm">
      <!-- 用戶名:必填 -->
      <field property="username" depends="required">
        <arg0 key="label.username" />
      </field>
      
      <!-- 密碼:必填 + 長度 + 正則 -->
      <field property="password" depends="required,minlength,maxlength,mask">
        <arg0 key="label.password" />
        <arg1 name="minlength" key="${var:minlength}" resource="false" />
        <arg2 name="maxlength" key="${var:maxlength}" resource="false" />
        <var>
          <var-name>mask</var-name>
          <var-value>${pwdRegex}</var-value>
        </var>
        <var><var-name>minlength</var-name><var-value>6</var-value></var>
        <var><var-name>maxlength</var-name><var-value>20</var-value></var>
      </field>
      
      <!-- 郵箱:內建 email 規則 -->
      <field property="email" depends="required,email">
        <arg0 key="label.email" />
      </field>
    </form>
  </formset>
</form-validation>

關鍵屬性說明

  • depends:逗號分隔的規則名,按順序執行,任一失敗即停止
  • arg0..argN:錯誤訊息參數,key 可引用資源包,resource="false" 直接使用字面值
  • var:向規則傳遞參數(如 minlength、mask 正則)

ActionForm 整合:四大選型指南

Form 類別對應 validation.xml form name適用場景
ValidatorForm<form-bean name="loginForm"> 的 name傳統 ActionForm,單一驗證邏輯
ValidatorActionForm<action path="/login"> 的 path (去掉 /)同一 Form 對應多 Action,需差異化驗證
DynaValidatorForm同 ValidatorForm動態屬性 Form,無需編寫 Java 類
DynaValidatorActionForm同 ValidatorActionForm動態屬性 + 多 Action 差異驗證

場景示例:登入 vs 取消

<formset>
  <!-- ValidatorActionForm 模式:按 action path 區分 -->
  <form name="login">      <!-- 對應 /login.do -->
    <field property="password" depends="required,mask">...</field>
  </form>
  <form name="cancel">     <!-- 對應 /cancel.do -->
    <!-- 取消無需驗證密碼 -->
  </form>
</formset>

Struts 配置啟用 ValidatorPlugIn

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property property="pathnames" 
      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
  <!-- 可選:自定義訊息資源 -->
  <set-property property="resourcePath" value="ApplicationResources" />
</plug-in>

客戶端驗證:零代碼生成 JavaScript

  1. validator-rules.xml 中每個 <validator> 內嵌 <javascript> 定義 JS 函數
  2. JSP 引入:<html:javascript formName="loginForm" /> 自動生成 validateLoginForm(form)
  3. Form 標籤綁定:<html:form action="/login.do" onsubmit="return validateLoginForm(this);">

驗證失敗時彈出警示框,阻止表單提交,減輕伺服器壓力。

進階擴展:自訂驗證規則

1. 實作 Validator 介面

public class ChineseMobileValidator implements Validator {
    private static final Pattern MOBILE = Pattern.compile("^1[3-9]\d{9}$");
    
    public boolean validate(Object bean, ValidatorAction va, Field field,
                            ActionMessages errors, ActionForm form,
                            HttpServletRequest request) {
        String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
        return value == null || MOBILE.matcher(value).matches();
    }
}

2. 註冊到 validation.xml

<global>
  <validator name="chineseMobile"
      classname="com.myapp.validator.ChineseMobileValidator"
      method="validate"
      methodParams="java.lang.Object,
                    org.apache.commons.validator.ValidatorAction,
                    org.apache.commons.validator.Field,
                    org.apache.struts.action.ActionMessages,
                    org.apache.struts.action.ActionForm,
                    javax.servlet.http.HttpServletRequest"
      msg="errors.chineseMobile" />
</global>

3. 使用

<field property="mobile" depends="required,chineseMobile">
  <arg0 key="label.mobile" />
</field>

避坑指南

  1. 屬性名稱匹配:field property 必須與 Form Bean 的 getter/setter 對應(如 userName 對應 getUserName())
  2. 巢狀屬性:支援 property="address.city",需確保 getAddress() 不返回 null
  3. 資源包鍵值:arg0 key="label.username" 需在 ApplicationResources.properties 定義
  4. JS 生成失效:確認 validator-rules.xml 含 <javascript>,且 JSP 引入 <html:javascript> 位置正確
  5. DynaForm 初始化:struts-config.xml 需配置 <form-property> 定義屬性類型

總結

Validator 框架以 XML 宣告式配置大幅減少驗證樣板代碼,支援伺服端/客戶端雙重驗證,靈活的 Form/Action 級區分滿足複雜業務場景。掌握 validation.xml 結構、四類 Form 選型、自訂 Validator 擴展,即可在 Struts 專案中構建健壯、可維護的驗證體系。

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