1. Struts2 的驗證(note6,struts2-8)html
1). 驗證分爲兩種:express
> 聲明式驗證*
>> 對哪一個 Action 或 Model 的那個字段進行驗證
>> 使用什麼驗證規則
>> 若是驗證失敗, 轉向哪個頁面, 顯示是什麼錯誤消息
> 編程式驗證
2). 聲明式驗證的 helloworld編程
I. 先明確對哪個 Action 的哪個字段進行驗證: age
II. 編寫配置文件:
> 把 struts-2.3.15.3\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件複製到
當前 Action 所在的包下.
> 把該配置文件改成: 把 Login 改成當前 Action 的名字.
> 編寫驗證規則: 參見 struts-2.3.15.3/docs/WW/docs/validation.html 文檔便可.
> 在配置文件中能夠定義錯誤消息:
<field name="age">
<field-validator type="int">
<param name="min">20</param>
<param name="max">50</param>
<message>^^Age needs to be between ${min} and ${max}</message>
</field-validator>
</field>
> 該錯誤消息能夠國際化嗎. 能夠
<message key="error.int"></message>.
再在 國際化資源文件 中加入一個鍵值對: error.int=^^^Age needs to be between ${min} and ${max}
III. 若驗證失敗, 則轉向 input 的那個 result. 因此須要配置 name=input 的 result
<result name="input">/validation.jsp</result>
IV. 如何顯示錯誤消息呢 ? app
> 若使用的是非 simple, 則自動顯示錯誤消息.
> 若使用的是 simple 主題, 則須要 s:fielderror 標籤或直接使用 EL 表達式(使用 OGNL)
${fieldErrors.age[0] }
OR
<s:fielderror fieldName="age"></s:fielderror>*(<s:fielderror /><!-- 不寫fieldName屬性顯示全部的fielderror錯誤 --> )框架
3). 注意: 若一個 Action 類能夠應答多個 action 請求, 多個 action 請求使用不一樣的驗證規則, 怎麼辦 ?jsp
> 爲每個不一樣的 action 請求定義其對應的驗證文件: ActionClassName-AliasName-validation.xml
> 不帶別名的配置文件: ActionClassName-validation.xml 中的驗證規則依然會發生做用. 能夠把各個 action 公有的驗證規則
配置在其中. 但須要注意的是, 只適用於某一個 action 的請求的驗證規則就不要這裏再配置了.
4). 聲明式驗證框架的原理:ui
> Struts2 默認的攔截器棧中提供了一個 validation 攔截器
> 每一個具體的驗證規則都會對應具體的一個驗證器. 有一個配置文件把驗證規則名稱和驗證器關聯起來了. 而實際上驗證的是那個驗證器.
該文件位於 com.opensymphony.xwork2.validator.validators 下的 default.xml
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>xml
5). 短路驗證: 若對一個字段使用多個驗證器, 默認狀況下會執行全部的驗證. 若但願前面的驗證器驗證沒有經過, 後面的就再也不驗證, 可使用短路驗證htm
<!-- 設置短路驗證: 若當前驗證沒有經過, 則再也不進行下面的驗證 -->
<field-validator type="conversion" short-circuit="true">
<message>^Conversion Error Occurred</message>
</field-validator>繼承
<field-validator type="int">
<param name="min">20</param>
<param name="max">60</param>
<message key="error.int"></message>
</field-validator>
6). 若類型轉換失敗, 默認狀況下還會執行後面的攔截器, 還會進行 驗證. 能夠經過修改 ConversionErrorInterceptor 源代碼的方式使
當類型轉換失敗時, 再也不執行後續的驗證攔截器, 而直接返回 input 的 result
Object action = invocation.getAction();
if (action instanceof ValidationAware) {
ValidationAware va = (ValidationAware) action;
if(va.hasFieldErrors() || va.hasActionErrors()){
return "input";
}
}
7). 關於非字段驗證: 不是針對於某一個字段的驗證.
<validator type="expression">
<param name="expression"><![CDATA[password==password2]]></param>
<message>Password is not equals to password2</message>
</validator>
顯示非字段驗證的錯誤消息, 使用 s:actionerror 標籤: <s:actionerror/>
8). 不一樣的字段使用一樣的驗證規則, 並且使用一樣的響應消息 ?
error.int=${getText(fieldName)} needs to be between ${min} and ${max}
age=\u5E74\u9F84
count=\u6570\u91CF
詳細分析參見 PPT 159.
9). 自定義驗證器:
I. 定義一個驗證器的類
> 自定義的驗證器都須要實現 Validator.
> 能夠選擇繼承 ValidatorSupport 或 FieldValidatorSupport 類
> 若但願實現一個通常的驗證器, 則能夠繼承 ValidatorSupport
> 若但願實現一個字段驗證器, 則能夠繼承 FieldValidatorSupport
> 具體實現能夠參考目前已經有的驗證器.
> 若驗證程序須要接受一個輸入參數, 須要爲這個參數增長一個相應的屬性
II. 在配置文件中配置驗證器
> 默認狀況下下, Struts2 會在 類路徑的根目錄下加載 validators.xml 文件. 在該文件中加載驗證器.
該文件的定義方式同默認的驗證器的那個配置文件: 位於 com.opensymphony.xwork2.validator.validators 下的 default.xml
> 若類路徑下沒有指定的驗證器, 則從 com.opensymphony.xwork2.validator.validators 下的 default.xml 中的驗證器加載
III. 使用: 和目前的驗證器同樣.
IV. 示例代碼: 自定義一個 18 位身份證驗證器