9、 Struts2验证(声明式验证、自定义验证器)
生活随笔
收集整理的這篇文章主要介紹了
9、 Struts2验证(声明式验证、自定义验证器)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 什么是Struts2 驗證器
- 一個健壯的 web 應(yīng)用程序必須確保用戶輸入是合法、有效的.
- Struts2 的輸入驗證
- 基于
XWork Validation Framework的聲明式驗證:Struts2 提供了一些基于 XWork Validation Framework 的內(nèi)建驗證程序. 使用這些驗證程序不需要編程, 只要在一個 XML 文件里對驗證程序應(yīng)該如何工作作出聲明就可以了. 需要聲明的內(nèi)容包括:- 哪些字段需要進行驗證
- 使用什么驗證規(guī)則
- 在驗證失敗時應(yīng)該把什么樣的出錯消息發(fā)送到瀏覽器端
- 編程驗證:通過編寫代碼來驗證用戶輸入
- 基于
2、聲明式驗證
- 聲明式驗證程序可以分為兩類:
- 字段驗證: 判斷某個字段屬性的輸入是否有效
- 非字段驗證: 不只針對某個字段,而是針對多個字段的輸入值之間的邏輯關(guān)系進行校驗。例如:對再次輸入密碼的判斷。
- 使用一個聲明式驗證程序需要 3 個步驟:
- 確定哪些 Action 字段需要驗證
- 編寫一個驗證程序配置文件. 它的文件名必須是以下兩種格式之一:
- 若一個 Action 類的多個 action 使用同樣的驗證規(guī)則:
ActionClassName-validation.xml - 若一個 Action 類的多個 action 使用 不同 的驗證規(guī)則:
ActionClass-alias-validation.xml- 例如
UserAction-User_create-validation.xmlUser_create為action 請求的名稱 - 不帶別名的配置文件: ActionClassName-validation.xml 中的驗證規(guī)則依然會發(fā)生作用. 可以把各個 action 公有的驗證規(guī)則配置在其中. 但需要注意的是, 只適用于某一個 action 的請求的驗證規(guī)則就不要這里再配置了.
- 例如
- 若一個 Action 類的多個 action 使用同樣的驗證規(guī)則:
- 確定驗證失敗時的響應(yīng)頁面: 在
struts.xml文件中定義一個<result name=“input”>的元素.- 示例代碼 HelloWord
- I. 先明確對哪一個 Action 的哪一個字段進行驗證: age
- II. 編寫配置文件:
- 把 struts-2.3.24.1\apps\struts2-blank\WEB-INF\classes\example 下的 Login-validation.xml 文件復(fù)制到當前 Action 所在的包下.
- 把該配置文件改為: 把 Login 改為當前 Action 的名字.
- 編寫驗證規(guī)則: 參見 struts-2.3.24.1/docs/docs/validation.html 文檔即可.
- 在配置文件中可以定義錯誤消息:
- 示例代碼 HelloWord
<!-- 針對 age 屬性進行驗證. 基于字段的驗證 -->
<field name="age"><field-validator type="int"><param name="min">20</param><param name="max">60</param><message>年齡范圍在${min}-${max}中!</message></field-validator>
</field> - 錯誤消息還可以國際化
<message key="error.int"/>- 再在國際化文件中加入鍵值對:
error.int=年齡范圍在${min}-${max}中!
- 若驗證失敗, 則轉(zhuǎn)向 input 的那個 result. 所以需要配置 name=input 的 result
<result name="input">/validation.jsp</result>
- 如何顯示錯誤消息呢 ?
- 若使用的是非 simple, 則自動顯示錯誤消息.
- 若使用的是 simple 主題, 則需要 s:fielderror 標簽或直接使用 EL 表達式(使用 OGNL)
${fieldErrors.age[0] }OR<s:fielderror fieldName="age"></s:fielderror>
- 如果對于同一個Action類下,想對不同的 action 請求應(yīng)答,多個 action 請求使用不同的驗證規(guī)則,怎么辦呢?
- 可以為每一個不同的 action 清秀定義其對應(yīng)的驗證文件:
ActionClassName-AliaseName-validation.xml(AliaseName 為action 請求的別名)
- 可以為每一個不同的 action 清秀定義其對應(yīng)的驗證文件:
- Struts2 內(nèi)建的驗證規(guī)則
* conversion validator:轉(zhuǎn)換驗證器* date validator:日期驗證器* double validator:浮點驗證器* email validator:email 驗證器* expression validator:表達式驗證器* fieldexpression validator:字段表達式驗證器* int validator:整型驗證器* regex validator:正則表達式驗證器* required validator:非空驗證器* requiredstring validator:非空字符串驗證器* stringlength validator:字符串長度驗證器* url validator:url 格式驗證器* visitor validator:復(fù)合屬性驗證器 - Struts2 聲明式驗證原理解析
- Struts2 的 Validation 攔截器負責加載和執(zhí)行已注冊的驗證程序,它是 defaultStack 攔截器的一員
- 每個驗證規(guī)則都對應(yīng)一個具體的驗證器,在
xwork-core-2.3.16.3.jar!/com/opensymphony/xwork2/validator/validators/default.xml有對應(yīng)的關(guān)聯(lián)關(guān)系
- 配置文件與驗證器屬性
- Struts2 內(nèi)建的驗證程序
- required: 確保某給定字段的值不是空值 null “”
- requiredstring: 確保某給定字段的值既不是空值 null, 也不是空白.
- trim 參數(shù). 默認為 true, 表示 struts 在驗證該字段值之前先剔除前后空格.
- stringlength: 驗證一個非空的字段值是不是有足夠的長度.
- minLength: 相關(guān)字段的最小長度. 若沒有給出這個參數(shù), 該字段將沒有最小長度限制
- maxLength:相關(guān)字段的最大長度. 若沒有給出這個參數(shù), 該字段將沒有最大長度限制
- trim: 在驗證之前是否去除前后空格
- date: 確保某給定日期字段的值落在一個給定的范圍內(nèi)
- max:相關(guān)字段的最大值. 若沒給出這個參數(shù), 該字段將沒有最大值限制
- min:相關(guān)字段的最小值. 若沒給出這個參數(shù), 該字段將沒有最小值限制
- email: 檢查給定 String 值是否是一個合法的 email
- url: 檢查給定 String 值是否是一個合法的 url
- regex: 檢查某給定字段的值是否與一個給定的正則表達式模式相匹配.
- expresssion*: 用來匹配的正則表達式
- caseSensitive: 是否區(qū)分字母的大小寫. 默認為 true
- trim: 是否去除前后空格. 默認為 true
- int: 檢查給定整數(shù)字段值是否在某一個范圍內(nèi)
- min: 相關(guān)字段的最小值. 若沒給出這個參數(shù), 該字段將沒有最小值限制
- max: 相關(guān)字段的最大值. 若沒給出這個參數(shù), 該字段將沒有最大值限制
- conversion: 檢查對給定 Action 屬性進行的類型轉(zhuǎn)換是否會導(dǎo)致一個轉(zhuǎn)換錯誤. 該驗證程序還可以在默認的類型轉(zhuǎn)換消息的基礎(chǔ)上添加一條自定義的消息
- expression 和 fieldexpression: 用來驗證給定字段是否滿足一個 OGNL 表達式.
- 前者是一個非字段驗證程序, 后者是一個字段驗證程序.
- 前者在驗證失敗時將生成一個 action 錯誤, 而后者在驗證失敗時會生成一個字段錯誤
- expression*: 用來進行驗證的 OGNL 表達式
- 使用Annotations驗證
- 實際上,我們查看 struts2 官方文檔發(fā)現(xiàn),官方文檔更加推薦我們使用注解的方式進行驗證
- 注解方式驗證
- 實際上,我們查看 struts2 官方文檔發(fā)現(xiàn),官方文檔更加推薦我們使用注解的方式進行驗證
- 短路驗證器
- <validator …/> 元素和 <field-validator …/> 元素可以指定一個可選的 short-circuit 屬性,該屬性指定該驗證器是否是短驗證器,默認值為 false。
對同一個字段內(nèi)的多個驗證器,如果一個短路驗證器驗證失敗,其他驗證器不會繼續(xù)校驗
- <validator …/> 元素和 <field-validator …/> 元素可以指定一個可選的 short-circuit 屬性,該屬性指定該驗證器是否是短驗證器,默認值為 false。
<field-validator type="int" short-circuit="true">
<validator type="email" short-circuit="true"> <!-- 針對 age 屬性進行驗證. 基于字段的驗證 -->
<field name="age"><!-- 設(shè)置短路驗證,當前驗證未通過,不進行后面的驗證 --><field-validator type="conversion" short-circuit="true"><message>當前年齡無法讀取!</message></field-validator><field-validator type="int"><param name="min">20</param><param name="max">60</param><message key="error.int" /></field-validator>
</field> - 若類型轉(zhuǎn)換失敗, 默認情況下還會執(zhí)行后面的攔截器, 還會進行 驗證. 可以通過修改
ConversionErrorInterceptor源代碼的方式使- 當類型轉(zhuǎn)換失敗時, 不再執(zhí)行后續(xù)的驗證攔截器, 而直接返回 input 的 result
Object action = invocation.getAction();
if (action instanceof ValidationAware) {ValidationAware va = (ValidationAware) action;if(va.hasErrors() || va.hasActionErrors()){return "input";}
} - 非字段驗證
<!-- 非字段驗證 -->
<validator type="expression"><param name="expression"><![CDATA[password==repassword]]></param><message>Password is not equals to repassword</message>
</validator> - 顯示非字段驗證的錯誤消息, 使用 s:actionerror 標簽:
<s:actionerror/>
- 字段驗證 vs 非字段驗證
- 字段驗證字段優(yōu)先,可以為一個字段配置多個驗證規(guī)則
- 非字段驗證驗證規(guī)則優(yōu)先
- 大部分驗證規(guī)則支持兩種驗證器,但個別的驗證規(guī)則只能使用非字段驗證,例如 表達式驗證
- 錯誤消息的重用性
- 多個字段使用同樣的驗證規(guī)則,可否使用同一條驗證消息 ?
<!-- 針對 age 屬性進行驗證. 基于字段的驗證 -->
<field name="age"><!-- 設(shè)置短路驗證,當前驗證未通過,不進行后面的驗證 --><field-validator type="conversion" short-circuit="true"><message>當前年齡無法讀取!</message></field-validator><field-validator type="int"><param name="min">20</param><param name="max">60</param><message key="error.int" /></field-validator>
</field>
<field name="count"><field-validator type="int"><param name="min">1</param><param name="max">10</param><message key="error.int"></message></field-validator>
</field> # i18n
age=年齡
count=數(shù)量
#fieldName為檢驗時傳遞過來的filed,對應(yīng)age=年齡 count=數(shù)量
error.int=${getText(fieldName)}范圍在${min}-${max}中! - 自定義驗證器
- 自定義驗證器必須實現(xiàn) Validator 接口.
- ValidatorSupport 和 FieldValidatorSupport 實現(xiàn)了 Validator 接口
- 若需要普通的驗證程序, 可以繼承 ValidatorSupport 類
- 若需要字段驗證程序, 可以繼承 FieldValidatorSupport 類
- 若驗證程序需要接受一個輸入?yún)?shù), 需要為這個參數(shù)增加一個相應(yīng)的屬性
- 注冊驗證程序:
- 自定義驗證器需要在類路徑里的某個 validators.xml 文件里注冊:
- 驗證框架首先在根目錄下找validators.xml文件,沒找到validators.xml文件,
- 驗證框架將調(diào)用默認的驗證設(shè)置,即default.xml里面的配置信息.
- 自定義驗證器需要在類路徑里的某個 validators.xml 文件里注冊:
- 示例代碼:
- 自定義一個 18 位身份證驗證器
- 編寫驗證器類
public class IDCardValidation extends FieldValidatorSupport {@Overridepublic void validate(Object object) throws ValidationException {//1、獲取字段名稱String fieldName = getFieldName();//2、獲取值Object value = this.getFieldValue(fieldName, object);//3、驗證IDCard idCard = new IDCard();boolean result = idCard.Verify(value.toString());//4、驗證失敗加入錯誤消息if (!result) {addFieldError(fieldName, object);}}
} - 在 validators.xml 文件中進行注冊
- 參考 /com/opensymphony/xwork2/validator/validators/default.xml
<validators><validator name="idCard"class="org.pan.validation.app.MyValidation.IDCardValidation"></validator>
</validators> - 在驗證配置文件中使用
<!-- 測試自定驗證器 -->
<field name="idCard"><field-validator type="idCard"><message>This is Not IDCard</message></field-validator>
</field> - 編程驗證
- Struts2 提供了一個 Validateable 接口, 可以使 Action 類實現(xiàn)這個接口以提供編程驗證功能.
- ActionSupport 類已經(jīng)實現(xiàn)了 Validateable 接口
轉(zhuǎn)載于:https://www.cnblogs.com/MPPC/p/6130112.html
總結(jié)
以上是生活随笔為你收集整理的9、 Struts2验证(声明式验证、自定义验证器)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP基础概念及通信过程举例
- 下一篇: php 文件限速下载代码