Struts_Validator学习笔记.txt

Struts_Validator学习笔记.txt

www.apache.org上下载struts-1.2.7-lib.zip。把/struts-1.2.7-lib/struts-1.2.7-lib里的*.jar
拷贝到/WebRoot/WEB-INF/lib下,把其他的*.tld和*.xml拷贝到/WebRoot/WEB-INF/下。

MyEclipse Version: 3.8.3使用MyEclipse自带的,把项目添加上Struts功能--Struts的版本是1.1,后启动WebLogic,在控制台中会显示3条带"信息"字样,的红字。注意:这些并不是错误。
但如果添加Struts的版本是1.2时,会导致项目不可用。在启动WebLogic时,显示完2条“信息”后,会出一个严重的错误。意思是不能解析资源文件。这完全是MyEclipse或Struts1.2的BUG。
手工添加struts-1.2.7到项目中时,启动不会有资源文件的错误,也不会有红色的“信息”提示.

1、启用Validator插件;
起用标签配置成:
     <plug-in
   className="org.apache.struts.validator.ValidatorPlugIn">
   <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

<plug-in>标签。 在struts应用程序启动的时候,ActionServlet通过init()方法实例每一个Plugin,struts支持一个或多个Plugin。因为很适合在PlugIn中实现一些系统初始化工作,比如数据库连接的初始化

用逗号分隔的Validator配置文件清单。
注意不要把property=和value=的值搞反。因为就算写了个不存在的property,也不会有错误提示。郁闷死也找不到原因。

2、生成Form Bean类;
这个FormBean要继承org.apache.struts.validator.ValidatorForm类或ValidatorActionForm 类。

ValidatorForm类与ValidatorActionForm 类的区别在于:
继承ValidatorForm类的Form在validation.xml中的,form 的name属性=struts_config.xml里的form-bean标记的name属性。
也就是说继承ValidatorForm,校验只能针对form-bean所有使用这个form-bean的path都会被校验
继承ValidatorActionForm类的Form在validation.xml中的,form 的name属性=struts_config.xml里的action标记的path属性。
也就是说继承ValidatorActionForm,能针对action标记的path ,每个path都有自己的校验。
相对的还有DynaValidatorForm类与DynaValidatorActionForm 类的关系也是这样。

3、修改配置文件validation.xml
Struts开发包中存在validator-rules.xml文件,将其拷贝到应用模块的WEB-INF目录下(当然也可以自己新建并编写此文件)。
在同一目录下新建validation.xml文件,并编写验证内容。

如果 ValidatorForm 中存在validate函数,validation.xml里对应的 ValidatorForm 的校验就失效了。validate函数启效。

如果validation.xml不存在,会报异常:
javax.servlet.ServletException: Skipping validation rules file from '/WEB-INF/validation.xml'.   No stream could be opened.
导致加载文件不成功。Validator不起效。

注意在struts_config.xml中把validate="true" 默认是false。

文章:用Validator检查你的表单.htm,一问中对配置文件做了详细的论述。

注意:
validation.xml文件的开头:
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
     "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
     "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
其中<?xml 不是必须的,但<!DOCTYPE是必须的。
这个头部是从struts1.2.7(www.apache.org)中搜索validation.xml得到的文件中拷贝出来的。
如果没有会抛出异常:
org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'form-validation'.

validator_1_1_3.dtd从得到的validator_1_1_3.xml也有个头部:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation SYSTEM "validator_1_1_3.dtd" >
如果用这个头部文件会抛出异常:提示找不到在…WebLogic/…/mydomin/validator_1_1_3.dtd的文件。的确也没有。

加载文件成功会提示:
<2006-05-22 11:12:09.548> <org.apache.struts.validator.ValidatorPlugIn.initResources(ValidatorPlugIn.java:211)>
-[INFO]:Loading validation rules file from '/WEB-INF/validator-rules.xml'
<2006-05-22 11:12:09.588> <org.apache.struts.validator.ValidatorPlugIn.initResources(ValidatorPlugIn.java:211)>
-[INFO]:Loading validation rules file from '/WEB-INF/validation.xml'

validation.xml文件解析:
例子:<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
           "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
           "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
<form-validation>
<formset>
     <form name="/login">
       <field property="username"
              depends="required,minlength,maxlength">
         <arg0 key="username" resource="false"/>
         <arg1 name="minlength"
           key="${var:minlength}"
           resource="false"/>
         <arg1 name="maxlength"
           key="${var:maxlength}"
           resource="fasle"/>
         <var>
           <var-name>minlength</var-name>
           <var-value>4</var-value>
         </var>
         <var>
           <var-name>maxlength</var-name>
           <var-value>16</var-value>
         </var>
       </field>
       <field property="password"
              depends="required,integer,intRange">
         <arg0 key="password" resource="false"/>
         <arg1 name="intRange"
           key="${var:min}"
           resource="false"/>
         <arg2 name="intRange"
           key="${var:max}"
           resource="false"/>
         <var>
           <var-name>min</var-name>
           <var-value>1</var-value>
         </var>
         <var>
           <var-name>max</var-name>
           <var-value>100</var-value>
         </var>
       </field>
     </form>
   </formset>
</form-validation>

