struts2支持三種驗證方式

前言

  struts2支持三種驗證方式:
     1.使用Annotations驗證
     2.基於XML配置的驗證
     3.手動驗證

  本文主要簡介第一種校驗方式,使用的struts版本爲:struts-2.2.1.1

正文

一 一個簡單的例子

SimpleAnnotationAction.java:

複製代碼
package com.struts2.validation; import org.apache.struts2.interceptor.validation.SkipValidation; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator; import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator; import com.opensymphony.xwork2.validator.annotations.Validations; import com.opensymphony.xwork2.validator.annotations.ValidatorType; @Validations(requiredStrings={ @RequiredStringValidator(fieldName="userName",message="用戶名不能爲空!"), @RequiredStringValidator(fieldName="userName",message="密碼不能爲空!") } ) public class SimpleAnnotationAction extends ActionSupport { private String userName; private String password; @Override @Validations(requiredFields={ @RequiredFieldValidator(type=ValidatorType.SIMPLE,fieldName="userName",message="用戶名不能爲null!!") } ) public String execute() throws Exception { return super.execute(); } /*運行:http://localhost:8080/struts2/validation/simpleAnnotationLogin.action 結果: 用戶名不能爲空! 密碼不能爲空! 用戶名不能爲null!! 密碼不能爲null!! */ @Validations(requiredFields={ @RequiredFieldValidator(type=ValidatorType.SIMPLE,fieldName="password",message="密碼不能爲null!!") } ) public String login(){ return "success"; } /*運行:http://localhost:8080/struts2/validation/simpleAnnotationLogin2.action 結果: 用戶名不能爲空! 密碼不能爲空! 用戶名不能爲null!! 密碼不能爲null!! */ public String login2(){ return "success"; } /*運行:http://localhost:8080/struts2/validation/simpleAnnotationLogin2.action 結果:頁面發生跳轉 */ @SkipValidation public String login3(){ return "success"; } /*運行:http://localhost:8080/struts2/validation/simpleAnnotationLogin2.action 結果:頁面發生跳轉 */ public String login5(){ return "success"; } 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;} }
複製代碼

 struts.xml

複製代碼
<package name="validation" namespace="/validation" extends="struts-default"> <action name="simpleAnnotationLogin" class="com.struts2.validation.SimpleAnnotationAction" method="login"> <result name="input">/SimpleAnnotation.jsp</result> <result name="success" type="redirect">/LoginSuccess.jsp</result> </action> <action name="simpleAnnotationLogin2" class="com.struts2.validation.SimpleAnnotationAction" method="login2"> <result name="input">/SimpleAnnotation.jsp</result> <result name="success" type="redirect">/LoginSuccess.jsp</result> </action> <action name="simpleAnnotationLogin3" class="com.struts2.validation.SimpleAnnotationAction" method="login3"> <result name="input">/SimpleAnnotation.jsp</result> <result name="success" type="redirect">/LoginSuccess.jsp</result> </action> <action name="simpleAnnotationLogin5" class="com.struts2.validation.SimpleAnnotationAction" method="login5"> <interceptor-ref name="validation"> <param name="validateAnnotatedMethodOnly">true</param> </interceptor-ref> <result name="input">/SimpleAnnotation.jsp</result> <result name="success" type="redirect">/LoginSuccess.jsp</result> </action> </package>
複製代碼

SimpleAnnotation.jsp

複製代碼
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <s:fielderror></s:fielderror> <form action="../validation/manualValidation.action" method="post"> <input type="text" name="userName" /> <br> <input type="password" name="password" /> <br> <input type="submit" value="提交" /> </form> </body> </html>
複製代碼

LoginSuccess.jsp

複製代碼
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> </head> <body> <h1>登錄成功!!</h1> </body> </html>
複製代碼

結論
   1.Action類中使用Validations Annotation定義驗證。
   2.Action中,可以在方法上、類上定義驗證Annotations,所有的驗證器都將同時作用在映射爲Action的方法上。
   3.Action中有多個方法被映射爲Action時,類上和方法上所有定義的驗證Annotations都將作用在每個映射爲Action的方法上。
   4.Action中校驗失敗時,返回input邏輯視圖
   5.可以使用@SkipValidation跳過所有的驗證檢查,包括自身方法定義的校驗器。
   6.可以在Action映射中使用如下代碼跳過校驗檢查
     <interceptor-ref name="validation">
         <param name="validateAnnotatedMethodOnly">true</param>
     </interceptor-ref>

  二  校驗器使用說明

