Validator 框架(現屬 Jakarta Commons)以宣告式 XML 設定驗證規則,支援伺服器端與客戶端(JavaScript)雙重驗證,大幅減少程式碼。
| 邏輯名 | 用途 |
| required | 必填欄位 |
| email | 電子郵件格式 |
| creditCard | 信用卡號碼 |
| date | 日期格式 |
| mask | 正則表達式 |
| minlength / maxlength | 最小/最大長度 |
| range | 數值範圍 |
| int / float / double | 數值型別 |
每個規則定義包含:<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> 區塊。
自訂驗證規則
- 撰寫靜態方法:
public static boolean validateMyRule(Object bean, ValidatorAction va, Field field, ActionErrors errors, HttpServletRequest request)
- 在
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 層處理
- 上一篇文章: Java 入門學習指南:給初次接觸者的完整路線圖
- 下一篇文章: Prevayler:Java 物件級輕量持久化框架,無需資料庫
Copyright ©
程式碼之家 All Rights Reserved