解析:
第一个元素是form-validation。这个元素是该文件的主元素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个表单元素。一般来说,在文件中只定义一个form-set元素,但是如果要将验证国际化,那就要在每个地方单独使用一个form-set元素。
每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个Form Bean。根据要验证的Form Bean的类型,Validator力求将该名称与Form Bean的逻辑名称或操作路径相匹配。
form标记的name属性,或者等于Form Bean的逻辑名称或操作路径相匹配。这取决于form是继承ValidatorForm类还是ValidatorActionForm 类
在表单元素内,field元素定义要应用到Form Bean的特定域的验证。
field元素的property属性对应于特定Form Bean中的域名。
depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些例行程序将应用到域验证中。
arg0到arg4:
请注意,每条消息都有占位符,形式为{0}、{1}或{2}。在运行期间,占位符被另一个值代替,如所验证的域的名称。这一特性特别有用,它使你能够创建可被几个不同的域重复使用的通用验证错误消息。
错误消息最多可以有4个占位符:{0}和{3}。这些占位符分别称为arg0到arg3,你可以通过使用arg0~arg3标记来指定它们。
arg0的name属性指定应用于哪个验证条件。与depends属性有对应关系。不指定的话,所有的返回的错误消息的第一个参数都是arg0里的key
key属性指定要代替,资源文件里,并且是validator-rules.xml中定义的验证例行程序的逻辑名称,校验失败后返回的错误信息{0}的位置。
   注意如果resource不等于"false"或没有这个属性。会认为key的内容是资源文件(ApplicationResources.properties)的里定义的错误消息(例如welcome.heading=Welcome!)。
resource="false"不把key的值认为是资源文件中定义的错误消息,默认认为key的内容是资源文件的消息。
var定义变量
var-name变量名
var-value变量值
key="${var:min}"
在${var:变量名}中引用变量。

Field标记的page属性的作用,如果是多步提交的话当前是第几步,值等于或小于表单中page性质的值,JavaBean 才会得到处理;
这里的page是指类似“向导”那种的第几步。

4、引入资源文件。
ApplicationResources.properties

因为validator-rules.xml定义了一些需要校验失败时需要用到的资源文件中的属性名。

validator-rules.xml文件的作用
相当于一个校验的模板,
这个文件定义了validation.xml可以使用那些验证手段。如:maxlength,最长长度;minlength,最短长度等。
也可以向validator-rules.xml添加自己的验证手段。

其中的一个验证定义了:
验证的名称:例如:name="required"
         处理验证的java类:例如:classname="org.apache.struts.validator.FieldChecks"
         处理验证的java类的方法:例如:method="validateRequired"
         处理验证的java类的方法的参数类型:例如:methodParams="java.lang.Object,org.apache.commons.validator.ValidatorAction,org.apache.commons.validator.Field,org.apache.struts.action.ActionErrors,avax.servlet.http.HttpServletRequest"
          验证失败后需要调用的资源文件中的信息:msg="errors.required">
         客户端校验需要的javascript代码:<javascript>,

org.apache.struts.validator.ValidatorPlugIn与配置文件、ValidatorForm等的关系
如果在ActionServlet中,实例化了ValidatorPlugIn,则ActionServlet会把校验先交给ValidatorPlugIn,
加载配置文件到request.getSession().getServletContext()里
ValidatorPlugIn读取ValidatorForm的类型,和配置文件,进行校验,并返回校验结果给ActionServlet。


5、注意事项:
一切都正常,但就是不能使validation.xml生效
通过
查看ValidatorPlugIn原文件
debug服务器。
查看request.getSession().getServletContext()里的属性。
org.apache.commons.validator.VALIDATOR_RESOURCES
org.apache.commons.validator.ValidatorResources@1844479
这个类的变量没有被赋值上validation.xml,或validator-rules.xml里的任何信息,可知,配置文件的初始化失败。

但为什么会失败那?
答:在strtus-config.xml中使用plug-in中使用,property和value的内容写反了。(书写错误)导致配置信息没有加载。

注意:plug-in标签,的property如果是class-name里没有的对象属性的时候。不会报错。界面没有任何提示。
注意:struts-config.xml里的标签action里的path属性,input不能指向同一个.do。如果相同,在校验失败的时候就会陷入死循环,
例如:path="/login",input="/login.do",那么客户端请求login.do。校验失败后,在struts内部就返回到login.do。
login.do 又失败了又返回login.do,最后抛出异常:
java.lang.StackOverflowError

请求发出的页面=请求提交的页面=请求失败转到的页面,那么
合理的做法是,请求从/login.jsp发出,提交到/login.do,失败返回input="/login.jsp",这样就不会陷入死循环了。因为转到/login.jsp是不校验的。
注意:valiedator_rule.xml和valedation.xml作为ValidatorPlugIn的属性pathnames的值,在功能上是完全一样的。在valiedator_rule.xml写的东西同样可以写在valedation.xml,反之也可以。
也就是说formset这类标记可以写在valiedator_rule.xml中,golbal和validator这类标记也可以写在valiedator_rule.xml,这两个文件。既然都做为pathnames的值,在校验的时候实际是把他们当成一个文件的。

如何查看struts包里写的log日志?

注意:一般情况下,你的系统只需要一个ApplicationResources文件,所以开发组的成员不要添加自己的resource文件。只有在你的项目分组开发时才需要使用多个ApplicationResources文件,但是,同时你的struts-config.xml文件也会有相同的数量对应。

6。没有深入研究的功能
1。用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段。
2。自定义可插入验证器,就是validator标记。验证的功能。
3。多页面form

参考文章:
用Validator检查你的表单.htm —— 比较详细
Struts的验证--Validator.htm ——简略,其中的validation.xml的配置的例子,对”用Validator检查你的表单.htm“有补充作用。
Struts Validator--天天向上——学习篇.htm   ——记录了一些注意事项
【Struts Validator验证器使用指南】.htm ——让你从更深入的角度理解STRUTS的Validator
CSDN 文档中心:在Struts中使用Validator框架.htm    ——包括:在非Struts应用程序中使用Validator框架 的部分。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值