2007年2月7日星期三

Struts Validator验证插件

Struts框架的一个主要好处是它提供了对接收到的表单数据进行验证的内置界面。如果有任何验证失败,则应用程序都会重新显示HTML表单,这样就可以改正无效的数据了。如果验证成功,则处理过程会继续进行。Struts框架的简单验证界面会减少与处理数据验证有关的令人头疼的事情,这样你就可以把精力集中到验证代码上,而不是放到捕获数据、重新显示不完整或无效数据的技巧上。但是,Struts内置的验证界面也有缺点。例如,在整个应用程序中验证代码常常会大量重复,因为许多域需要相同的验证逻辑。对一些相似字段的验证逻辑进行任何修改都要求在几个地方修改代码,还要重新编译受影响的代码。为了解决这个问题并增强Struts验证界面的功能,作为Struts的第三方附加件创建了Validator框架。后来,Validator被集成到核心Struts代码库中,并从Struts中分离出来,现在它是一个独立的Jakarta Commons项目。虽然Validator是一个独立的框架,但它仍能与其他程序封装在一起后提供,并与Struts无缝集成。


Validator


没有Validator,你就不得不编写验证表单数据所需的全部代码,并把它放入Form Bean对象的validate()方法中。对于想在其上进行数据验证的每个Form Bean域来说,都需要编写逻辑代码来实现验证。此外,你还必须编写代码来存储验证失败时的出错消息。有了Validator,你就不必在Form Bean中编写用于验证或存储错误消息的任何代码。相反,Form Bean提供了Validator的一个ActionForm子类,它提供验证或存储错误消息的功能。


可把Validator框架作为一个可用于Form Bean验证的可插入的验证例行程序系统来进行安装。每个验证例行程序都只是一个Java方法,负责执行特定类型的验证任务,验证可能通过,也可能失败。 默认情况下,Validator与几个有用的验证例行程序封装在一起来提供,这些例行程序能满足大多数情况下的验证要求。但是,如果Validator框架没有提供你需要的验证例行程序,那么你可以自己创建定制的验证例行程序,并将它插入到该框架中。此外,Validator还支持服务器端和客户端(JavaScript)的验证,而Form Bean只提供服务器端验证界面。


Validator使用两个XML配置文件来分别确定安装哪个验证例行程序和如何将它们应用于给定的应用程序。第一个配置文件validator-rules.xml说明应该被插入到框架中的验证例行程序,并提供每个验证的逻辑的名称。validator-rules.xml文件还定义了每个验证例行程序的客户端JavaScript代码。可以配置Validator让它把这个JavaScript代码发送到浏览器上,这样验证就可以在客户端和服务器端进行了。


第二个配置文件validation.xml确定哪个验证例行程序应用到哪个Form Bean。文件中的定义使用struts-config.xml文件给出的Form Bean的逻辑名称以及validator-rules.xml文件给出的验证例行程序的逻辑名称,以便把二者关联起来。使用Validator框架包括启用Validator插件、配置Validator的两个配置文件,以及创建提供Validator的ActionForm子类的Form Beans。



启用Validator插件


虽然Validator框架是与Struts封装在一起提供的,但在默认状况下Validator并不被启用。为了启用Validator,要向你的应用程序的struts-config.xml文件中添加下面的插件定义。



<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>

该定义告诉Struts为你的应用程序加载并初始化Validator插件。在初始化时,该插件装入由路径名属性指定的、用逗号分隔的Validator配置文件清单。每个配置文件的路径应该用与Web应用程序的相关的路径来指定,如前面的例子所示。



配置validator-rules.xml


Validator框架可以设置为可插入系统,其验证例行程序仅仅是插入到该系统中执行具体验证的Java方法。validator-rules.xml文件说明性地插入Validator用于执行验证的验证例行程序中。Struts示例应用程序带有这个文件的预配置拷贝。在大多数情况下,你不必修改这个预配置拷贝,除非你要向该框架中添加自己定制的验证。默认情况下,Validator中包括几个基本验证例行程序,你可以用它们来处理大多数验证问题。这些例行程序具有逻辑名称,如required(用于输入要求的值)、minlength(最小值)、maxlength(最大值)、CreditCard(用于输入信用卡号码值)、email(用于输入电子邮件地址值),等等。



