1. 程式人生 > >Struts2 申明式驗證詳細介紹

Struts2 申明式驗證詳細介紹

驗證的方式有兩種,一個是申明式驗證,還有一種是寫程式碼驗證


我們今天學習的是申明式驗證

首先要明確,要驗證的Action物件,對Action物件進行申明配置,

Action物件程式碼如下

package cn.com.app;
import com.opensymphony.xwork2.ActionSupport;
public class TextValidation extends ActionSupport {
	private static final long serialVersionUID = 1L;
	/*
	 * author:命運的信徒 date:2018/12/17 arm:申明式的驗證
	 */
	private int age;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String execute() {
		System.out.println("age:" + age);
		return SUCCESS;
	}
}

然後在struts2-blank-2.3.36\WEB-INF\classes\example下面找到Login-validation.xml這個檔案,複製貼上

把字首名改成了Action類名一樣,並且把裡面的內容剔除一下

 

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
   
</validators>

配置之後的內容如下

<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>
   <!--  針對age屬性進行驗證-->
   <field name="age">
   <field-validator type="int">
   <param name="min">20</param>
   <param name="max">50</param>
   <message>age need to be between ${min} and ${max}</message>
   </field-validator>
   </field>
</validators>

 有一點需要注意,如果age的型別是Integer的話,就會有問題,不知道為什麼?

原因:驗證攔截器裡面沒有integer屬性的

只有如下屬性的:

<?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">

<!-- START SNIPPET: validators-default -->
<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>
<!--  END SNIPPET: validators-default -->

jsp頁面如下

<s:form action="mag.action">
  <s:textfield label="age" name="age"></s:textfield>
  <s:submit></s:submit>
  </s:form>

struts.xml相關的檔案如下


<action name="mag" class="cn.com.app.TextValidation">
<result name="input">/i18n.jsp</result>
<result>/success.jsp</result>
</action>

測試效果如下


現在總結一下步驟:

申明式驗證的步驟如下

1、明確要驗證的物件age

2、對Action類進行配置,配置就是

然後在struts2-blank-2.3.36\WEB-INF\classes\example下面找到Login-validation.xml這個檔案,複製貼上

把Login改成了Action類名一樣,並且把裡面的內容剔除一下

3、在頁面上顯示錯誤資訊

如果是非simple主題的話,錯誤資訊就會自動顯示出來

如果是simple主題的話,就需要通過  <s:fielderror fieldName="age"></s:fielderror>或者${fieldErrors.age[0]}來顯示

4、錯誤資訊可以修改麼?

可以,

 <!--  針對age屬性進行驗證-->
   <field name="age">
   <field-validator type="int">
   <param name="min">20</param>
   <param name="max">50</param>
   <message>age need to be between ${min} and ${max}</message>
   </field-validator>
   </field>

5、錯誤資訊提示可以國際化麼?

可以

第一步、設定key

   <message key="error_age"></message>

第二步 在國際化配置檔案裡面新增

error_age=age need to be between ${min} and ${max}

就可以了

具體的國際化,怎麼國際化,請看https://blog.csdn.net/qq_37591637/article/details/85045963

<!--  針對age屬性進行驗證-->

待驗證的欄位
   <field name="age">

驗證規則
   <field-validator type="int">

向驗證程式傳遞引數
   <param name="min">20</param>
   <param name="max">50</param>

定義驗證程式出錯的訊息
   <message key="error_age"></message>
   </field-validator>
   </field>

注意:若一個Action類有多個action請求,多個action請求的驗證規則不同怎麼辦?

帶有別名:

那就使用ActionClassname-actionname-validation.xml為不同的action請求定義其驗證檔案

ActionClassname:Action類名

actionname是請求的名稱

不帶別名的配置檔案:

ActionClassname-validation.xml中的驗證規則依然起作用,可以把各個action、請求公共的部分放在裡面;


申明式驗證框架的原理

》struts2攔截機制提供了validation攔截器

>每個具體的驗證規則都忽悠對應具體的一個驗證器,有一個配置檔案會把驗證名稱和驗證器關聯起來

改檔案位於com.opensymphony.xwork2.validator.validators下面的default.xml檔案中