Struts2对表单提交数据的验证

对表单数据的验证,分为
客户端验证。服务器端验证。

我们要看的呢,就是服务器端验证:
1:编程式验证:写代码验证,写死了,硬编码
2:声明式验证:写xml文件验证

编程式验证

  • 编程式验证:重写ActionSupport中的public void validate()方法
  • Struts2内部封装了一个Map,Map的键就是表单上的name的值
  • Map的值就是错误信息
  • 注意:动作类必须继承ActionSupport
public class UserAction extends ActionSupport implements ModelDriven<User> {

    private User user = new User();
    private UserService userService = new UserServiceImpl();

    @Override
    public void validate() {
        //验证用户名不能为空
        //"".equals(user.getUsername().trim()) || user.getUsername()==null
        if(StringUtils.isEmpty(user.getUsername())){
            addFieldError("username", "用户名不能为空");
        }
    }

    public String regist()
    {
        //判断用户是否存在
        User hu = userService.findUserByUserName(user.getUsername());
        if(hu!=null){
            return "exists";
        }
        //把用户添加到数据库
        int result = userService.regist(user);
        if(result>0)
            return "success";

        return null;
    }

    @Override
    public User getModel() {

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

这样,当我们提交表单时,若username为空的话,就会在表单上得到回显的错误信息。



但是这种方法有问题:

  • 默认:validate()方法在所有动作方法之前执行
  • 那么就算去执行其他的action,这里还是会执行validate方法进行验证
  • 为了让不需要验证不去执行 validate方法,解决方式有两种:
  • 1:使用注解:@SkipValidation
  • 2: 验证的方法名:validate+动作方法名( 首字母要大写)

对于这两种方法:

第一种,在动作类的其它方法上加@SkipValidation标签,那么这个方法就会跳过验证。

第二种方法,在需要验证的方法,将其方法名修改,这样,验证时就只验证该动作方法。

简单看一下代码
也就是下面的两种设置方法。

public void validateRegist() {
        //验证用户名不能为空
        //"".equals(user.getUsername().trim()) || user.getUsername()==null
        if(StringUtils.isEmpty(user.getUsername())){
            addFieldError("username", "用户名不能为空");
        }
    }

    @SkipValidation
    public String show()
    {
        return "success";
    }





声明式验证

对于编程式验证,代码是写死的,我们一半会用更灵活的声明式验证。

  • 声明式验证:通过xml文件实现验证
  • 在动作类所在的包下创建xml文件
  • 文件名有命名规则:动作类名-vlidation.xml,默认验证动作类中的所有动作方法
  • 希望某些方法不被验证:1.加注解 @SkipValidation
  • 2.xml文件名改成 动作类名-动作名-vlidation.xml *
  • 在xml文件中加入dtd约束:在xwork-core.jar包中找到xwork-validator-1.0.3.dtd

下面看我们配置的UserAction-regist-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>
    <!--  基于字段的验证 -->
    <field name="username">
        <!-- 怎么验证 , struts内部已经定义了很多的验证器
           requiredstring判断是否为null,或空字符串,去除空格
        -->
        <field-validator type="requiredstring">
            <message>用户名不能为空</message><!--  -->
        </field-validator>
    </field>

    <!-- 基于验证器的验证 -->
    <validator type="requiredstring">
        <!-- 使用注入的方式指明验证谁 
           private String actionName;
           setActionName("action1");
           验证器的位置:xwork-core-2.3.15.3.jar\com\opensymphony\xwork2\validator\validators
        -->
        <param name="fieldName">password</param>
        <message>密码不能为空</message>
    </validator>
</validators>

这样就完成了对username和password非空的验证。
这里写图片描述




为了对声明式验证更多点了解,我们看一个对验证注册信息的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>
    <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">70</param>
            <message>年齡必須在18到70之間</message>
        </field-validator>
    </field>

    <field name="email">
        <field-validator type="email">
              <message>邮箱格式不正确</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="url">
        <field-validator type="url">
            <message>输入正确的url地址</message>
        </field-validator>
    </field>

    <field name="gender">
        <field-validator type="required">
            <message>请选择性别</message>
        </field-validator>
    </field>

</validators>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值