Struts2中提供的內置聲明式驗證器的使用

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表達式(表達式要寫在

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