输入校验分为客户校验和服务器校验。客户校验主要是通过JAVASCRIPT 代码完成。服务器端校验是通过应用编程实现。输入校验是表现层数据处理的一种,应该由MVC 框架提供。Struts2 提供了内置校验器,应用无需书写任何校验代码,即可完成绝大部分输入校验。如果校验很负责,也可以通过 validate 方法来完成自定义校验。
8.1 验证实例
1) yan.jsp
<s:form action="yan" method="post">
<s:textfield name="username" label="用户名" />
<s:password name="password" label="密码" />
<s:password name="password1" label="验证密码" />
<s:textfield name="age" label="年龄" />
<s:textfield name="birthday" label="出生日期" />
<s:textfield name="workdate" label="工作日期" />
<s:submit label="注册" />
</s:form>
2) Yan.class
public class yan extends ActionSupport
{
private String username;
private String password;
private String password1;
private int age;
private Date birthday;
private Date workdate;
//省略 get / set 方法
if(null==username || username.length()<6 ||username.length()>12)
{
this.addFieldError("username","username invalid");
}
if(null==password || password.length()<6 ||password.length()>12)
{
this.addFieldError("password","password invalid");
}
If ( null!=birthday && null!=workdate )
{
Calendar c1=Calendar.getInstance();
c1.setTime(birthday);
Calendar c2=Calendar.getInstance();
c2.setTime(workdate);
if(c2.before(c1))
{
this.addFieldError("workdate","workdate before birthday");
}
}
3) ok.jsp
<s:property value="username" /> <br />
<s:property value="password" /> <br />
<s:property value="age" /> <br />
<s:property value="birthday" /> <br />
<s:property value="workdate" /> <br />
当 年龄输入非数字类型,会出现
需要在国际化文件加入 xwork.default.invalid.fieldvalue={0} error
也可以做一个局部国际化文件 yan.properties ,要和yan 放在同一个包下
我们还可以把
this.addFieldError("username","username invalid"); 属于 Map
改为 this.addActionError("username invalid"); 属于 Array
Yan.jsp 的错误信息显示,需要加入 <s:actionerror />
8.2 校验框架
我们可以使用校验文件来实现对字段内容的校验
删除 validate方法。 校验文件的名字的规则是 <action名字>-validation.xml . 内容如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入名字</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的用户名只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
</field>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
<message>年纪必须在1到150之间</message>
</field-validator>
</field>
<field name="birthday">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2050-02-21</param>
<message>年纪必须在${min}到${max}之间</message>
</field-validator>
</field>
</validators>
如果输出的是国际化信息 ,那么改为 <message key="xing.username" />
如果要 客户端校验 <s:form action="yan" method="post" validate="true">
如果是客户端验证,那么 <message key="xing.username" /> 会出错误。需要改成下面格式
<message>${getText("xing.username")}</message>
8.3 校验器的配置风格:
一种是字段优先,称为字段校验风格,一种是校验器风格,称为非字段校验器风格。
8.3.1 字段校验器配置风格:
校验文件以<field ../> 元素为基本子元素。在 <validators> 下可以有 <field > 或者是 <validator ./>。出现<field > 就是字段校验器 ,出现<validator ./>就是非字段校验器。字段校验器格式如下:
<field name=”被校验的字段”>
<field-validator type=”校验器名” >
<!—此处需要为不同的校验器指定数量的校验参数 à
<param name=”参数名”>参数值</param>
………
<message key=”I18Nkey “>校验失败提示信息</message>
</field-validator>
<!—如果该字段要满足多个规则,下面可以继续配置多个校验器 –- >
</field>
上面代码可以看出 <field> 是校验规则文件的基本组成单位。每个<field-validator type=”校验器名” >指定一个校验规则。<field-validator > 必须要有个<message>。
8.3.2 非字段校验器配置风格:
是一种以校验器优先的配置方式。在校验器文件的根元素包含了多个<validator /> 元素,每个<validator> 定义了一个规则。
<validator type=”校验器”>
<param name=”fieldname”>需要被校验的字段</param>
<param name=”参数名”>参数值</param>
<message key=”I18Nkey”></message>
</validator>
上例验证文件内容如下:
<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<validator type="requiredstring">
<param name="fieldName">username</param>
<param name="trim">true</param>
<message>用户名不能为空</message>
</validator>
<validator type="regex">
<param name="fieldName">username</param>
<param name="trim">true</param>
<param name="expression"><![CDATA[(\W{4,25})]]></param>
<message>用户名长度要在4-25 之间</message>
</validator>
<validator type="requiredstring">
<param name="fieldName">password</param>
<param name="trim">true</param>
<message>密码不能为空</message>
</validator>
<validator type="regex">
<param name="fieldName">password</param>
<param name="trim">true</param>
<param name="expression"><![CDATA[(\W{4,25})]]></param>
<message>密码长度要在4-25 之间</message>
</validator>
<validator type="int">
<param name="fieldName">age</param>
<param name="min">1</param>
<param name="max">150</param>
<message>年龄超过范围</message>
</validator>
<validator type="date">
<param name="fieldName">birthday</param>
<param name="min">1900-01-01</param>
<param name="max">2050-1-1</param>
<message>年龄超过范围</message>
</validator>
</validators>
<field-validator type="requiredstring" short-circuit="true"> 表示短路的意思
8.4 内建校验器
1) 必填校验器 : required,要求指定的字段必须有值,他可以接受一个参数
fieldname 该参数指定校验的Action 属性名,如果采用字段校验器风格,则无需指定改参数
(1) 非字段校验器
<validator type="required">
<param name="fieldName">username</param>
<param name="trim">true</param>
<message>用户名不能为空</message>
</validator>
2) 必填字符串校验器:requiredstring 表示字符串的长度必须是大于0. 防止””出现
(1) 非字段校验器
<validator type="requiredstring">
<param name="fieldName">username</param>
<param name="trim">true</param>
<message>用户名不能为空</message>
</validator>
3) 整数校验器: int .可接受如下参数 fieldName , min , max
(1) 非字段校验器
<validator type="int">
<param name="fieldName">age</param>
<param name="min">1</param>
<param name="max">150</param>
<message>年龄超过范围</message>
</validator>
4)日期校验器:date,可接受如下参数 fieldName , min , max
(1)非字段校验器
<validator type="date">
<param name="fieldName">birthday</param>
<param name="min">1900-01-01</param>
<param name="max">2050-1-1</param>
<message>年龄超过范围</message>
</validator>
5) 字段表达式校验器:fieldexpression . 他可以接受两个参数 fieldname 和 expression 。其中 expression 指定一个逻辑表达式,该逻辑表达式是基于ValueStack进行求值的。他返回一个 boolean。True 表示通过.
( 1) 非字段校验器
<validator type="fieldexpression">
<param name="fieldName">password</param>
<param name="expression"><![CDATA[(password == password1)]]></param>
<message>两个密码不一样</message>
</validator>
(2) 字段校验器
<field name="password">
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password == password1)]]></param>
<message>两个密码不一样</message>
</field-validator>
</field>
6 ) 邮件地址校验器: email
( 1) 非字段校验器
<validator type="email">
<param name="fieldName">email</param>
<message>不是一个有效的邮件地址</message>
</validator>
(2) 字段校验器
<field name="email">
<field-validator type="email">
<message>不是一个有效的邮件地址</message>
</field-validator>
</field>
7 ) 网址校验器: url
( 1) 非字段校验器
<validator type="url">
<param name="fieldName">url</param>
<message>不是一个有效的网址</message>
</validator>
(2) 字段校验器
<field name="url">
<field-validator type="url">
<message>不是一个有效的网址</message>
</field-validator>
</field>
8)字符串长度校验器: stringlength ,他可以接受如下几个参数
fieldName maxLength minLength trim
( 1) 非字段校验器
<validator type="stringlength">
<param name="fieldName">username</param>
<param name="minLength">4</param>
<param name="maxLength">150</param>
<message>名字长度超过范围</message>
</validator>
(2) 字段校验器
<field name="username">
<field-validator type=" stringlength ">
<param name="minLength">4</param>
<param name="maxLength">150</param>
<message>名字长度超过范围</message>
</field-validator>
(9) 正则表达式校验器: regex .他接受如下参数
fieldname : Acton属性名
expression :参数是必须的,用来匹配的正则表达式
caseSensitive:指定匹配的时候是否区分大小写,默认 true;
( 1) 非字段校验器
<validator type="regex">
<param name="fieldName">password</param>
<param name="trim">true</param>
<param name="expression"><![CDATA[(\W{4,25})]]></param>
<message>密码长度要在4-25 之间</message>
</validator>
(2) </validator>字段校验器
<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>必须输入密码</message>
</field-validator>
<field-validator type="regex">
<param name="expression"><![CDATA[(\w{4,25})]]></param>
<message>您输入的密码只能是字母和数组,且长度必须在4到25之间</message>
</field-validator>
<field-validator type="fieldexpression">
<param name="expression"><![CDATA[(password == password1)]]></param>
<message>两个密码不一样</message>
</field-validator>
</field>