一、沒有使用框架情況下,在目標方法處,通過手動的編寫代碼來進行驗證
二、Struts2
1.支持聲明式驗證,即通過配置的方式來驗證。需要實現接口 ValidationAware,依賴於兩個攔截器 validation 和 workflow 攔截器。
validation 攔截器:進行驗證和創建字段錯誤列表
workflow 攔截器:檢查 validation 攔截器發現的錯誤,如果發現,返回 "input"(默認)result。
如果沒有指定 name=input 對應的 result ,則返回一個錯誤消息告訴我們 "there's no "input" result defined for the action"。
2. Struts2 默認的驗證器
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator Definition 1.0//EN" "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd"> <validators> <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/> <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/> <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/> <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/> <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/> <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/> <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/> <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/> <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/> <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/> <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/> <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/> <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/> <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/> <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/> <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/> </validators>
3.驗證規則配置文件
(1)位置:在需要驗證的 Action 同包下。
(2)當前 Action 類所有 action 使用同樣的驗證規則:Action簡單類名-validation.xml
(3)當前 Action 類某個 action 使用具體的驗證規則:Action簡單類名-ActionName-validation.xml
4. 驗證分類
(1)字段驗證(Field Validator Syntax)
e1:驗證 myPurchaseCode 字段長度必須為10
<validators> <field name="myPurchaseCode"> <field-validator type="stringlength"> <param name="minLength">10</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>Your purchase code needs to be 10 characters long</message> </field-validator> </field> </validators>
e1:驗證 age 必須在 20 到 50 之間
<validators> <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> </validators>
(2)類型驗證(Plain Validator Syntax)
e1:驗證 myPurchaseCode 字段長度必須為10:
<validators> <validator type="stringlength"> <param name="fieldName">myPurchaseCode</param> <param name="minLength">10</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>Your purchase code needs to be 10 characters long</message> </validator> </validators>
e2:驗證 age 必須在 20 到 50 之間
<validators> <validator type="int"> <param name="fieldName">age</param> <param name="min">20</param> <param name="max">50</param> <message>Age needs to be between ${min} and ${max}</message> </validator> </validators>
(3)表達式驗證
e:判斷密碼和確認密碼輸入是否一致
<validators> <validator type="expression"> <param name="expression"><![CDATA[pwd==pwdConfirm]]></param> <message>密碼和確認密碼不一致</message> </validator> </validators>
其中:<param name="expression"> 標簽體中的內容會自動進行 OGNL 解析。
5.短路驗證:
對於同一個字段進行多個規則驗證,如果第一個驗證沒有通過,則後續的規則不進行驗證。
只需要在 validator 或 field-validator 標簽內加入 short-circuit 屬性並設置為 true 即可。
如:
<validators> <field name="email"> <field-validator type="stringlength" short-circuit="true"> <param name="minLength">4</param> <param name="maxLength">10</param> <param name="trim">true</param> <message>email length must between ${minLength} and ${maxLength}</message> </field-validator> <field-validator type="email"> <message>Must provide a valid email</message> </field-validator> </field> </validators> email validate6.類型轉換失敗提示與驗證出錯提示消息
struts2 默認的攔截器棧為 defaultStack,規定了 conversionError 攔截器在 validation 攔截器之前執行。但是 conversionError 攔截器攔截到類型轉換出錯的消息,並不會返回 "input",而是繼續讓proxy調用後續的攔截器。
這裡的源碼我們不能進行更改,但是我們可以仿造一個,類的加載順序是采取的就近原則。所以我們在項目的 src 目錄下,新建與 conversionError 攔截器對應的目錄結構,然後修改 conversionError 攔截器代碼。
7.對 Action 類的要求
要驗證的字段,必須提供 getXxx() 和 setXxx() 方法,getXxx() 方法用於 validate 攔截器進行比較驗證。
8.一個簡單的例子:
<s:form action="/validateNum"> <s:textfield name="age" label="age"/> <s:submit label="submit"/> </s:form> form 表單 <!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN" "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators> <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> </validators> ValidateAction-validation.xml <struts> <package name="default" namespace="/" extends="struts-default"> <action name="validateNum" class="com.nucsoft.struts.ValidateAction"> <result>/success.jsp</result> <result name="input">/index.jsp</result> </action> </struts> struts.xml9.自定義驗證器
(1)普通的驗證器繼承 ValidatorSupport 類,字段驗證程序繼承 FieldValidatorSupport。如需要提供參數,提供 setXxx() 方法,如錯誤消息要獲取驗證器類中的屬性,提供對應的 getXxx() 方法。
(2)注冊驗證器類:在類路徑根目錄下新建 validators.xml ,內容可以參考 default.xml 文件裡的配置信息。(驗證框架首先在根目錄下查找validators.xml文件,找不到則調用默認的驗證設置)
(3)正常使用
10.編程式驗證:
Struts2提供了一個 Validateable 接口,Action 類可以實現這個接口中的 validate() 方法,在其中編寫驗證邏輯。ActionSupport 類已經實現了 Validateable 接口。
未完,待續