除了Form Bean中的validate()方法,Struts还提供Validator插件进行数据校验,Validator插件能在Jsp页面里面生成JavaScript脚本,利用定制的JavaScript脚本在客户端浏览器进行数据校验。
1.支持自动校验 的ValidatorForm
支持Validator校验的Form Bean必须继承Struts的ValidatorForm。本例使用Validator校验Form Bean的非空字符串、整型变量以及电子邮件。
代码1:ValidateTestForm.java
package com.strust1.test.actionFrom;
import org.apache.struts.validator.ValidatorForm;
public class ValidatorTestForm extends ValidatorForm {
private int age;
private String name;
private String email;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2.Validate规则配置
Validator插件使用配置式数据校验,所有的校验规则都配置在XML文件中。基本上所有的常用校验都能通过配置实现。
代码2:validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<formset>
<form name="validatorTestForm">
<field property="name" depends="required"><!--名字非空-->
<msg name="required" key="validatorTest.error.nameRequired"/>
</field>
<field property="age" depends="required, integer, intRange">
<arg position="0" name="intRange" key="${var:min}" resource="false"/>
<arg position="1" name="intRange" key="${var:max}" resource="false"/>
<var>
<var-name>min</var-name>
<var-value>0</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>100</var-value>
</var>
<msg name="required" key="validatorTest.error.ageRequired"/>
<msg name="integer" key="validatorTest.error.ageinteger"/>
<msg name="intRange" key="validatorTest.error.ageintRange"/>
</field>
<field property="email" depends="required, email">
<msg name="email" key="validatorTest.error.emailformat"/>
<msg name="required" key="validatortest.error.emailrequired"/>
</field>
</form>
</formset>
</form-validation>
被校验的Form表单名称为validateTestForm。配置校验了3个域:name、age、email。其中name的校验规则为requried(表示该输入是必需的)。age的校验规则为required、integer(表示该输入必须为整型)、range(表示该输入值在特定的区间内),email的校验规则为required、email(表示该输入必须符合电子邮件格式)
提示:Struts1.x提供配置式数据验证,并预先封装好了常用的数据校验器,例如字符串、数字、电子邮件等,也可以自定义数据校验器。
3、错误信息配置
如果检验失败,会显示<msg>配置的错误信息。错误信息配置在Struts的资源文件中,key为资源的索引。资源文件内容如下:
validatorTest.error.nameRequired=\u540D\u5B57\u5FC5\u586B
validatortest.error.emailrequired=email\u5FC5\u987B\u586B\u5199
validatorTest.error.ageRequired=\u5E74\u9F84\u5FC5\u586B
validatorTest.error.ageinteger=\u5E74\u9F84\u5FC5\u987B\u662F\u6574\u6570
validatorTest.error.ageintRange=\u5E74\u9F84\u5FC5\u987B\u57280\u5230100\u4E4B\u95F4
validatorTest.error.emailformat=email\u683C\u5F0F\u4E0D\u6B63\u786E
这是编码过的。
4.配置到Struts-config.xml中
校验规则配置完成后,还需要连同校验规则库(也就是validator-rules.xml文件,定义了常用的校验实现代码,位于/WEB-INF下)配置到struts-config.xml中,配置为plugin的形式,代码如下
代码3:struts-config.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<form-bean name="validatorTestForm"
type="com.strust1.test.actionFrom.ValidatorTestForm">
</form-bean>
</form-beans>
<action-mappings>
<action path="/validatorTest"
type="com.strust1.test.action.ValidatorAction"
name="validatorTestForm"
>
</action>
</action-mappings>
<message-resources parameter="com.strust1.test.ApplicationResources"></message-resources>
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validation.xml"/>
<set-property property="stopOnFirstError" value="false"/>
</plug-in>
</struts-config>
第一个参数pathnames为校验规则库文件、校验规则配置文件的路劲。第二个参数为如果前面校验失败是否停止后面的校验。
5.配置客户端JavaScript校验
配置完后,就可以在jsp中引用校验了,jsp中必须使用<html:javaScript/>标签。Struts会在该标签处生成JavaScript校验代码,例如:
代码5:validaeTest.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'validateTest.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<html:form action="/validatorTest" οnsubmit="return validateValidatorTestForm(this)">
姓名:<html:text property="name"></html:text><html:errors property="name"/><br/>
年龄:<html:text property="age"></html:text><html:errors property="age"/>
电子邮件:<html:text property="email"></html:text><html:errors property="email"/>
<html:submit value="提交"></html:submit>
<html:javascript formName="validatorTestForm"/>
</html:form>
</body>
</html>
<html:javaScript>标签的formName与validation.xml中配置的form的name属性遥相呼应。Jsp表单也要使用onsubmit事件。注意代码cοnsubmit="return validateValidatorTestForm(this);"中函数的名称也要用到了form name。