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);
}
}
}
成功結束!