1. 程式人生 > >Struts2 如何自定義一個驗證器

Struts2 如何自定義一個驗證器


為什麼定義一個驗證器?

雖然struts攔截器棧裡面有很多的驗證器,但是都是比較公共的,沒有為某個屬性專門做的,例如校驗18位的身份證;


如何定一個驗證器?

1、定義一個驗證器的類

實現一個介面 validator<T>,可以選擇實現ValidatorSupport類或FieldValidatorSupprot類

  • 若希望實現一般的驗證器可以繼承ValidatorSupport類
  • 若希望實現一個欄位驗證器,則可以繼承FieldValidatorSupprot類

具體是實現可以參考已經有的驗證器

2、在配置檔案中配置驗證器

預設情況下·,Struts2會在類路徑根目錄下面載入validators.xml檔案,在該檔案中載入驗證器

該檔案的定義方式同預設的驗證器的那個配置檔案com.opensymphony.xwork2.validator.validators下面的default.xml

若類路徑下面沒有指定的驗證器,則從原始檔中找

3、使用和目前的驗證器一樣


示例程式碼

開啟D:\workspace\LX\WebRoot\WEB-INF\lib\xwork-core-2.3.36.jar包

複製 RequiredFieldValidator,open type,開啟類

 

複製如下程式碼,以下是獲取欄位名和欄位值的程式碼

 

在src目錄下面,新建一個validators.xml檔案

把default.xml檔案裡面的內容複製過來

注意:

1、name="haha"是你自定義的攔截型別的名稱 calss是攔截的類的全路徑

<?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="haha"	class="cn.com.stack.Identify" />
</validators>
<!--  END SNIPPET: validators-default -->
   

 

Identify.java

注意:繼承FieldValidatorSupport類,重寫方法,可以參考以下default.xml中的RequiredFieldValidator類

package cn.com.stack;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class Identify extends FieldValidatorSupport {
	/*
	 * author:命運的信徒 date:2018/12/18 arm:自定義一個驗證器,校驗18位的身份證
	 */
	@Override
	public void validate(Object object) throws ValidationException {
		// 1.獲取欄位的名字和值
		String fieldName = getFieldName();
		Object value = this.getFieldValue(fieldName, object);
		// 2.驗證
		Idcard ca = new Idcard();
		boolean result = ca.getresult((String)value);
		// 3.若驗證失敗,則...
		System.out.println("result:"+result);
		if (!result) {
			addFieldError(fieldName, object);
		}
	}
}

我這裡寫了一個類,就是什麼樣的id是合法的,什麼樣的不是合法的

我寫的比較簡單,只是想要了解一下這個自制攔截器的機制

Idcard.java

package cn.com.stack;
public class Idcard {
	private boolean result;
	public boolean getresult(String s) {
		if (s.equals("342823199607253724")) {
			result = true;
		} else {

			result = false;
		}

		return result;
	}
}

基本的自制攔截器已經差不多了,現在就是如果出錯了,顯示錯誤資訊的處理了,也就是驗證資訊;

確認要驗證的欄位

package cn.com.app;

import com.opensymphony.xwork2.ActionSupport;

public class Goods extends ActionSupport {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/*
	 * author:命運的信徒 date:2018/12/18 arm:相同的驗證規則使用同一條相應訊息
	 */
	/*private int goodnum;
	private int goodprice;*/
    private String id;
    
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	// 1.根據請求找到struts.xml檔案
	// 2.根據請求的地址找到Action類
	// 3.第一步,params攔截器賦值
	// 4.執行到validation攔截器,欄位的驗證
	/*public int getGoodnum() {
		return goodnum;
	}

	public void setGoodnum(int goodnum) {
		this.goodnum = goodnum;
	}

	public int getGoodprice() {
		return goodprice;
	}

	public void setGoodprice(int goodprice) {
		this.goodprice = goodprice;
	}*/

}

驗證的配置資訊檔案



<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
	<!-- 針對goodnum goodprice屬性進行驗證 -->
<!-- 	<field name="goodprice">
		-欄位範圍內
		<field-validator type="int">
			<param name="min">20</param>
			<param name="max">50</param>
			<message key="error_age"></message>
		</field-validator>
	</field>
	<field name="goodnum">
		-欄位範圍內
		<field-validator type="int">
			<param name="min">10</param>
			<param name="max">20</param>
			<message key="error_age"></message>
		</field-validator>
	</field> -->
	<field name="id">
		<!-- -欄位範圍內 -->
		<field-validator type="haha">
			<message>該使用者身份證號不存在</message>
		</field-validator>
	</field>
</validators>







頁面

<body>
<h4>自定義一個驗證器,校驗18位的身份證</h4>
<s:form action="good.action">
<s:textfield label="請輸入身份證" name="id"></s:textfield>
<s:submit></s:submit>
<s:fielderror fieldName="id"></s:fielderror>
</s:form>
</body>

 

 


 以上是學習的過程,可能比較混亂;

我們來整理一下,整個執行的過程;

首先在頁面上

請輸入身份證:**************

提交,向攔截器傳送請求,如果是jsp或者是html請求就直接過濾掉,如果是struts2請求的話,就找到配置檔案struts.xml檔案,尋找合適的action請求(name一致)

通過struts.xml檔案找到相應的Action類

首先由params攔截器給id賦值

這時候id的值就是你在前臺頁面輸入的字串;

這個Goods.java檔案有相應的校驗的機制

找到和欄位名一致的field,根據欄位校驗的型別我們是haha,找校驗的類

一般先從類的包下面找,然後在是根目錄,如果都沒找到,再去jar包下面找

我們自制校驗器,都會在src根目錄下面配置一個validators.xml,記住名字不是隨意更改的

內容如下

記住,只是裡面的name和class不一樣

name="haha"和Goods-validation.xml裡面的type="haha"是一致的

class="校驗的內容的類的全路徑"

<?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="haha"	class="cn.com.stack.Identify" />
</validators>
<!--  END SNIPPET: validators-default -->
   

Identify.java

怎麼校驗?

1、繼承ValidationException類

2、實現方法

package cn.com.stack;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class Identify extends FieldValidatorSupport {
	/*
	 * author:命運的信徒 date:2018/12/18 arm:自定義一個驗證器,校驗18位的身份證
	 */
	@Override
	public void validate(Object object) throws ValidationException {
		// 1.獲取欄位的名字和值
		String fieldName = getFieldName();
		Object value = this.getFieldValue(fieldName, object);
		// 2.驗證
		Idcard ca = new Idcard();
		boolean result = ca.getresult((String)value);
		// 3.若驗證失敗,則...
		System.out.println("result:"+result);
		if (!result) {
			addFieldError(fieldName, object);
		}
	}
}

成功結束!