「所有輸入都是邪惡的」——表單作為應用最直接入口,數據驗證至關重要。Struts 2 提供轉換驗證雙重保障、編程式驗證、聲明式驗證框架及客戶端腳本支持,構建完整驗證體系。本文通過實例深度剖析各類驗證機制、執行順序、最佳實踐及國際化配置。
Struts 2 認為類型轉換是驗證前提:只有正確轉換為目標類型,才能進行取值範圍檢查。以 Locale 類型轉換為例:
public class LocaleConverter extends DefaultTypeConverter {
public Object convertValue(Map context, Object value, Class toType) {
if (toType == Locale.class) {
String locale = ((String[])value)[0];
return new Locale(locale.substring(0,2), locale.substring(3));
}
// ...
}
}
驗證執行順序(控制台輸出可見):
conversionError 攔截器封裝為 fieldError。validateXxx()(Xxx 為 Action 方法名)。validate()(實現 Validateable 接口)。execute(),否則返回 input 結果輸出錯誤。
invalid.fieldvalue.屬性名 國際化提示格式錯誤。validate() 中,性能優於反射調用的 validateXxx()。validateXxx()。通過 Action類名-validation.xml 配置,自動由 validation 攔截器處理(位於 conversionError 之後、validateXxx() 之前)。
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN"
"https://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="requiredString">
<field-validator type="requiredstring">
<message>This string is required</message>
</field-validator>
</field>
</validators>
<message> 添加 key 屬性關聯國際化資源。<s:form validate="true"> 引入 JS 驗證腳本(需 <s:head/>)。
驗證配置按類層次自上而下查找,子類自動繼承父類驗證規則,無需重複配置。例如 Dog extends QuadrapedImpl,查找順序:
Animal-validation.xml
Animal-alias-validation.xml
AnimalImpl-validation.xml
...
Dog-validation.xml
Dog-alias-validation.xml
| 類型 | 類名 | 用途 |
|---|---|---|
| required | RequiredFieldValidator | 字段非空 |
| requiredstring | RequiredStringValidator | 字符串非空非空白 |
| int/double/date | IntRangeFieldValidator 等 | 數值/日期範圍 |
| expression | ExpressionValidator | OGNL 表達式驗證 |
| email/url | EmailValidator/URLValidator | 郵箱/URL 格式 |
| visitor | VisitorFieldValidator | 嵌套對象驗證 |
| conversion | ConversionErrorFieldValidator | 類型轉換錯誤處理 |
| stringlength/regex | StringLengthFieldValidator/RegexFieldValidator | 長度/正則 |
詳細用法參考:官方文檔
invalid.fieldvalue.xxx 給出友好格式提示。<message key="..."/> + 資源文件。validate="true" 提升用戶體驗,服務端仍為最終防線。