简要描述
Struts采用Validator框架(Validator框架现在是Jakarta Commons项目的一部分)来解决校验问题,它将校验规则代码集中到外部的且对具体的应用程序中立的.xml文件中,这样,就将那些到处出现的校验逻辑从应用程序中分离出来,任何一个Struts应用都可以使用这个文件,同时还为校验规则的扩展提供了便利。更难能可贵的是由于Validator框架将校验中要用到的一些消息等信息与资源绑定有机结合在一起,使得校验部分的国际化编程变得十分的便捷和自然。
主要构成
Validator框架大致有如下几个主要组件:
- 校验类:
是Validator框架调用的一些Java类,它处理那些基本的通用的校验,包括required、mask(匹配正则表达式)、最小长度、最大长度、范围、日期等。校验类可以根据需要扩展。 - 配置文件:
主要包括两个配置文件,一个是validator-rules.xml,主要包含一些通用的校验规则,另一个是validation.xml,包含需要校验的一些form及其组件的集合。 - 资源绑定:
提供国际化标签和消息,缺省使用struts的资源绑定。即校验所用到的一些标签与消息都写在ApplicationResources.properities文件中。 - Jsp 标签:
为给定的form或者action path生成前端校验的 JavaScript 代码。 - ValidatorForm:
是ActionForm的一个子类。
校验框架的使用
1) 配置
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,
/WEB-INF/validation.xml"/>
</plug-in>
从struts的例子,拷贝文件 validator-rules.xml 和 validation.xml ,放到目录 /WEB-INF 下面
2) 校验定义
例子:
<form name="customerForm">
<field property="name" depends="required">
<arg0 key="customerForm.name"/>
</field>
<field property="address" depends="required">
<arg0 key="customerForm.address"/>
</field>
</form>
其中,表单名称customerForm必须在struts-config.xml中定义。
property为表单的属性。
depends为校验规则的名称。validator_rules.xml中缺省定义的校验规则请参考struts的文档。
<arg0 key="customerForm.name"/>指定校验规则中使用的消息在消息资源文件中的key值
3) 表单类继承
为了使服务器边的验证能够进行,将用到的formBean从ActionForm的子类改为ValidatorForm的子类,如:
public class BaseForm extends ValidatorForm implements Serializable
4) 客户端校验
要实现客户端校验,必须在提交的时候运行校验框架生成的javascript代码。
在<html:form>标签中,添加属性 οnsubmit="return validateCustomerForm(this)"
在标签后加上:
<html:javascript formName="customerForm" cdata="false"
dynamicJavascript="true" staticJavascript="false"/>
<script type="text/javascript"
src="<c:url value="/scripts/validator.jsp"/>"></script>
5) Action指定校验
在action的配置中加上指定校验的属性:validate="true",如:
<action path="/customer/customer"type="com.demo.order.actions.CustomerAction"
name="customerForm"
parameter="method"
input="add"
unknown="false"
validate ="true"
>
<forward name="view" path="model.customer.view">
</forward>
<forward name="add" path="model.customer.add">
</forward>
<forward name="list" path="model.customer.list">
</forward>
</action>