关于Struts中的From Bean


org.apache.struts.action.ActionForm


ActionForm是Struts表单,它本身设计为JavaBean,您要继承ActionForm来设计一个表单,并提供标准的getter与setter方法,必要时可以使用继承下来的reset()、validate()等方法供 Struts 组件使用。客户请求交给了 RequestProcessor后,RequestProcessor会从 ActionMapping 中得知所使用的ActionForm,这是在struts-config.xml中设定的,如果所需的ActionForm还不存在就生成一个,之后一直使用它,ActionMapping与ActionForm会被当作参数传递给 Action。


org.apache.struts.action.DynaActionForm


DynaActionForm扩展了ActionForm,它的用法允许通过在struts-config.xml声明建立一个表单对象。RequestProcessor用和ActionForm相同的方式建立、填充并验证了DynaActionForm。但是DynaActionForm不能用于配置Validator验证。


org.apache.struts.validator.ValidatorForm


如果您配置好验证器插件,应该扩展ValidatorForm而不是ActionForm,以便它能加载你的Validator资源。他根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器,因此在validator.xml中的form元素的名称属性应该与action的name属性值相匹配,以便Validator与From Bean相关联进行验证(它与ActionForm功能上是差不多的,只是它是相关的validator包中,是专门用于Form Bean验证的)。


org.apache.struts.validator.DynaValidatorForm


DynaValidatorForm允许在struts-config.xml声明建立一个表单对象。RequestProcessor用和ValidatorForm相同的方式建立、填充。它又可以象ValidatorForm一样进行From Bean验证,与ValidatorForm一样它根据struts-config.xml文件中action的name属性为当前form的调用相应的验证器。是一个标准的动态验证表单。


org.apache.struts.validator.ValidatorActionForm


ValidatorActionForm是Validator的一种高级应用,它的编写方式与ValidatorForm完全相同,需要继承ValidatorActionForm并提供标准的getter与setter方法。不过在validator.xml的配置中,会把一组验证映射到一个操作路径,而不是映射到Form Bean名。这样就会由操作来自己选择需要验证的Form Bean。


org.apache.struts.validator.DynaValidatorActionForm


DynaValidatorActionForm是ValidatorActionForm的一个动态实现,可以在struts-config.xml声明建立一个表单对象。validator.xml的配置中,会把一组验证映射到一个操作路径,而不是映射到Form Bean名。这样就会由操作来自己选择需要验证的Form Bean。



配置validation.xml文件


validation.xml文件用于声明将应用到Form Beans的一组验证。要验证的每个Form Bean在这个文件中都有自己的定义。在这个定义中,指定要应用到该Form Bean的各域的验证。


validation.xml文件的第一个元素是form-validation。这个元素是该文件的主元素,而且只定义一次。在form-validation元素内定义form-set元素,它包括多个表单元素。一般来说,在文件中只定义一个form-set元素,但是如果要将验证国际化,那就要在每个地方单独使用一个form-set元素。


每个表单元素使用name属性将名称与其所包含的域验证集关联起来。Validator使用这个逻辑名称将这些验证映射到在struts-config.xml文件中定义的一个Form Bean。根据要验证的Form Bean的类型,Validator力求将该名称与Form Bean的逻辑名称或操作路径相匹配。在表单元素内,field元素定义要应用到Form Bean的特定域的验证。field元素的property属性对应于特定Form Bean中的域名。depends属性利用validator-rules.xml文件指定验证例行程序的逻辑名称,这些例行程序将应用到域验证中。(在From Bean的高级应用中,表单元素使用name属性的值为一个操作路径,每个操作路径下有自己的一套字段验证)。



启用客户端验证


Validator除了提供了简化服务器端表单数据验证过程的框架外,它还提供了执行客户端验证时易于使用的方法。在validator-rules.xml文件中定义的每一个验证例行程序都可以随意指定JavaScript代码,这些代码可以在浏览器(客户端上的)中运行,从而执行与服务器端进行的验证相同的验证过程。在客户端进行验证时,除非所有表单都通过验证,否则这些表单不允许被提交。


为了启用客户端验证,必须在每个需要验证的JSP中放上Struts HTML Tag Library(标记库)的javascript标记,如:<html:javascript formName="logonForm"/>



没有评论: