struts2表单错误处理和数据验证

在前两个当中我们知道了,当数据类型不符合的时候可以进行数据类型的转化,但是,我们并不能对所有的错误都进行转化解决,所有需要处理错误,当我们不进行处理的时候就需要进行表单的错误处理。

当类型转换失败,如何进入input所示的视图又是一个拦截器ActionSupport做的,注意动作类必须先继承actionsupport

在action当中配置错误处理:input

<result name="input">/register.jsp</result>

但出现错误的时候就跳转回register.jsp,但是这么做没有错误的提示,需要错误的提示就需要用到struts2的标签库,同时,表单的写法改为如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--导入struts2的标签库 --%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'register.jsp' starting page</title> 
  </head>
  <body>
    <s:actionerror/><!-- 错误动作  -->
    <s:head></s:head>
    <s:fielderror/>

    <s:form action="register.action">
        <s:textfield name="username" label="用户名" requiredLabel="true" requiredPosition="left"/>
        <s:password name="password" label="密码" showPassword="true"/>
        <s:textfield name="birthday" label="生日"/>
        <s:submit value="注册"/>
    </s:form> 
   </body>
</html>

然后当我们没有填写birthday的时候就会提示如下
这里写图片描述

注意,要显示中文,需要在javabean目录当中创建一个与类的名字一样的javabean中的名字properties
这里写图片描述
这里写图片描述


数据验证有编程式验证和声明方式的验证

一、编程式验证
我们的所有action都需要继承ActionSupport,ActionSupport中有一个方法

public void validate()

是用来验证的,但是这个方法会对action当中所有的操作例如register(),findall()方法都进行验证,这个明显是不行的,所有就有了两种解决办法,同时在struts2的框架中,它也提供了一个Map<表单的字段名,错误提示>,我们需要做的就是往map中存放错误信息,然后struts2会转到input所指向的位置去显示错误。

1、使用@SkipValidation的注解
当我不需要对findall()进行验证的时候直接使用注解。就不会对这个方法进行验证

    @SkipValidation
    public String findAll(){
        return SUCCESS;
    }

2、定义验证方法的名称:validate+动作名称 动作名称的首字符还要大写
不在重写validate()方法,而是编写validate+动作名称的方法,这样的方法都会执行验证:

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

使用:当需要验证的方方法多的时候使用注解,少就使用定义验证。但是有一个弊端,就是这是硬编码


二、声明方式的验证
声明方式的验证也有两种,一种是基于字段的声明式验证,一种是基于验证器的声明式验证

1、基于字段的声明式验证

  1. ActionClassName-validation.xm
    在UserAction目录下面创建一个UserAction-validation.xml,使用ActionClassName-validation.xm来命名文件时,她是一个动作类验证器,会验证动作类中的所有动作方法
<?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">

 <!-- 使用ActionClassName-validation.xm来命名文件时,她是一个动作类验证器,会验证动作类中的所有动作方法 -->
 <validators>
    <!-- 基于字段的声明式验证 -->
    <!-- field中name属性指定的是表单name属性的取值 -->
    <field name="username">
        <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
        <field-validator type="requiredstring">
            <message>没有用户名字</message>
        </field-validator>
    </field>
 </validators>

因为会验证所有的方法,所有使用这种方式也需要把不需要验证的方法进行注解

2、ActionClassName-ActionName-validation.xml
当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法
他也有两种方式: 基于字段的声明式验证 和基于验证器的验证,他们都只正对特定的动作方法,这里的动作方法是配置文件中< action >当中的name

<?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">
<!-- 当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法 -->
<validators>
    <!-- 基于字段的声明式验证 -->
    <!-- field中name属性指定的是表单name属性的取值 -->
    <field name="username">
        <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
        <field-validator type="requiredstring">
            <message>用户名必须存在</message>
        </field-validator>
    </field>

    <!-- 基于验证器的验证 -->
    <validator type="requiredstring">
        <!-- 以注入的方式,提供要验证的字段信息 
        setFieldName("password");
        -->
        <param name="fieldName">password</param>
        <message>密码必须输入</message>
    </validator>
</validators>

案例

package com.zeroyoung.domain;

public class Student {
    private String username;//不能为null,和空字符串,要去到左右两边的空格
    private int age;//整数,介于18-100之间
    private String eamil;//按照格式输入
    private String password;//长度为3-8
    private String repassword;//两次密码必须保持一致
    private int score;//必须是数组
    private String url;//必须符合url的格式
    private String gender;//性别
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getEamil() {
        return eamil;
    }
    public void setEamil(String eamil) {
        this.eamil = eamil;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getRepassword() {
        return repassword;
    }
    public void setRepassword(String repassword) {
        this.repassword = repassword;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }


}
<?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">
<!-- 当使用ActionClassName-ActionName-validation.xml来命名文件时,它是一个指定动作方法的验证器。只会验证指定的动作方法 -->
<validators>
    <!-- 基于字段的声明式验证 -->
    <!-- field中name属性指定的是表单name属性的取值 -->
    <field name="username">
        <!-- struts2框架为我们集成了很多的内置验证器。requiredstring会验证输入内容是否为空,是否为空字符串。并且去掉左右空格-->
        <field-validator type="requiredstring">
            <message>用户名必须存在</message>
        </field-validator>
    </field>

    <!-- 基于验证器的验证 -->
    <validator type="requiredstring">
        <!-- 以注入的方式,提供要验证的字段信息 
        setFieldName("password");
        -->
        <param name="fieldName">password</param>
        <message>密码必须输入</message>
    </validator>
</validators>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值