struts2提供了一套数据验证框架,使得用户只需写很少的代码或者根本就不用写代码就可以完成系统开发中最繁琐的数据验证功能,只需要对每个要验证的数据项提供要验证的配置信息即可。
假设有一个Action类,名字叫xxxAction,要经过这个Action进行业务逻辑处理之前,必须要对从客户端发过来的数据进行有效性验证。用户只需要提供一个名字叫xxx-validation.xml的配置文件,在这个配置文件里对每个要验证的数据项进行配置,只在执行Action的处理方法之前,struts2会根据这个配置文件调用验证框架(其实是一个拦截器)对数据进行验证。如果没有通过验证,该拦截器会将错误消息放到错误消息中,在页面可以输出错误消息。这样的话就截断了非法数据对系统的破坏,从而构造出跟健壮的系统。
要想在客户端执行JavaScript验证,只需在<s:form>标签中添加validate=“true”即可。这是大多数资料包括网上很多人都是这样说的,但我发现这样做的话,在页面上会生成一个JavaScript的方法,叫validateForm_xxx(),xxx是form的名字,在表单提交的是后,会调用这个方法对各个已经配置了验证规则的数据项进行验证。但该方法会用到另外的方法,如clearErrorMessages(),这个方法是定义在一个叫validation.js的文件中的。而且,在<form>之前已经把该文件导了进来,<script type="text/javascript" src="/archivesMg/struts/xhtml/validation.js"></script>。但当我没有填任何数据而点击提交按钮的时候,却出现了JavaScript的错误而且页面也提交成功了,虽然看到了对啊非法数据项的提示,但这些提示信息均来自于服务器端。也就是说客户端没有对数据进行验证。原因就是没找到validation.js这个文件。于是我发现了这个文件藏身于struts2-core-2.0.12.jar中template/xhtml/这个目录下。开始的时候我把这个文件提取出来,放到了webRoot/struts/xhtml下面,以为一切OK啦,谁知道还是找不到这个文件。我又把这个文件放到另外一个目录,并在jsp文件中做了导入,这样就行了。我百思不得其解,为什么用struts作为目录就不行呢。后来又研究了很久,上网查了很多资料,终于被我发现了一句话,The Dojo files are shipped with Struts 2.0.x within struts2-core-2.0.x.jar. When a request for a resource is received that starts with the /struts URL, the FilterDispatcher serves the corresponding file in struts2-core-2.0.x.jar:/org/apache/struts2/static/. This feature needs to be turned off to use an alternative Dojo profile.凡是用/struts开头的URL,struts2的过滤器都会到struts2-core-2.0.x.jar:/orgapache/struts2/static/下面去找资源。只要在struts.properties文件中更改一个属性,就可以关闭掉这种默认的特性。struts.serve.static=false 。于是我做了这样的更改后,又建立了struts/xhtml目录,并把validation.js文件放到这个文件中,一切就搞定了。
==========================================================================
使用校验框架校验需要写一个单独的配置文件,有关DTD的声明可以参考struts自带的sample,配置文件的命名格式为:类名-validation.xml。
配置文件中根节点为validators,下面包含一个或多个field或validator节点,既字段校验和非字段校验。
1、字段校验(字段优先)
简单的说就是:要校验什么属性-->用什么去校验这个属性
一个字段校验的配置类似如下:
代码
<!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=”stringlength”>
<param name=”trim”>true</param>
<param name=”maxLength”>8</param>
<param name=”minLength”>3</param>
<message>用户名长度应该在${maxLength}到 ${minLength}之间 </message>
</field-validator>
</field>
<field name=”birthday”>
<field-validator type=”required”>
<message>生日不能为空</message>
</field-validator>
<field-validator type=”date”>
<param name=”min”>1987-01-01</param>
<param name=”max”>2010-12-12</param>
<message>生日应该在${min}与${max}之间</message>
</field-validator>
</field>
</validators>
a. field节点的name属性指定要校验的字段
b. field-validator的type属性是依据 xwork.jar/com.opensymphony.xwork2.validator.validators下的default.xml 中的定义,它声明了用什么类来校验属性。param节点配置参数值,具体有哪些参数是在声明type值对应的校验类里面定义好了的,这里只用为它赋上值。
c. message标签中的内容为校验失败的提示信息,错误信息将会放在fieldError里面,在错误信息中可以用类似EL表达式的语法引用参数值。
2、非字段校验(校验器优先)
与字段校验相反,非字段校验为:用什么去校验属性-->校验什么属性
一段非字段校验的配置类似如下:
代码
<!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>
<message>用户名不能为空!</message>
</validator>
<validator type=”stringlength”>
<param name=”fieldName”>username</param>
<param name=”maxLength”>8</param>
<param name=”minLength”>3</param>
<message>用户名长度应该在${maxLength} 和 ${minLength}之间!</message>
</validator>
</validators>
其实也就是先声明type,然后再声明属性,其他都和字段校验类似。
建议:不要同时用配置文件和硬编码对同一个类进行校验,如果同时做了两种方式的校验,那面两种校验都会执行,没有什么意义。最好只用一种校验方式。
Struts2同样支持客户端校验(不提倡使用,验证比较死板,功能比较弱)
1、form的主题(theme)一定不能设置为simple
2、将form的validate属性设置为true