一、输入校验简介
验证程序可以分为两大类别:字段验证器(Field validators)和非字段验证器(Non-field validator)。
字段验证用户程序与表单中的某个字段想关联,其验证行为发生在把一个值赋给一个动作属性之前。例如输入的用户名不满足要求(如要求全英文却含有中文),则在属性赋值之前,就会提示输入不符合要求。这通常是由客户端通过javascript来完成验证。
非字段验证程序(普通验证器)不与某个特定的字段相关联,他们用来测试某种特定的条件是否得到了满足,这一版是由服务器完成验证的。例如用户名注册时检测到用户名已被其他人注册,则提示更换用户名。
Struts2内建的验证器基本上都是字段验证器。Validation拦截器负责加载和执行已经注册的验证器,由于Validation拦截器是defaultStack拦截器栈中的一员,因此我们可以不用声明就可以直接使用内建的验证器。
二、输入校验的实现
数据校验包含两种方式,第一种是手动编码完成数据校验方式,第二种是通过配置文件完成数据校验方式。
1、手动编码校验方式
开发的步骤
步骤一: 封装数据
步骤二: 实现校验Action ,必须继承ActionSupport 类
步骤三: 覆盖validate方法,完成对Action的业务方法数据校验 this.addFieldError。该方法由(ActionSupport提供)
步骤四: 在jsp中 通过 <s:fieldError/> 显示错误信息
例如Action编写可以如下所示:
//省略的导入包语句 public class RegistAction extends ActionSupport { private String name; private String pass; private int age; private Date birth; //省略了get和set方法 public void validate() //重写validate方法 { System.out.println("进入validate方法进行校验" + name == null); //要求用户名必须包含test子串 if(!name.contains("test")) { addFieldError("user" , "您的用户名必须包含test!");//添加到系统的FieldError中 } } }
<%@ page language="java" contentType="text/html; charset=GBK"%> <%@taglib prefix="s" uri="/struts-tags"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/> <title>请输入您的注册信息</title> </head> <body> <H1>请输入您的注册信息</H1> 错误提示信息:<s:fielderror/> <FORM METHOD="POST" ACTION="regist.action"> 用户名:<INPUT TYPE="text" NAME="name"><br> 密 码:<INPUT TYPE="text" NAME="pass"><br> 年 龄:<INPUT TYPE="text" NAME="age"><br> 生 日:<INPUT TYPE="text" NAME="birth"><p> <INPUT TYPE="submit" value="注册"> </FORM> </body> </html>
以上我们通过覆盖validate方法完成数据校验是针对的是Action中所有的方法进行校验。我们可以也可以针对Action中某个方法完成校验。实现原理类似于Action的动态实现。我们可以为Action设计一个validateXxx方法,其中Xxx是Action要处理的逻辑方法。
例如可以在在Action中编写一个方法,方法名是validateAdd(),只用于校验add方法。再编写一个validateSave(),只用于校验save的方法。
可以把上面的RegistAction改成如下形式:
public class RegistAction extends ActionSupport { private String name; private String pass; private int age; private Date birth; //省略了get和set方法 public String regist() { return SUCCESS; } public void validate() { System.out.println("进入validate方法进行校验" + name == null); //要求用户名必须包含leegang子串 if(!name.contains("test")) { addFieldError("user" , "您的用户名必须包含test!"); } } public void validateRegist() { System.out.println("进入validateRegist方法进行校验" + name == null); //要求用户名必须包含yeeku子串 if(!name.contains("name")) { addFieldError("user" , "您的用户名必须包含name!"); } } }
除此之外,还必须在struts.xml文件中指定校验方法。
<action name="regist" class="lee.RegistAction" method="regist">
<result name="input">/regist.jsp</result>
<result>/show.jsp</result>
</action>
通过上述配置,指定了regist方法来处理名为regist的Action请求。这样,用户提交数据时,不仅validate方法会进行数据校验,validateRegist也会进行数据校验。而且validateRegist优先执行。
2、通过XML配置文件的方式完成数据的校验
xml配置校验原理 : 将很多校验规则代码已经写好,只需要在xml中定义数据所使用校验规则就可以了
开发的步骤
步骤一 :编写jsp
步骤二 :编写Action 继承ActionSupport 或者 实现 Validateable 接口
步骤三 :封装请求参数,使用xml校验 必须提供get方法
步骤四 :编写校验规则xml文件
具体的配置文件相关标签和属性详解
<validators> <field name="password"> <!-- 校验器类型 --> <field-validator type="requiredstring"> <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> <validators>
如果是针对Action中所有的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-validation.xml。并且需要引入指定的DTD的约束:xwork-core-2.3.15.3.jar/xwork-validator-1.0.3.dtd
如果是针对Action中某个的方法进行校验,则配置方法如下:
在Action所在的包中创建一个XML文件,命名规则:Action类名-方法对应的访问路径-validation.xml。引入DTD文件等。例如:RegistAction-regist-validation.xml
3、Struts2框架提供的XML校验规则
一般而言,每个struts2框架的校验器都有一个fieldName的属性值,可以用来设置校验器的类型时非字段类型还是字段类型。不指定该属性值时默认是字段校验器,即服务器端完成校验。
例如输入密码的非字段验证器配置如下:
<validators> <!-- 校验器类型 --> <validator type="requiredstring"> <!-- 设置校验器类型为非字段校验器 --> <param name="fieldName">password</param> <message>密码不能为空</message> </validator> <validators>
* required (必填校验器,要求被校验的属性值不能为null),空格没问题。
* requiredstring (必填字符串校验器,要求被校验的属性值不能为null,并且长度大于0,默认情况下会对字符串去除前后的空格)
* stringlength (字符串长度校验器,要求被校验的属性值必须在指定的范围内,否则校验失败,minLength参数指定最小长度,maxLength参数指定最大长度,trim参数指定校验field之前是否去除字符串前后的空格)
* regex (正则表达式校验器,检查被校验的属性值是否匹配一个正则表达式,expression参数指定正则表达式,caseSensitive参数指定进行正则表达式匹配时,是否区分大小写,默认值为true)
* int(整数校验器,要求field的整数值必须在指定范围内,min指定最小值,max指定最大值)
* double(双精度浮点数校验器,要求field的双精度浮点数必须在指定范围内,min指定最小值,max指定最大值)
* fieldexpression (字段OGNL表达式校验器,要求field满足一个ognl表达式,expression参数指定ognl表达式,该逻辑表达式基于ValueStack进行求值,返回true时校验通过,否则不通过)
* email(邮件地址校验器,要求如果被校验的属性值非空,则必须是合法的邮件地址)
* url(网址校验器,要求如果被校验的属性值非空,则必须是合法的url地址)
* date(日期校验器,要求field的日期值必须在指定范围内,min指定最小值,max指定最大值)