Struts2验证框架(声明式验证)

110 篇文章 6 订阅
36 篇文章 1 订阅

1.说明

在jsp表单中经常会出现数据类型转换错误,转换失败后会出现
这里写图片描述
失败后的解决方法就是配置回显结果视图,从哪里来就回到哪里去。
这里写图片描述
我们知道继承了ActionSupport类后会有一个validate方法,我们可以重写这个方法进行编程式验证。

    @Override
    public void validate() {
        if(StringUtils.isEmpty(user.getUsername())){
            addFieldError("username", "请输入用户名");
        }
    }

validate方法实现验证的原理是当程序执行到Action时,先判断Action有没有实现validate方法,如果已经实现了,就先执行validate方法,然后执行execute方法,如果还没有实现,就直接执行execute方法。
但编程式验证有一个弊端就是硬编码。

2.struts2验证框架

struts2框架自带的校验功能是通过配置文件完成的。它的原理是当程序执行到Action但是还没执行到Action里面的方法时拦截,转而执行校验器,校验器执行完再返回到Action继续执行。struts2中为我们提供了一个验证框架即声明式验证,通过编写验证规则的xml文件,需要验证时,编写xml文件。不需要验证时,不编写。解决了硬编码的弊端,保证客户提交数据的安全性、正确性,其实更重要的是防止攻击

3.struts2验证框架所需要的jar包

这里写图片描述
这些jar包都是使用Struts2框架最基本的jar包

4.使用方式

在Struts.xml中配置input视图

这里写图片描述

xml配置

验证器的xml命名方式:
- (全局验证)针对动作类中所有动作进行验证:ActionClassName-validation.xml
- (局部验证)针对动作类中某个动作进行验证:ActionClassName-ActionName-validation.xml 需要注意的是 这里的ActionName是struts.xml中配置的action标签中的name值,不是action类中的方法名
- xml需放在动作类所在的包中

所有的校验器都要放在<validators></validators> 标签里,它用来声明校验器。
在使用全局验证时 可以使用 @SkipValidation注解跳过不需要验证的方法。
dtd约束可以从xword核心包里找到 /xwork-validator-1.0.3.dtd 我使用的是1.0.3.dtd约束 自己选择对应的版本

<validators>
    <!-- 基于字段的声明式验证 -->
    <!-- field标签里面的name表示表单里面的字段名 -->
    <field name="username">
        <!-- type的值为struts提供的字段校验器 -->
        <field-validator type="requiredstring">
            <!-- message标签为输入错误需要提醒的消息内容 -->
            <message>请输入用户名!</message>
        </field-validator>
    </field>
</validators>

各校验器的功能说明如下:

名称功能
required用来验证某个给定的字段的值不是null。注意,空字符串不是null
requiredstring验证给定的字段的值既不是null、也不是空格
int用来验证某个字段的值是否可以被转换为一个整数。若指定参数,还验证是否在允许的范围内
long用来验证某个字段的值是否可以被转换为一个长整数。若指定参数,还验证是否在允许的范围内
short用来验证某个字段的值是否可以被转换为一个短整数。若指定参数,还验证是否在允许的范围内
double用来验证某个字段的值是否可以被转换为一个双精度浮点数。若指定参数,还验证是否在允许的范围内
date用来确保给定的日期字段的值落在一个给定的范围内
expression用于验证是否满足一个OGNL表达式。这是一个非字段的验证。只有给定的参数的返回值是true时才能验证通过。验证不通过时产生一个动作错误,因此要显示该错误,需要使用<s:actionerror/>标签
fieldexpression用于验证某个字段是否满足一个OGNL表达式。这是一个基于字段的验证。只有给定的参数的返回值是true时才能验证通过。验证不通过时产生一个字段错误
email用来验证给定的字段是否符合一个Email的规范
url用来验证给定的字段值是否是一个合法的URL地址
visitor该验证程序可以提高代码的可重用性,你可以利用它把同一个验证程序配置文件用于多个动作
conversion校验字段是否发生转换错误
stringlength用来验证一个非空的字段值是不是有足够的长度
regex用来检查给定字段是否与给定的正则表达式相匹配

