在前两个当中我们知道了,当数据类型不符合的时候可以进行数据类型的转化,但是,我们并不能对所有的错误都进行转化解决,所有需要处理错误,当我们不进行处理的时候就需要进行表单的错误处理。
当类型转换失败,如何进入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、基于字段的声明式验证
- 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>