struts2之宣告式驗證
阿新 • • 發佈:2019-01-09
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!!!