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

Struts Validator 框架:簡化表單驗證開發完整指南

     編輯:Java 程式設計入門

為什麼需要 Validator?

Struts 內建驗證需在 ActionForm validate() 撰寫程式碼,缺點明顯:

  • 驗證邏輯大量重複(如 Email、必填、長度)
  • 修改需改多處並重新編譯
  • 僅支援伺服器端驗證

Validator 框架(現屬 Jakarta Commons)以宣告式 XML 設定驗證規則,支援伺服器端與客戶端(JavaScript)雙重驗證,大幅減少程式碼。

Validator 架構總覽

兩大設定檔

  1. validator-rules.xml:定義可用驗證規則(邏輯名、實作類別/方法、客戶端 JS 程式碼)
  2. validation.xml:將規則套用至特定 Form Bean 欄位

啟用 Validator 外掛

<!-- struts-config.xml -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>

validator-rules.xml 內建規則

預設提供常用規則(邏輯名):

每個規則定義包含:<validator name="..." class="..." method="..."/> 及對應的 <javascript> 區塊。

建立支援 Validator 的 Form Bean

方式一:繼承 ValidatorForm

public class LogonForm extends ValidatorForm {
    private String username;
    private String password;
    // 僅需 getter/setter,無需 validate()/reset()
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

方式二:動態 DynaValidatorForm

<form-bean name="logonForm"
    type="org.apache.struts.validator.DynaValidatorForm">
    <form-property name="username" type="java.lang.String"/>
    <form-property name="password" type="java.lang.String"/>
</form-bean>

無需撰寫 Java 類別,Struts 依設定動態建立 Form Bean。

validation.xml 套用規則

<!DOCTYPE form-validation PUBLIC
  "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
  "https://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
    <formset>
        <form name="logonForm">
            <field property="username" depends="required">
                <arg0 key="prompt.username"/> <!-- 錯誤訊息參數 -->
            </field>
            <field property="password" depends="required,mask">
                <arg0 key="prompt.password"/>
                <var>
                    <var-name>mask</var-name>
                    <var-value>^.{6,20}$</var-value> <!-- 6-20 字元 -->
                </var>
            </field>
        </form>
    </formset>
</form-validation>
  • form name 對應 struts-config.xml 的 form-bean name
  • depends 可串聯多規則,按順序執行
  • arg0 等對應 ApplicationResources.properties 的訊息鍵
  • var 傳遞規則參數(如 mask 的 regex)

客戶端驗證啟用

在 JSP 中引入自動產生的 JavaScript:

<html:javascript formName="logonForm" dynamicJavascript="true" staticJavascript="true" />

需在 validator-rules.xml 定義各規則的 <javascript> 區塊。

自訂驗證規則

  1. 撰寫靜態方法:public static boolean validateMyRule(Object bean, ValidatorAction va, Field field, ActionErrors errors, HttpServletRequest request)
  2. 在 validator-rules.xml 註冊:
<validator name="myRule"
    class="com.example.CustomValidator"
    method="validateMyRule"
    methodParams="java.lang.Object,org.apache.commons.validator.ValidatorAction,org.apache.commons.validator.Field,org.apache.struts.action.ActionErrors,javax.servlet.http.HttpServletRequest"
    msg="errors.myRule">
    <javascript><![CDATA[ ... JS 實作 ... ]]></javascript>
</validator>

最佳實踐

  • 盡量使用內建規則,減少自訂開發
  • 錯誤訊息集中管理於 ApplicationResources.properties
  • 伺服器端驗證為主,客戶端驗證為輔(用戶體驗)
  • 動態表單(DynaValidatorForm)適合快速原型,正式專案建議用具體類別便於維護
  • 跨欄位驗證(如確認密碼)可在 Action 或 Service 層處理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
邏輯名用途
required必填欄位
email電子郵件格式
creditCard信用卡號碼
date日期格式
mask正則表達式
minlength / maxlength最小/最大長度
range數值範圍
int / float / double數值型別