在Struts2框架中,可以实现客户端验证和服务器验证;
服务器验证分为两种方式:
一,编程实现验证
在之前的,已经对ActionSupport进行了了解。知道了ActionSupport类实现了Vaildateable接口,但对vaildate()方法的实现是一个空实现。在创建Action对象时,通过继承ActionSupport类实现的,如果需要验证数据的有效性时,直接重写vaildate方法。
1.验证流程:
如果在一个Action类中编写多个请求处理方法,而此重写vaildate方法,在默认情况下,在执行每一个请求方法的过程中,都会经过validate()方法的验证处理。验证如果发生错误,可以根据错误的level选择字段级(fielderror)错误,还是动作级(actionerror)错误。并且可使用addFieldError或addActionError加入相应的错误信息,如果存在Action或Field错误,Struts2 会返回“input”(<result name="input">xxx.jsp</result>)如果返回了“input”,Struts2 就不会再调用execute 方法了。如果不存在错误信息,Struts2在最后会调用execute 方法。
2.添加错误信息:
addFieldError(String fieldName,String errorMessage),添加字段的错误信息
addActionError(String anErrorMessage),添加与Action所处理业务相关的错误信息
3.在页面输出结果:
- <s:fielderror/>输出一个或者所胡字段的错误信息
- <s:actionerror/>输出所有Action的错误信息
4.对Action指定的方法进行验证:
通过validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写。当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport ),如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。
二,基于XML配置实现验证(声明式验证)
1.验证文件的命名规则
验证文件要遵循一定的命名规则,其验证文件的名称必须为ActionName-validation.xml 或ActionName-AliasName-validation.xml的形式,ActionName为Action对象的名称,AliasName为Action配置中的名称,也就是struts.xml文件中Action元素对应的name属性的名称。
(1) ActionName-validation.xml :
以这个方式命名,数据的验证会作用于整个Action对象,并验证Action对象的请求业务处理流程。
如果Action对象只存在单一的处理方法,或在多个请求处理方法中,验证处理的规则都相同。可以用这个方式命名
(2)ActionName-AliasName-validation.xml:
如果一个Action对象包含多个请求处理方法,而又没有必要对每一个方法进行验证处理,只需要对Action对象中的特定方法进行处理,就可以用这种方法。
与上一种方式进行比较,这种命名方式更加灵活。
2.编写验证文件
(1)声明式验证程序可以分为两类:
- 字段验证:判断某个字段属性的输入是否有效。代码示例如下:
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
</field>
- 非字段验证:不知针对某个字段,而是针对多个字段的输入值之间的逻辑关系进行校验。代码示例如下:
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(pass==rpass)]]></param>
<message>两次输入密码不一致</message>
</field-validator>
(2)使用一个声明式验证程序的步骤:
- 确定哪些Action字段需要验证
- 编写一个验证程序的配置文件,命名方式就是上面讲的两种方式
- 确定验证失败时的响应页面:在struts.xml文件中定义一个<result name="input">的元素
- 显示错误消息: 表单使用非simple主题。则自动显示错误消息;使用的是simple主题,需要自动编写显示的错误消息,s:filedErrors标签或直接使用EL表达方式(使用OGNL)
3.Struts2框架自建的验证程序:
- required: 确保某给定字段的值不是空值 null “”
- requiredstring: 确保某给定字段的值既不是空值 null, 也不是空白.
- trim 参数. 默认为 true, 表示 struts 在验证该字段值之前先剔除前后空格.
- stringlength: 验证一个非空的字段值是不是有足够的长度.
- minLength: 相关字段的最小长度. 若没有给出这个参数, 该字段将没有最小长度限制
- maxLength:相关字段的最大长度. 若没有给出这个参数, 该字段将没有最大长度限制
- trim: 在验证之前是否去除前后空格
- date: 确保某给定日期字段的值落在一个给定的范围 :max:相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制;min:相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制
- email: 检查给定 String 值是否是一个合法的 email
- url: 检查给定 String 值是否是一个合法的 url
- regex: 检查某给定字段的值是否与一个给定的正则表达式模式相匹配.
- expresssion*: 用来匹配的正则表达式
- caseSensitive: 是否区分字母的大小写. 默认为 true
- trim: 是否去除前后空格. 默认为 true
- int: 检查给定整数字段值是否在某一个范围:min: 相关字段的最小值. 若没给出这个参数, 该字段将没有最小值限制;max: 相关字段的最大值. 若没给出这个参数, 该字段将没有最大值限制
- conversion: 检查对给定 Action 属性进行的类型转换是否会导致一个转换错误. 该验证程序还可以在默认的类型转换消息的基础上添加一条自定义的消息
- expression 和 fieldexpression: 用来验证给定字段是否满足一个 OGNL 表达式.
前者是一个非字段验证程序, 后者是一个字段验证程序.
前者在验证失败时将生成一个 action 错误, 而后者在验证失败时会生成一个字段错误
实现空表单信息的提示:
1.先创建一个Strust2框架的工程,并配置好所需要的包到WEB-INF/lib下
2.Web.xml配置Struts2框架的过滤器
3.编写一个Action(ZhuceAction)继承ActionSupport
package action;
import com.opensymphony.xwork2.ActionSupport;
public class ZhuceAction extends ActionSupport{
private String name;
private String pass;
private String repass;
private int age;
private String phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getPass() {
return pass;
}
public String getRepass() {
return repass;
}
public void setPass(String pass) {
this.pass = pass;
}
public void setRepass(String repass) {
this.repass = repass;
}
public void setAge(int age) {
this.age = age;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
编写验证文件Zhuce-validation.xml (要注入引入dtd文件的写法)
<?xml version="1.0" encoding="GBK"?>
<!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="name">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="pass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>密码不能为空</message>
</field-validator>
</field>
<field name="repass">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>确认密码不能为空</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(pass==rpass)]]></param>
<message>两次输入密码不一致</message>
</field-validator>
</field>
<field name="phone">
<field-validator type="requiredstring">
<message>电话不能为空</message>
</field-validator>
</field>
</validators>
jsp文件代码如下:
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>注册验证</title>
</head>
<body>
<h1>请输入你的注册信息</h1>
<s:form action="zhuce">
<s:textfield label="姓名" name="name"/>
<s:password label="密码" name="pass"/>
<s:password label="确认密码" name="repass"/>
<s:textfield label="年龄" name="age"/>
<s:textfield label="电话" name="phone"/>
<s:submit value="提交"/>
</s:form>
</body>
</html>
在输入出错时,出现信息提示。截图: