Validator 框架支援巢狀屬性、索引屬性驗證,提供常數/變數機制減少重複配置,並能一鍵切換為 JavaScript 客戶端驗證。本文詳細說明這三大進階功能。
若 FormBean 有屬性 employee(型別 Employee),欲驗證其 salary:
<field property="employee.salary" depends="required,floatRange"> ... </field>
以點號 . 串連屬性路徑。
驗證集合/陣列每個元素的同一規則,使用 indexedListProperty:
<field indexedListProperty="items" depends="required,integer"> ... </field>
框架會對 items 每個元素套用驗證。
<field indexedListProperty="items" property="employee.age" depends="required,integer"> ... </field>
驗證 items 集合中每個元素的 employee.age。
<global>置於第一個 <formset> 之前,所有表單可用:
<global>
<constant>
<constant-name>alphaNumMask</constant-name>
<constant-value>^[a-zA-Z0-9]*$</constant-value>
</constant>
</global>
置於 <formset> 開頭,僅限該 formset 內表單使用:
<formset>
<constant>
<constant-name>alphaNumMask</constant-name>
<constant-value>^[a-zA-Z0-9]*$</constant-value>
</constant>
<form name="myForm"> ... </form>
</formset>
<var>
<var-name>mask</var-name>
<var-value>${alphaNumMask}</var-value>
</var>
<var> 傳遞參數給錯誤訊息<field property="name" depends="required">
<msg name="required" key="error.name.blank" />
<arg name="required" key="${var:required}" position="0" resource="false" />
<var>
<var-name>required</var-name>
<var-value>姓名</var-value>
</var>
</field>
${var:required} 將變數值「姓名」插入錯誤訊息 {0} 位置。
只需在 JSP 兩處修改:
<html:javascript formName="firstValidatorForm" />
<html:form> 加入 onsubmit:
<html:form action="firstValidator" onsubmit="return validateFirstValidatorForm(this);">
原理:<html:javascript> 會輸出 Validator 內建驗證器的 JavaScript 實作,並產生入口函數 validate。提交時呼叫此函數,通過才送往伺服器。
Validator 進階功能讓驗證配置更 DRY(常數/變數)、支援複雜資料結構(巢狀/索引)、並能零成本啟用客戶端即時回饋,是 Struts 表單驗證的最佳實踐組合。