前言
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>