Struts2提供的聲明式驗證器在xwork-core-**.jar包的
com\opensymphony\xwork2\validator\validators\default.xml配置文件中 ,打開文件我們可以看到所有驗證器聲明:
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
下面我們以一個小例子來試用一下部分的驗證器
需求:對用戶註冊頁面中的信息進行驗證
先做準備工作:
先得有一個註冊頁面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>regist page</title>
<s:head/>
</head>
<body>
<s:form action="regist" namespace="/user">
<s:textfield name="username" label="用戶名" requiredLabel="true" requiredPosition="left"></s:textfield>
<s:textfield name="password" label="密碼" requiredLabel="true" requiredPosition="left"></s:textfield>
<!-- list的取值是一個ONGL表達式,創建了一個Map對象。必須有name -->
<s:radio name="gender" list="#{'male':'男性','female':'女性'}" label="性別" requiredLabel="true" requiredPosition="left"></s:radio>
<!-- list的取值是一個ONGL表達式,創建了一個List對象。必須有name -->
<s:checkboxlist name="hobbies" list="{'吃飯','睡覺','學java'}" label="愛好"></s:checkboxlist>
<s:textfield name="birthday" label="出生日期:yyyy-MM-dd"></s:textfield>
<s:textfield name="email" label="郵箱"></s:textfield>
<s:textfield name="grade" label="成績"></s:textfield>
<s:submit value="註冊"></s:submit>
</s:form>
</body>
</html>
打開之後,顯示爲:
對應的Action和model如下:
package demo.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import demo.model.User;
public class UserAction extends ActionSupport implements ModelDriven<User> {
private static final long serialVersionUID = -5966666848749797668L;
private User user = new User();
@Override
public User getModel() {
if (this.user == null) {
this.user = new User();
}
return this.user;
}
public String regist() {
System.out.println(this.user);
return SUCCESS;
}
}
package demo.model;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private String username;
private String password;
private String gender;
private String hobbies;
private Date birthday;
private String email;
private int grade;
@Override
public String toString() {
return "User [username=" + username + ", password=" + password
+ ", gender=" + gender + ", hobbies=" + hobbies + ", birthday="
+ birthday + ", email=" + email + ", grade=" + grade + "]";
}
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 getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHobbies() {
return hobbies;
}
public void setHobbies(String hobbies) {
this.hobbies = hobbies;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
struts.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="user" extends="struts-default" namespace="/user">
<action name="regist" class="demo.action.UserAction" method="regist">
<result>/success.jsp</result>
<result name="input">/index.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
</struts>
記得最後配置好web.xml中的struts過濾器,到此,準備工作就完成了
要使用聲明式驗證,那麼需要在動作類對應的包中,建立一個名爲 動作類名-validation.xml的配置文件
本例中,由於UserAction是在demo.action包中,那麼我們就在該包中建立名爲UserAction-validation.xml的配置文件
配置文件的doctype可以在xwork-core-**.jar中的dtd文件中找到,我們以xwork-validator-1.0.3.dtd這個文件爲例,打開後複製裏面的doctype,放置在我們新建的配置文件中
<?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">
下面,我們就來用針對字段設置驗證器的方式一一試驗一下幾個驗證器
首先我們來試試用戶名必填,這裏需要注意內置驗證器的required和requiredstring的區別,前者是驗證字段不能爲null,而後者是驗證不能爲空字符串
由於頁面傳遞過來的字符串,不可能爲null,如果沒有值,會傳遞一個空字符串到服務器,而且用以接收的模型類中,對於這個字段也是使用的String來接收
所以,對於頁面的輸入框字段,後臺又是使用String來接收的字段,需要使用的是requiredstring
本例中,我們在UserAction-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>
<!--
filed表示是字段驗證方式,
name屬性指定要驗證的字段,與表單傳遞的字段名一致
-->
<field name="username">
<!-- 指定驗證規則,使用type屬性指定驗證器 -->
<field-validator type="requiredstring">
<!-- 錯誤提示信息 -->
<message>請輸入用戶名</message>
</field-validator>
</field>
<field name="email">
<!-- email其實是regex驗證規則的一個子類,只是專門爲郵箱寫了一個表達式來驗證 -->
<field-validator type="email">
<message>請輸入正確的郵箱</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="date">
<message>請輸入正確的生日,注意日期的格式</message>
</field-validator>
</field>
<field name="grade">
<field-validator type="required">
<message>請輸入分數</message>
</field-validator>
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>分數必須爲1~150的整數</message>
</field-validator>
</field>
</validators>
一個字段可以如上配置多個驗證器,這裏有一個小提示,整型的字段,如果不填寫,會有一個默認的字段值0
以下是摘自別人家的博客的內容,我忘記了哪位的了。。。
struts2提供了大量的內置校驗器:我們可以在xwork-core-**.jar的com.opensymphony.xwork2.validator.validators下找到如下配置文件:default.xml。裏面列出了所有的內置校驗器。
required:必填校驗器,要求field的值不能爲null。
requiredstring:必填字符串校驗器,要求field的值不能爲null,並且長度大於0
屬性——trim:指定在校驗之前是否去除字段串前後的空格。
stringlength:字段長度校驗器,要求fidle的值必須在指定的範圍內,否則校驗失敗。
屬性——minLength:指定最小長度。 maxLength:指定量大長度。 trim:指定在校驗之前是否去除字段串前後的空格。
regex:正則表達式校驗器,檢查衩校驗的field是否匹配一個正則表達式。
屬性——expression:指定正則表達式(2.3.15版用regexExpression)。 caseSensitive:指定進行正則表達式匹配時是否區分大小寫。
int:整數校驗器,要求field的整數值 必須在指定範圍內。
屬性——min:指定最小值。 max指定最大值。
double:雙精度浮點數校驗器,要求field的雙精度浮點數值必須在指定範圍內。
屬性——min:指定最小值。 max指定最大值。
fieldexpression:字段OGNL表達式校驗器。要求field滿足一個ognl表達式。
屬性——expression:指定ognl表達式(表達式要寫在