1.Validations Annotation的使用
 Validations中定義了一些驗證器的數組,用於存放驗證規則,定義如下
 public @interface Validations {
 //自定義校驗器數組
    public CustomValidator[] customValidators() default {};
    //字段轉換錯誤校驗器數組
    public ConversionErrorFieldValidator[] conversionErrorFields() default {};
    //日期範圍校驗器
    public DateRangeFieldValidator[] dateRangeFields() default {};
 //Email校驗器
    public EmailValidator[] emails() default {};
 //字段表達式校驗器
    public FieldExpressionValidator[] fieldExpressions() default {};
 //整數範圍校驗器
    public IntRangeFieldValidator[] intRangeFields() default {};
 //必填字段校驗器
    public RequiredFieldValidator[] requiredFields() default {};
 //必填字符串校驗器
    public RequiredStringValidator[] requiredStrings() default {};
 //字符串長度校驗器
    public StringLengthFieldValidator[] stringLengthFields() default {};
 //URL校驗器
    public UrlValidator[] urls() default {};
    //帶條件的Vistor校驗器
    public ConditionalVisitorFieldValidator[] conditionalVisitorFields() default {};
 //Vistor校驗器
    public VisitorFieldValidator[] visitorFields() default {};
 //正則表達式校驗器
    public RegexFieldValidator[] regexFields() default {};
 //表達式校驗器
    public ExpressionValidator[] expressions() default {};
}

2.@RequiredStringValidator —— 必填字符串校驗器
 校驗要求:指定字段不能爲null且字符串長度大於0
 參數: fieldName:校驗字段名
    trim:校驗時取出字符串兩邊的空格,默認爲true
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
3.RequiredFieldValidator —— 必填校驗器
 校驗要求:指定字段不能爲null
 參數: fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息

4.IntRangeFieldValidator —— 整數範圍校驗器
 校驗要求:int、long、short字段的整數值在指定的範圍內
 參數:min:指定最小值,可選,沒有則不檢查最小值
    max:指定最大值,可選,沒有則不檢查最大值
    fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
5.DateRangeFieldValidator —— 日期範圍校驗器
 校驗要求:日期在指定的範圍內  
 參數:min:指定最小值,可選,沒有則不檢查最小值
    max:指定最大值,可選,沒有則不檢查最大值 
    fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
      
6.EmailValidator —— Email地址校驗器
 校驗要求:指定的字段爲Email地址
 參數: fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
7.ExpressionValidator —— 表達式校驗器
 校驗要求:指定的ONGL表達式返回true。
 參數: expression:ONGL表達式  
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
      
8.UrlValidator —— URL校驗器
 校驗要求:校驗指定的字段值是否爲合法的URL
 參數: fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
9.StringLengthFieldValidator —— 字符串長度校驗器
 校驗要求:字符串長度在指定的範圍內
 參數:minLength:指定最小長度,可選,沒有則不檢查最小長度
    maxLength:指定最大長度,可選,沒有則不檢查最大長度 
    trim:校驗時取出字符串兩邊的空格,默認爲true
    fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
    
10.ConversionErrorFieldValidator —— 轉換錯誤校驗器
 校驗要求:校驗指定字段是否發生類型轉換錯誤
 參數: fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
11.VisitorFieldValidator —— Vistor校驗器
 說明:普通校驗器只能校驗基本數據類型和字符串類型,該校驗器可以校驗對象裏面的屬性。
 參數:context:用於校驗的context
    appendPrefix: 校驗發生錯誤時是否在錯誤信息中添加前最消息
    fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
12. RegexFieldValidator —— 正則表達式校驗器
 校驗要求:指定字段匹配指定的正則表達式
 參數:expression:正則表達式
    fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
13.ConditionalVisitorFieldValidator —— 帶條件的Vistor校驗器
 驗證要求:在條件不滿足時,和Vistor校驗器功能一樣,條件滿足則不執行Vistor校驗
 參數: fieldName:校驗字段名
    message:校驗失敗時的消息
    key:校驗失敗時返回i18n中指定名稱的消息
   
14.CustomValidator —— 自定義校驗器 
 校驗器:自定義校驗器 

三 各種校驗器使用

AnnotationValidationAction.java

