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文件放到这个文件中,一切就搞定了。