一、數據驗證
1.1、為什么要進行數據驗證
對數據的合法性進行檢查,只允許合法的數據進入應用程序
1.2、在哪里實現數據驗證
客戶端驗證:
數據提交前在客戶端驗證
可使用JavaScript或者JQuery實現
特點:減少客戶等待時間,減小服務器壓力
服務器端驗證:
在數據提交后服務器端驗證
特點:防止“繞過”客戶端驗證提交非法數據
可以在服務器端處理數據前確保數據的合法性
1.3、Struts2有兩種方式實現服務器端數據驗證
- 使用ActionSupport編碼實現驗證
- 使用驗證框架實現驗證
二、使用ActionSupport實現驗證
- 在Action類的業務方法中直接驗證
- 重寫Validate()方法
- 使用validateXxx()方法
2.1、添加錯誤信息
addFieldError(String fieldName,String errorMessage),添加字段的錯誤信息
addActionError(String anErrorMessage),添加與Action所處理業務相關的錯誤信息
2.2、在頁面輸出驗證結果
- <s:fielderror/>輸出一個或者所胡字段的錯誤信息
- <s:actionerror/>輸出所有Action的錯誤信息
2.3、action的配置
<result name="input">xxx.jsp</result>
三、ActionSupport驗證簡單實現
3.1、業務方法中較驗
實體類
package com.pb.entity; /* * 用戶類 */ public class User { private String username; //用戶名 private String password; //密碼 private Integer age; //年齡 private String email; //郵箱 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 Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注冊頁面</title> </head> <body> <!-- 判斷字段是否有錯誤信息--> <s:if test="hasFieldErrors()"> <h1 align="center">輸出錯誤字段信息</h1> <div align="center" style="color:blue;"> 使用s:fielderror輸出一個指定的錯誤信息 <s:fielderror name="user.username" /> 使用s:fielderror輸出全部的錯誤信息 <s:fielderror /> </div> </s:if> <!-- 判斷action是否有錯誤 --> <s:if test="hasActionErrors()"> <h1 align="center">輸出錯誤Action信息</h1> <div align="center" style="color:gray;"> 使用s:actionerror輸出action相關的錯誤信息 <s:actionerror/> </div> </s:if> <h1>使用execute業務方法直接較驗</h1> <s:form action="register.action" method="post" > <s:textfield label="用戶名" name="user.username"/> <s:password label="密碼" name="user.password"/> <s:textfield label="年齡" name="user.age" /> <s:textfield label="郵箱" name="user.email"/> <s:submit value="提交" /><s:reset value="重置" /><br/> </s:form> <s:debug/> </body> </html>
UserAction
package com.pb.web.action; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; import com.pb.entity.User; public class UserAction extends ActionSupport { private User user; @Override public String execute() throws Exception { if(null==user.getUsername() || "".equals(user.getUsername())){ this.addFieldError("user.username", "用戶名不能為空!"); } if(null==user.getPassword() || "".equals(user.getPassword())){ this.addFieldError("user.password", "密碼不能為空!"); } String ageStr="^\\d{1,3}$"; Pattern ageReg=Pattern.compile(ageStr); Matcher ageMatcher=ageReg.matcher(user.getAge()+""); if(!ageMatcher.matches()){ this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!"); } if(null==user.getAge()){ this.addFieldError("user.age", "年齡不能為空!"); } String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$"; Pattern emailReg=Pattern.compile(emaString); Matcher emailMatcher=emailReg.matcher(user.getEmail()); if(!emailMatcher.matches()){ this.addFieldError("user.email", "郵箱格式不正確"); } if(this.hasErrors()){ this.addActionError("輸入的注冊信息有誤"); return INPUT; } return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
struts.xml
<struts> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <action name="register" class="com.pb.web.action.UserAction"> <result name="input">/register.jsp</result> <result name="success">/registerSuccess.jsp</result> </action> </package> </struts>
四、在Validate()方法中實現驗證
- 重寫ActionSupport類的validate()方法
- 在validate()方法中實現驗證
- 將數據驗證和業務處理分離
- 添加與顯示錯誤信息的方式不變
接收參數時,數據轉換失敗也會調用validate()方法
validate()方法驗證不通過不會執行業務方法
4.1、更改之前實現validate()驗證
package com.pb.web.action; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; import com.pb.entity.User; public class UserAction1 extends ActionSupport { private User user; @Override public String execute() throws Exception { System.out.println("=========完成注冊信息======"); if(this.hasErrors()){ this.addActionError("輸入的注冊信息有誤"); return INPUT; } return SUCCESS; } @Override public void validate() { if(null==user.getUsername() || "".equals(user.getUsername())){ this.addFieldError("user.username", "用戶名不能為空!"); } if(null==user.getPassword() || "".equals(user.getPassword())){ this.addFieldError("user.password", "密碼不能為空!"); } String ageStr="^\\d{1,3}$"; Pattern ageReg=Pattern.compile(ageStr); Matcher ageMatcher=ageReg.matcher(user.getAge()+""); if(!ageMatcher.matches()){ this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!"); } if(null==user.getAge() || "".equals(user.getAge())){ this.addFieldError("user.age", "年齡不能為空!"); }else{ if(0>user.getAge() || 200<user.getAge()){ this.addFieldError("user.age", "年齡1-200之間!!"); } } String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$"; Pattern emailReg=Pattern.compile(emaString); Matcher emailMatcher=emailReg.matcher(user.getEmail()); if(!emailMatcher.matches()){ this.addFieldError("user.email", "郵箱格式不正確"); } super.validate(); } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
如果Action中有validate()方法,會先執行驗證,驗證后才執行業務方法,不通過不執行業務方法
五、針對一個業務方法進行數據驗證
使用validateXxx()方法
- Struts2支持validateXxx()方法針對xxx()方法進行數據驗證
- 使用validateRegister()方法實現針對register()方法的數據驗證
- 注冊時通過validateRegister()方法驗證年齡和郵箱等其它字段
- 注冊和登錄時在validate()方法中驗證用戶名和密碼非空等其它驗證
validate()方法和validateXxx()方法同時存在時都會起作用
ValidateXxx()方法的調用要先於validate()方法
5.1、使用針對注冊的驗證方法
package com.pb.web.action; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; import com.pb.entity.User; public class UserAction2 extends ActionSupport { private User user; public String register() throws Exception { System.out.println("=========完成注冊信息======"); if(this.hasErrors()){ return INPUT; } return SUCCESS; } @Override public void validate() { System.out.println("====執行validate方法驗證===="); if(null==user.getUsername() || "".equals(user.getUsername())){ this.addFieldError("user.username", "用戶名不能為空!"); } if(null==user.getPassword() || "".equals(user.getPassword())){ this.addFieldError("user.password", "密碼不能為空!"); } } public void validateRegister(){ System.out.println("====執行validateRegister方法驗證===="); String ageStr="^\\d{1,3}$"; Pattern ageReg=Pattern.compile(ageStr); Matcher ageMatcher=ageReg.matcher(user.getAge()+""); if(!ageMatcher.matches()){ this.addFieldError("user.age", "年齡只能是數字,並只能為1-200之間!"); } if(null==user.getAge() || "".equals(user.getAge())){ this.addFieldError("user.age", "年齡不能為空!"); }else{ if(0>user.getAge() || 200<user.getAge()){ this.addFieldError("user.age", "年齡1-200之間!!"); } } String emaString="^\\w+@\\w+(.\\w{2,3}){1,2}$"; Pattern emailReg=Pattern.compile(emaString); Matcher emailMatcher=emailReg.matcher(user.getEmail()); if(!emailMatcher.matches()){ this.addFieldError("user.email", "郵箱格式不正確"); } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
struts.xml
<action name="register2" class="com.pb.web.action.UserAction2" method="register"> <result name="input">/register2.jsp</result> <result name="success">/registerSuccess.jsp</result> </action>
5.2、三種方法

六、驗證框架

6.1、實現
package com.pb.web.action; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionSupport; import com.pb.entity.User; public class UserAction3 extends ActionSupport { private User user; public String register() throws Exception { System.out.println("=========完成注冊信息======"); return SUCCESS; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
UserAction3-validation.xml
<?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="user.username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用戶名不能為空!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">4</param> <param name="maxLength">16</param> <param name="trim">true</param> <message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message> </field-validator> </field> <!--密碼 --> <field name="user.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密碼不能為空!</message> </field-validator> <field-validator type="stringlength"> <!--去掉前后的空格 --> <param name="trim">true</param> <param name="minLength">6</param> <param name="maxLength">20</param> <message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message> </field-validator> </field> <!--年齡 --> <field name="user.age"> <field-validator type="required"> <param name="trim">true</param> <message>年齡不能為空</message> </field-validator> <field-validator type="int"> <param name="trim">true</param> <param name="min">1</param> <param name="max">200</param> <message>年齡為${min}---${max}歲之間</message> </field-validator> </field> <field name="user.email"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>郵箱不能為空</message> </field-validator> <field-validator type="email"> <param name="trim">true</param> <message>郵箱格式不正確!</message> </field-validator> </field> </validators>
jsp頁面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="s" uri="/struts-tags"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <base href="<%=basePath%>"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>注冊頁面</title> </head> <body> <!-- 判斷字段是否有錯誤信息--> <s:if test="hasFieldErrors()"> <h1 align="center">輸出錯誤字段信息</h1> <div align="center" style="color:blue;"> 使用s:fielderror輸出全部的錯誤信息 <s:fielderror /> </div> </s:if> <h1>ActionName-validation.xml較驗</h1> <!-- 必須加上namespace不然不起作用--> <s:form action="register3.action" method="post" namespace="/" > <s:textfield label="用戶名" name="user.username"/> <s:password label="密碼" name="user.password"/> <s:textfield label="年齡" name="user.age" /> <s:textfield label="郵箱" name="user.email"/> <s:submit value="提交" /><s:reset value="重置" /><br/> </s:form> <s:debug/> </body> </html>
struts.xml
<action name="register3" class="com.pb.web.action.UserAction3" method="register"> <result name="input">/register3.jsp</result> <result name="success">/registerSuccess.jsp</result> </action>
七、針對一個業務編寫配置文件

7.1、更改實現
將上面的年齡驗證和郵箱驗證獨立出來
struts.xml
<action name="register3" class="com.pb.web.action.UserAction3" method="register"> <result name="input">/register3.jsp</result> <result name="success">/registerSuccess.jsp</result> </action>
UserAction3-validation.xml
<?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="user.username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用戶名不能為空!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">4</param> <param name="maxLength">16</param> <param name="trim">true</param> <message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message> </field-validator> </field> <!--密碼 --> <field name="user.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密碼不能為空!</message> </field-validator> <field-validator type="stringlength"> <!--去掉前后的空格 --> <param name="trim">true</param> <param name="minLength">6</param> <param name="maxLength">20</param> <message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message> </field-validator> </field> </validators>
UserAction3-register3-validation.xml 中間的名稱要與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="user.username"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>用戶名不能為空!</message> </field-validator> <field-validator type="stringlength"> <param name="minLength">4</param> <param name="maxLength">16</param> <param name="trim">true</param> <message>用戶名必須為${minLength}至${maxLength}個字符!,當前為${user.username}</message> </field-validator> </field> <!--密碼 --> <field name="user.password"> <field-validator type="requiredstring"> <param name="trim">true</param> <message>密碼不能為空!</message> </field-validator> <field-validator type="stringlength"> <!--去掉前后的空格 --> <param name="trim">true</param> <param name="minLength">6</param> <param name="maxLength">20</param> <message>密碼必須為${minLength}至${maxLength}個字符,當前為${user.password}</message> </field-validator> </field> </validators>
7.2、驗證順序

八、以上

