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

Struts 1.2 validwhen 驗證器:條件式表單驗證完全指南

     編輯:Java 相關知識

為什麼需要 validwhen?

傳統 required、mask 等驗證器只能處理單一欄位規則。實務上常見需求:

  • 「確認密碼」必須等於「密碼」
  • 「勾選訂閱電子報」時,「Email」才必填
  • 「輸入數量」僅當「產品編號」存在時必填
  • 「身高 ≥ 60 吋」才能選擇「NBA 控球後衛」

validwhen 以布林運算式表達跨欄位條件,極大擴展驗證表達力。

核心語法

在 validation.xml 定義 var 名為 test,值為布林運算式:

<field depends="validwhen" property="emailAddress">
    <var>
        <var-name>test</var-name>
        <var-value>((sendNewsletter == null) or (*this* != null))</var-value>
    </var>
</field>

運算式元素速查表

符號含義範例
*this*當前被驗證欄位的值*this* != null
fieldName表單其他欄位值(同層級)sendNewsletter == null
fieldName[index]顯式索引陣列欄位childLastName[2]
fieldName[]隱式索引(與當前欄位同索引)orderLines[].partNumber
null空字串或未輸入partNumber == null
字串常值單/雙引號括起status == 'active'
數值常值十/十六/八進位age > 18
運算子and or not = != > < >= <=(a = 1) and (b != null)

實戰範例解析

範例 1:條件必填 — 訂閱才驗證 Email

<field depends="validwhen" property="emailAddress">
    <var-value>(sendNewsletter == null) or (*this* != null)</var-value>
</field>

邏輯:未勾選訂閱(sendNewsletter == null)或 Email 已填 → 驗證通過。否則失敗。

範例 2:索引屬性 — 明細行數量依賴產品編號

<field depends="validwhen" property="quantity" indexedListProperty="orderLines">
    <var-value>(orderLines[].partNumber == null) or (*this* != null)</var-value>
</field>

indexedListProperty 指定父層集合屬性,orderLines[].partNumber 表示同一索引的產品編號。邏輯:該行無產品編號 或 數量已填 → 通過。

範例 3:數值比較 — 身高限制角色選擇

<field depends="validwhen" property="nbaPointGuard">
    <var-value>(heightInInches >= 60) or (*this* == null)</var-value>
</field>

邏輯:身高達標 或 未選擇該角色 → 通過。若身高 < 60 卻勾選 → 失敗。

進階技巧

  1. 多條件組合:(A = 'X' and B != null) or (A != 'X' and *this* == null)
  2. 搭配 mask 正則:先 validwhen 判斷是否需驗證,再 mask 檢查格式
  3. 巢狀索引:parent[].child[].field 需對應 indexedListProperty 層層設定

遷移至現代框架

  • Struts 2:使用 OGNL 運算式於 validate() 方法或註解 @Validations
  • Spring MVC:@Valid + JSR-303 Bean Validation,自訂 ConstraintValidator 實現跨欄位邏輯
  • 前端驗證:Vue/React 結合 Yup/Zod Schema,即時回饋

總結

validwhen 以聲明式布林運算式解決條件式驗證,減少 Java 代碼量。掌握 *this*、索引引用、null 語意是關鍵。雖 Struts 1 已淘汰,但其設計思想在現代驗證框架中依然可見。

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