無 Validator 時,需在 Form Bean 的 validate() 手寫所有驗證邏輯與錯誤訊息儲存。有了 Validator,Form Bean 繼承 Validator 提供的 ActionForm 子類,框架自動處理驗證與錯誤訊息,無需撰寫驗證代碼。
Validator 為可插拔驗證例行程式系統,每個例行程式為一 Java 方法,預設內建常用驗證(required、email、creditCard 等),支援伺服端與客戶端(JavaScript)雙重驗證。
struts-config.xml 的 Form Bean 邏輯名稱關聯。<!-- 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>
public class LogonForm extends ValidatorForm {
private String username, password;
// getter/setter,無需實作 validate()/reset()
}
<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>
同一 Form Bean 用於多個 Action 時,部分欄位僅特定 Action 需驗證。解決方案:
ValidatorActionForm 或使用 DynaValidatorActionForm。validation.xml 中 <form name="/actionPath"> 對應 Action 路徑而非 Form Bean 名稱。<action-mappings>
<action path="/createAddress" ... name="addressForm"/>
<action path="/editAddress" ... name="addressForm"/>
</action-mappings>
<form-validation>
<formset>
<form name="/createAddress"> ... </form>
<form name="/editAddress"> ... </form>
</formset>
</form-validation>
<!DOCTYPE form-validation PUBLIC ...>
<form-validation>
<formset>
<form name="LogonForm">
<field property="username" depends="required">
<arg0 key="prompt.username"/>
</field>
<field property="password" depends="required,minlength">
<arg0 key="prompt.password"/>
<arg1 key="${var:minlength}" name="minlength"/>
<var>
<var-name>minlength</var-name>
<var-value>6</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
depends:引用 validator-rules.xml 中的邏輯名稱,可串聯多個驗證。arg0~arg3:對應錯誤訊息佔位符 {0}~{3},key 指向 ApplicationResources.properties 鍵值。# ApplicationResources.properties
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
# ... 其他預設訊息
Validator 透過資源綁定機制實現國際化錯誤訊息,避免硬編碼。