複製代碼
package com.struts2.validation; import java.util.Date; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.validator.annotations.ConditionalVisitorFieldValidator; import com.opensymphony.xwork2.validator.annotations.ConversionErrorFieldValidator; import com.opensymphony.xwork2.validator.annotations.CustomValidator; import com.opensymphony.xwork2.validator.annotations.DateRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.EmailValidator; import com.opensymphony.xwork2.validator.annotations.ExpressionValidator; import com.opensymphony.xwork2.validator.annotations.FieldExpressionValidator; import com.opensymphony.xwork2.validator.annotations.IntRangeFieldValidator; import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator; import com.opensymphony.xwork2.validator.annotations.StringLengthFieldValidator; import com.opensymphony.xwork2.validator.annotations.UrlValidator; import com.opensymphony.xwork2.validator.annotations.Validations; import com.opensymphony.xwork2.validator.annotations.VisitorFieldValidator; public class AnnotationValidationAction extends ActionSupport{ private Name name; private String password; private String email; private int age; private Date birthday; private String homeUrl; private String question; private String answer; @Validations( stringLengthFields={@StringLengthFieldValidator(fieldName="password",minLength="8",maxLength="20",message="密碼的長度必須大於8小於20個字符")}, emails={@EmailValidator(fieldName="email",message="郵件字段的格式不對")}, conversionErrorFields={@ConversionErrorFieldValidator(fieldName="age",message="年齡輸入的值轉換錯誤")}, intRangeFields={@IntRangeFieldValidator(fieldName="age",min="0",max="150",message="年齡範圍爲0到150")}, urls={@UrlValidator(fieldName="homeUrl",message="個人主頁的格式不對")}, dateRangeFields={@DateRangeFieldValidator(fieldName="birthday",min="1900-01-01",message="日期輸入不真確")}, visitorFields={@VisitorFieldValidator(fieldName="name",context="name",message="姓名錯誤:",appendPrefix=true)}, fieldExpressions={@FieldExpressionValidator(expression="age>10",fieldName="age",message="年齡不大於10歲")}, expressions={@ExpressionValidator(expression="age<10",message="年齡大於10歲")}, //不顯示信息 regexFields={@RegexFieldValidator(expression="1*",fieldName="question",message="問題不是全部1")}, conditionalVisitorFields={@ConditionalVisitorFieldValidator(expression="age>10",context="name",fieldName="name",appendPrefix=true,message="ConditionVistor:")} ) public String execute() throws Exception { return super.execute(); } public Name getName() { return name; } public void setName(Name name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getHomeUrl() { return homeUrl; } public void setHomeUrl(String homeUrl) { this.homeUrl = homeUrl; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; } }
複製代碼

Name.java

複製代碼
package com.struts2.validation; import com.opensymphony.xwork2.validator.annotations.RequiredFieldValidator; import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator; import com.opensymphony.xwork2.validator.annotations.Validations; @Validations(requiredFields={@RequiredFieldValidator(fieldName="lastName",message="LastName錯誤")}) public class Name { private String firstName; private String lastName; public String getFirstName() { return firstName; } @Validations(requiredStrings={@RequiredStringValidator(fieldName="firstName",message="FirstName錯誤")}) public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } }
複製代碼

create.jsp

複製代碼
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> </head> <body> <s:fielderror></s:fielderror> <s:form action="../validation/annotationValidation.action"> <s:textfield label="FirstName" name="name.firstName"></s:textfield> <s:textfield label="LastName" name="name.lastName"></s:textfield> <s:textfield label="密 碼:" name="password"></s:textfield> <s:textfield label="Email:" name="email"></s:textfield> <s:textfield label="年齡:" name="age"></s:textfield> <s:textfield label="出生日期:" name="birthday"></s:textfield> <s:textfield label="個人主頁:" name="homeUrl"></s:textfield> <s:textfield label="問題:" name="question"></s:textfield> <s:textfield label="答案:" name="answer"></s:textfield> <s:submit></s:submit> </s:form> </body> </html>
複製代碼

struts.xml

複製代碼
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="validation" namespace="/validation" extends="struts-default"> <action name="annotationValidation" class="com.struts2.validation.AnnotationValidationAction"> <result name="input">/validation/create.jsp</result> <result name="success">/FirstApplication/LoginSuccess.jsp</result> </action> </package> </struts>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章