日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

9、 Struts2验证(声明式验证、自定义验证器)

發(fā)布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.xml User_create為action 請求的名稱
        • 不帶別名的配置文件: ActionClassName-validation.xml 中的驗證規(guī)則依然會發(fā)生作用. 可以把各個 action 公有的驗證規(guī)則配置在其中. 但需要注意的是, 只適用于某一個 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 文檔即可.
          • 在配置文件中可以定義錯誤消息:
 <!-- 針對 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 請求的別名)

  • 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),官方文檔更加推薦我們使用注解的方式進行驗證
      • 注解方式驗證

  • 短路驗證器
    • <validator …/> 元素和 <field-validator …/> 元素可以指定一個可選的 short-circuit 屬性,該屬性指定該驗證器是否是短驗證器,默認值為 false。
      對同一個字段內(nèi)的多個驗證器,如果一個短路驗證器驗證失敗,其他驗證器不會繼續(xù)校驗
<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里面的配置信息.
  • 示例代碼:
    • 自定義一個 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。