struts2:數據校驗,通過XWork校驗框架實現(validation.xml)
根據輸入校驗的處理場所的不同,可以將輸入校驗分為客户端校驗和服務器端校驗兩種。服務器端驗證目前有兩種方式:
第二種:
使用validate()方法校驗時,如果Web應用中存在大量Action就需要多次重寫validate()方法,這使得代碼非常繁瑣。由於Struts2的校驗框架本質上是基於XWork的validato框架,因此可以使用XWork的validator框架來對Struts2進行數據校驗,以減少代碼量。本文即討論此種校驗方式。
1. 前台頁面加入錯誤提示標籤(registerX.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:fielderror/>
<s:form action="registerX" method="post">
賬號:<s:textfield name="username"></s:textfield>
<br/>
密碼:<s:password name="password"></s:password>
<br/>
重複密碼:<s:password name="repassword"></s:password>
<br/>
年齡:<s:textfield name="age"></s:textfield>
<br/>
身高:<s:textfield name="height"></s:textfield>
<br/>
<s:submit value="提交"></s:submit>
<br/>
</s:form>
</body>
</html>
2. 後台action繼承ActionSupport(RegisterXAction.java)
package com.clzhang.ssh.demo1;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterXAction extends ActionSupport {
public static final long serialVersionUID = 1;
private String username;
private String password;
private String repassword;
private Integer age;
private Double height;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
@Override
public String execute() {
System.out.println(username + "|" + age + "|" + height + " register finished!");
return "register";
}
}
3. 增加校驗配置文件(RegisterXAction-validation.xml)
3.1 命名規範
校驗文件命名規則:ActionName-validation.xml,其中ActionName就是需要校驗的action的類名。
如果需要在Action中對某個特定的方法進行校驗,則需要為此特定方法專門定義一個校驗文件(否則,調用默認的)。該文件命名規則為:actionNme-methodNae-validation.xml;同時,還需要在struts.xml文件配置action時指定其method屬性(否則,調用默認的)。
3.2 位置規範
該文件應該與action類的文件位於同一個路徑下。
3.3 該文件的定義
參考:struts-2.3.x\lib\xwork-core-2.3.x.jar包中xwork-validator-1.0.x.dtd文件的描述。
3.4 該文件中validator的種類
參考:xwork-core-2.3.x.jar\com\opensymphony\xwork2\validator\validators中的default.xml文件。
3.5 進行數據校驗遵循的步驟
- Struts2框架中的類型轉換器對HTTP請求的數據進行數據類型轉換,得到符合類型的值,比如本例中age被轉換為int。
- 使用Struts2的XWork校驗框架進行校驗,即根據actionName-validation.xml文件和actionName-methodName-validation.xml文件校驗數據。
- 調用validateX()方法來進行數據校驗。
- 調用validate()方法進行數據校驗。
- 如果數據校驗發生錯誤,就會返回名為input的result,進入指定的視圖資源而不會調用本該被調用的業務邏輯處理方法。如果數據校驗過程中未出現錯誤,則會調用相應Action中的業務邏輯處理方法。
3.6 配置校驗文件的方式
Struts2框架提供了兩種方式來配置校驗文件,一種是字段校驗配置方式;另一種是非字段校驗配置方式。
字段校驗方式(field-validator)
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入用户名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">2</param>
<param name="maxLength">16</param>
<message>用户名長度在${minLength}到${maxLength}位之間!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入密碼</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[\w{6,12}]]></param>
<message>密碼必須在6-12位之間,且只能為字母和數字</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入確認密碼</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[repassword==password]]></param> <!--這裏也可以用repassword.equals(password)//-->
<message>兩次密碼不相等</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<param name="trim">true</param>
<message>年齡不能為空!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">60</param>
<message>年齡取值範圍在${min}到${max}之間</message>
</field-validator>
</field>
<field name="height">
<field-validator type="double">
<param name="min">1.10</param>
<param name="max">2.10</param>
<message>身高取值範圍在${min}到${max}米之間</message>
</field-validator>
</field>
</validators>
非字段校驗方式(non-fild validator),下面這個只是個示範,非本例所用。
View Code
3.7 校驗器簡介
- required校驗器,要求字段非空;
- requiredstring校驗器,要求字段值非空且長度大於0;
- int校驗器,表示整數,可以通過min/max參數指定範圍;
- date校驗器,要求日期,可以通過min/max參數指定範圍;
- email校驗器,要求電子郵件格式;
- stringlength校驗器,通過minLength/maxLength參數指定字段長度範圍。
4. 在struts.xml文件中配置錯誤返回頁面地址
<action name="registerX" class="com.clzhang.ssh.demo1.RegisterXAction">
<result name="register">/ssh/demo1/success.jsp</result>
<result name="input">/ssh/demo1/registerX.jsp</result>
</action>
5. 測試
打開IE,輸入地址:http://127.0.0.1:8080/st/ssh/demo1/registerX.jsp
結果如下:
直接提交,結果如下:
根據輸入校驗的處理場所的不同,可以將輸入校驗分為客户端校驗和服務器端校驗兩種。服務器端驗證目前有兩種方式:
第一種:
參考:struts2:數據校驗,通過Action中的validate()方法實現校驗,圖解
第二種:
使用validate()方法校驗時,如果Web應用中存在大量Action就需要多次重寫validate()方法,這使得代碼非常繁瑣。由於Struts2的校驗框架本質上是基於XWork的validato框架,因此可以使用XWork的validator框架來對Struts2進行數據校驗,以減少代碼量。本文即討論此種校驗方式。
1. 前台頁面加入錯誤提示標籤(registerX.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<s:fielderror/>
<s:form action="registerX" method="post">
賬號:<s:textfield name="username"></s:textfield>
<br/>
密碼:<s:password name="password"></s:password>
<br/>
重複密碼:<s:password name="repassword"></s:password>
<br/>
年齡:<s:textfield name="age"></s:textfield>
<br/>
身高:<s:textfield name="height"></s:textfield>
<br/>
<s:submit value="提交"></s:submit>
<br/>
</s:form>
</body>
</html>
2. 後台action繼承ActionSupport(RegisterXAction.java)
package com.clzhang.ssh.demo1;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterXAction extends ActionSupport {
public static final long serialVersionUID = 1;
private String username;
private String password;
private String repassword;
private Integer age;
private Double height;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getHeight() {
return height;
}
public void setHeight(Double height) {
this.height = height;
}
@Override
public String execute() {
System.out.println(username + "|" + age + "|" + height + " register finished!");
return "register";
}
}
3. 增加校驗配置文件(RegisterXAction-validation.xml)
3.1 命名規範
校驗文件命名規則:ActionName-validation.xml,其中ActionName就是需要校驗的action的類名。
如果需要在Action中對某個特定的方法進行校驗,則需要為此特定方法專門定義一個校驗文件(否則,調用默認的)。該文件命名規則為:actionNme-methodNae-validation.xml;同時,還需要在struts.xml文件配置action時指定其method屬性(否則,調用默認的)。
3.2 位置規範
該文件應該與action類的文件位於同一個路徑下。
3.3 該文件的定義
參考:struts-2.3.x\lib\xwork-core-2.3.x.jar包中xwork-validator-1.0.x.dtd文件的描述。
3.4 該文件中validator的種類
參考:xwork-core-2.3.x.jar\com\opensymphony\xwork2\validator\validators中的default.xml文件。
3.5 進行數據校驗遵循的步驟
- Struts2框架中的類型轉換器對HTTP請求的數據進行數據類型轉換,得到符合類型的值,比如本例中age被轉換為int。
- 使用Struts2的XWork校驗框架進行校驗,即根據actionName-validation.xml文件和actionName-methodName-validation.xml文件校驗數據。
- 調用validateX()方法來進行數據校驗。
- 調用validate()方法進行數據校驗。
- 如果數據校驗發生錯誤,就會返回名為input的result,進入指定的視圖資源而不會調用本該被調用的業務邏輯處理方法。如果數據校驗過程中未出現錯誤,則會調用相應Action中的業務邏輯處理方法。
3.6 配置校驗文件的方式
Struts2框架提供了兩種方式來配置校驗文件,一種是字段校驗配置方式;另一種是非字段校驗配置方式。
字段校驗方式(field-validator)
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入用户名</message>
</field-validator>
<field-validator type="stringlength">
<param name="minLength">2</param>
<param name="maxLength">16</param>
<message>用户名長度在${minLength}到${maxLength}位之間!</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入密碼</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[\w{6,12}]]></param>
<message>密碼必須在6-12位之間,且只能為字母和數字</message>
</field-validator>
</field>
<field name="repassword">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>請輸入確認密碼</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[repassword==password]]></param> <!--這裏也可以用repassword.equals(password)//-->
<message>兩次密碼不相等</message>
</field-validator>
</field>
<field name="age">
<field-validator type="required">
<param name="trim">true</param>
<message>年齡不能為空!</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">60</param>
<message>年齡取值範圍在${min}到${max}之間</message>
</field-validator>
</field>
<field name="height">
<field-validator type="double">
<param name="min">1.10</param>
<param name="max">2.10</param>
<message>身高取值範圍在${min}到${max}米之間</message>
</field-validator>
</field>
</validators>
非字段校驗方式(non-fild validator),下面這個只是個示範,非本例所用。
3.7 校驗器簡介
- required校驗器,要求字段非空;
- requiredstring校驗器,要求字段值非空且長度大於0;
- int校驗器,表示整數,可以通過min/max參數指定範圍;
- date校驗器,要求日期,可以通過min/max參數指定範圍;
- email校驗器,要求電子郵件格式;
- stringlength校驗器,通過minLength/maxLength參數指定字段長度範圍。
4. 在struts.xml文件中配置錯誤返回頁面地址
<action name="registerX" class="com.clzhang.ssh.demo1.RegisterXAction">
<result name="register">/ssh/demo1/success.jsp</result>
<result name="input">/ssh/demo1/registerX.jsp</result>
</action>
5. 測試
打開IE,輸入地址:http://127.0.0.1:8080/st/ssh/demo1/registerX.jsp
結果如下:
直接提交,結果如下: