1. 程式人生 > >struts2之宣告式驗證

struts2之宣告式驗證

struts2框架中提供大量的內建校驗器,使用時只需對這些校驗進行配置,我們管這種方式叫做宣告驗證。其實這個流程和之前介紹的程式設計驗證是一樣的,可以參考之前輸入驗證的流程。


一.編寫配置檔案:
檔名為ActionClassName-validation.xml,與要驗證屬性的Action在同一目錄下,編寫驗證的規則可以參見struts-2.3.4/docs/WW/validation.html文件。

這些驗證器的配置有兩種方式:欄位驗證 和 非欄位驗證。欄位驗證欄位優先,可以為一個欄位配置多個驗證規則;非欄位驗證驗證規則優先,不只針對某個欄位,而是針對多個欄位的輸入值之間的邏輯關係進行校驗。

先以註冊的邏輯為例看一下這兩種方式(以requiredstring驗證為例):

Action類:

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport{

	private static final long serialVersionUID = 1L;
	
	private String name;
	private String password;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	@Override
	public String execute() throws Exception {
		System.out.println(name+password);
		return SUCCESS;
	}
	
}

配置action:

<action name="register" class="com.struts.validate.RegisterAction">
        <result name="success">/success.jsp</result>
        <result name="input">/register.jsp</result>
</action>
配置驗證:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  		"-//Apache Struts//XWork Validator 1.0.3//EN"
  		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
  		
<validators>
	<!--  欄位驗證
	<field name="name">
		<field-validator type="requiredstring">
			<message>姓名不能為空</message>
		</field-validator>
	</field>
	<field name="password">
		<field-validator type="requiredstring">
			<message>密碼不能為空</message>
		</field-validator>
	</field>
	-->
	
	<!-- 非欄位驗證 -->
	<validator type="requiredstring">
		<param name="fieldName">name</param>
		<message>姓名不能為空</message>
	</validator>
	<validator type="requiredstring">
		<param name="fieldName">password</param>
		<message>密碼不能為空</message>
	</validator>

</validators>

jsp頁面:

<s:form action="register">
		<s:textfield name="name" label="name"></s:textfield>
		<s:password name="password" label="password"></s:password>
	
		<s:submit></s:submit>
	</s:form>

兩種配置方式的結果都一樣:


那麼我們可以比較一下這兩種方式:

前面說過struts2中的轉換器有兩種配置方式,一種是基於欄位轉換,另一種是基於型別的轉換。我覺得可以類比一下,欄位驗證先指定校驗的屬性,非欄位驗證先指定校驗器。

二.幾種常用驗證器的簡單例子

Action類:

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	private String name;
	private int age;
	private Date birth;
	private String email;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@Override
	public String execute() throws Exception {
		System.out.println("name="+name+"  age="+age+"  birth="+birth
				+" email="+email);
		return SUCCESS;
	}
	
}

配置action:

<action name="regValidate" class="com.struts.validatetype.RegisterAction">
       	<result name="success">/success.jsp</result>
       	<result name="input">/regvalidate.jsp</result>
</action>

配置驗證:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
  		"-//Apache Struts//XWork Validator 1.0.3//EN"
  		"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
  		
<validators>
	<!-- 以下的例子都以基於欄位驗證為例 -->
	<field name="name">
		<!-- requiredstring:確保某給定欄位的值既不是空值 null, 也不是空白. 
			trim 引數. 預設為 true, 表示 struts 在驗證該欄位值之前先剔除前後空格. 
		 -->
		<field-validator type="requiredstring">
			<param name="trim">true</param>
			<message>姓名不能為空</message>
		</field-validator>
		<!-- stringlength: 驗證一個非空的欄位值是不是有足夠的長度. 
			minLength: 相關欄位的最小長度. 若沒有給出這個引數, 該欄位將沒有最小長度限制
			maxLength:相關欄位的最大長度. 若沒有給出這個引數, 該欄位將沒有最大長度限制
			trim: 在驗證之前是否去除前後空格
		 -->
		<field-validator type="stringlength">
			<param name="maxLength">15</param>
			<param name="minLength">6</param>
			<message>姓名長度在${minLength}與${maxLength}之間</message>
		</field-validator>
	</field>
	<field name="age">
		<!-- int:檢查給定整數字段值是否在某一個範圍內
			min: 相關欄位的最小值. 若沒給出這個引數, 該欄位將沒有最小值限制
			max: 相關欄位的最大值. 若沒給出這個引數, 該欄位將沒有最大值限制
		 -->
		<field-validator type="int">
			<param name="max">30</param>
			<param name="min">20</param>
			<message>年齡必須在${min}與${max}之間</message>
		</field-validator>
	</field>
	<field name="birth">
		<!-- date: 確保某給定日期欄位的值落在一個給定的範圍內
			max:相關欄位的最大值. 若沒給出這個引數, 該欄位將沒有最大值限制
			min:相關欄位的最小值. 若沒給出這個引數, 該欄位將沒有最小值限制 -->
		<field-validator type="date">
			<param name="min">1970-1-1</param>
			<param name="max">2000-12-12</param>
			<message>生日應在${min}與${max}之間</message>
		</field-validator>
	</field>
	<field name="email">
		<!-- email: 檢查給定 String 值是否是一個合法的 email -->
		<field-validator type="email">
			<message>郵箱格式錯誤</message>
		</field-validator>
	</field>

</validators>

jsp頁面:

<s:form action="regValidate">
	<s:textfield name="name" label="name"></s:textfield>
	<s:textfield name="age" label="age"></s:textfield>
	<s:textfield name="birth" label="birth"></s:textfield>
	<s:textfield name="email" label="email"></s:textfield>
			
	<s:submit></s:submit>
</s:form>

顯示結果:


從結果中可以看出這些常用驗證器已經起到了驗證效果,驗證器的使用及表示意義在配置驗證檔案中可以看到。

三.宣告式驗證框架的原理:

struts2 預設的攔截器棧中提供了一個 validation 攔截器,每個具體的驗證規則都會對應具體的一個驗證器. 有一個配置檔案把驗證規則名稱和驗證器關聯起來了. 而實際上驗證的是那個驗證器. 該檔案是com.opensymphony.xwork2.validator.validators 下的 default.xml,

截圖:



宣告式校驗的基本配置和幾種常用的校驗器就總結到這,之後會一一介紹一些特殊的驗證及自定義驗證器,fight!!!