根據輸入校驗的處理場所的不同,可以將輸入校驗分為客戶端校驗和服務器端校驗兩種。服務器端驗證目前有兩種方式:
第一種:
參考: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),下面這個只是個示范,非本例所用。

<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- age域 --> <field name="age"> <!--域類型為int--> <field-validator type="int"> <param name="min">10</param> <param name="max">40</param> <message>the age must be from 10 to 40!</message> </field-validator> </field> <!-- name域 --> <field name="name"> <!-- 域類型為requiredstring類型 --> <field-validator type="requiredstring"> <message>the age must be from 10 to 40!</message> </field-validator> </field> </validators>
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
結果如下:
直接提交,結果如下: