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

来源:互联网 发布:mysql配置文件my.ini 编辑:程序博客网 时间:2024/05/21 17:08

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

当类型转换失败,如何进入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>
0 0
原创粉丝点击