下面用一个小例子来说明struts2验证器的使用

5.例子

要求如下:

5.1.User.java

public class User {
    private String username;//不能为null和空字符串。要trim
    private int age;//整数:介于18-100之间
    private String email;//按格式输入
    private String password;//长度3~8位
    private String repassword;//确认密码 必须和密码一致
    private int score;//必须是数字
    private String uri;//个人主页,必须符合uri的格式
    private String gender;//性别  必须选择一个
    /*省略get和set方法*/
}

5.2web.xml 主要配置过滤器

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

5.3struts.xml声明Action

<?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>
    <constant name="struts.devMode" value="true"></constant>
    <package name="user" namespace="/user" extends="struts-default">
        <action name="register" class="com.scx.web.action.UserAction" method="register">
            <!-- 如果转换格式错误  跳转到注册页面 -->
            <result name="input">/index.jsp</result>
            <result name="success">/success.jsp</result>
        </action>
    </package>
</struts>

5.4UserAction.java 提供注册功能的action

public class UserAction extends ActionSupport implements ModelDriven<User>{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private User user=new User();
    @Override
    public User getModel() {
        return user;
    }
    public String register(){
        System.out.println("注册成功!");
        return SUCCESS;
    }
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

当程序执行到UserAction还没执行到register方法时进而拦截,从而跳转到UserAction-register-validation.xml进行校验,只有校验成功才会回到register方法,否则进入input视图。

5.5UserAction-register-validation.xml

这里的dtd约束可以从xword核心包里找到 /xwork-validator-1.0.3.dtd 我们使用的是1.0.3.dtd约束 自己选择对应的版本
所有的校验器都要放在<validators></validators> 标签里,它用来声明校验器。

<?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表示表单里面的字段名 -->
    <field name="username">
        <field-validator type="requiredstring">
            <message>请输入用户名!</message>
        </field-validator>
    </field>
    <field name="age">
        <field-validator type="int">
            <param name="min">18</param>
            <param name="max">100</param>
            <message>请输入范围在18-100的整数</message>
        </field-validator>
    </field>
     <field name="email">
        <field-validator type="email">
            <message>请输入正确的eamil</message>
        </field-validator>
    </field>
    <field name="password">
        <field-validator type="requiredstring">
            <param name="trim">false</param>
            <message>请输入密码</message>
        </field-validator>
        <field-validator type="stringlength">
            <param name="minLength">3</param>
            <param name="maxLength">8</param>
            <message>请输入3~8位的密码</message>
        </field-validator>
    </field>
    <validator type="expression">
        <param name="expression">
        <![CDATA[
            password == repassword
            ]]>
        </param>
        <message>两次密码必须一致</message>
    </validator>
    <field name="score">
        <field-validator type="regex">
            <param name="regex">
                \d+
            </param>
            <message>请输入正确的成绩</message>
        </field-validator>
    </field>
    <field name="uri">
        <field-validator type="url">
            <message>请输入正确的url地址</message>
        </field-validator>
    </field>
    <field name="gender">
        <!-- 只验证是否为null的验证器 -->
        <field-validator type="required">
            <message>请选择性别</message>
        </field-validator>
    </field>
</validators>

5.6index.jsp 注册提交页面,使用了struts2的s标签

<%@ 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>验证信息</title>
    <s:head/>
  </head>

  <body>
    <s:actionerror/>
    <s:form action="/user/register.action">
        <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>
        <s:textfield name="age" label="年龄"/>
        <s:textfield name="email" label="邮箱"/>
        <s:textfield name="password" label="密码"/>
        <s:textfield name="repassword" label="确认密码"/>
        <s:textfield name="score" label="成绩"/>
        <s:textfield name="uri" label="个人主页"/>
        <s:radio name="gender" label="性别" list="{'男','女'}"/>
        <s:submit label="注册"></s:submit>
    </s:form>
  </body>
</html>

运行结果

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值