Struts里的Validator验证框架

Validator框架概述
安装和配置Validator框架
validator-rules.xml文件
validation.xml文件
Validator插件
Validator框架和ActionForm
Validator框架示例
在Validator框架中使用JavaScript


Validator框架概述
Struts框架能够在ActionForm的validate()方法中对用户输入的表单数据进行验证。这种验证方式有两个局限:
必须通过程序代码来实现验证逻辑,如果验证逻辑发生变化,必须重新编写和编译程序代码。
当系统中有多个ActionForm,并且它们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm进行重复编程,完成相同的验证逻辑,这会降低代码的可重用性。
Validator框架能被集成到Struts框架中,负责数据验证。并且能克服在ActionForm中以编程方式进行数据验证的局限,它允许Struts应用灵活的配置验证规则,无需编程。
如今,Validator框架在Struts应用中得到了广泛的运用,Apache组织已经把它添加到Jakarta工程中,在Struts软件中携带了Validator框架。

安装和配置Validator框架
Validator框架主要依赖于两个JAR文件:
jakarta-oro.jar
提供了一组处理文本的类,具有文本替换、过滤和分割等功能。
commons-validator.jar
提供了一个简单、可扩展的验证框架,包含了通用的验证方法和验证规则。
如果在Struts应用中使用了Validator框架,那么把这两个JAR文件添加到应用的WEB-INF/lib目录中。
Validator框架采用两个基于XML的配置文件来配置验证规则。这两个文件为validator-rules.xml和validation.xml。在Struts应用,它们均存放在WEB-INF目录下。

validator-rules.xml文件
validator-rules.xml文件包含了一组通用的验证规则,对所有的Struts应用都适用。Struts软件中携带了这个文件。一般情况下,没有必要修改该文件,除非需要修改或扩展默认的规则。
Validator框架提供了14种默认的验证规则:
byte、short、integer、long、float、double:检验输入的数据是否能被转换成对应的基本数据类型
creditCard:检验输入的数据是否是一个合法的信用卡号码
date:检验输入的数据是否是一个合法日期
email:检验输入的数据是否是一个合法Email地址
mask:检验输入的数据是否能成功匹配一个正则表达式
maxLength:检验输入的数据的长度是否小于等于给定的最大长度
minLength:检验输入的数据的长度是否大于等于给定的最小长度
range:检验输入的数据的范围是否在最大值和最小值之间
required:检验输入数据是否为空,或不包含空格值的长度是否大于零

validation.xml文件
Validator框架的第二个配置文件为validation.xml文件。这个文件是针对于某个具体Struts应用的,需要开发人员来创建,它可以为应用中的ActionForm配置所需的验证规则,取代在ActionForm类中以编程的方式来实现验证逻辑。
                元  素                                                        说  明
<form-validation>                                       根元素,它包含两个子元素<global>与<formset>
<global>                                                     包含多个<constant>子元素
<constant>                                                 用来定义常量表达式,其中<constant-name>元素指定常量名,                                                                   <constant-value>元素指定对应的表达式
<formset>                                                   包含两个子元素<constant>与<form>
<form name="">                                         为表单配置验证规则,可以包含多个<field>子元素
<field property="" depends="">                 配置表单中字段的验证规则
<arg name="" key="" resource="">           <field>元素的子元素,用于替换复合消息中的参数
<msg name="" key="" resource="">          <field>元素的子元素,指定验证规则对应的消息文本
<var><var-name><var-value></var>         <field>元素的子元素,用来向验证规则传递参数

Validator插件
为了在Struts框架中使用Validator,可以采用插件机制把Validator加入到框架中。这需要在Struts配置文件中配置ValidatorPlugIn插件。
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
  <set-property
    property="pathnames"
    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>

Validator框架和ActionForm
Validator框架不能用于验证标准的ActionForm类,如果要使用Validator框架,应该采用ActionForm类的子类。
ValidatorForm
DynaValidatorForm
ValidatorActionForm
DynaValidatorActionForm

举例:
ActionForm
package form;
import org.apache.struts.validator.ValidatorForm;

public class UserForm extends ValidatorForm {
    private String id;
    private String name;
    private String pwd;
    private String birthday;
    private Integer age;
    private String email;   
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    ……
}

Action
package action;

import javax.servlet.http.*;
import org.apache.struts.action.*;
import form.UserForm;

public class UserAction extends Action {
    public ActionForward execute(......) {
        UserForm userForm = (UserForm) form;
        return mapping.findForward("output");
    }
}

JSP
user.jsp
<html:form action="/user">
  id : <html:text property="id"/><html:errors property="id"/><br/>
  name : <html:text property="name"/><html:errors property="name"/><br/>
  pwd : <html:password property="pwd"/><html:errors property="pwd"/><br/>
  birthday : <html:text property="birthday"/>
  <html:errors property="birthday"/><br/>
  age : <html:text property="age"/><html:errors property="age"/><br/>
  email : <html:text property="email"/><html:errors property="email"/><br/>
  <html:submit/><html:reset/>
</html:form>
output.jsp
id : <bean:write name="userForm" property="id"/><br/>
name : <bean:write name="userForm" property="name"/><br/>
pwd : <bean:write name="userForm" property="pwd"/><br/>
birthday : <bean:write name="userForm" property="birthday"/><br/>
age : <bean:write name="userForm" property="age"/><br/>
email : <bean:write name="userForm" property="email"/><br/>

struts-config.xml
<struts-config>
  <form-beans >
    <form-bean name="userForm" type="form.UserForm" />
  </form-beans>
  <action-mappings >
    <action attribute="userForm" input="/user.jsp" name="userForm"
    path="/user" scope="request" type="action.UserAction">
      <forward name="output" path="/output.jsp" />
    </action>
  </action-mappings>
  <message-resources parameter="ApplicationResources" />
  <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-config>

ApplicationResources.properties
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.

validator-rules.xml
<form-validation>
  <global>
    <validator name="required"
    classname="org.apache.struts.validator.FieldChecks"
    method="validateRequired"
    methodParams="java.lang.Object,
        org.apache.commons.validator.ValidatorAction,
        org.apache.commons.validator.Field,
        org.apache.struts.action.ActionMessages,
        org.apache.commons.validator.Validator,
        javax.servlet.http.HttpServletRequest"
    msg="errors.required"/>
    ......
  </global>
</form-validation>

validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!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="userForm">
      <field property="id" depends="required,mask"/>  
      <field property="name" depends="required"/>
      <field property="pwd" depends="required,minlength,maxlength"/>
      <field property="birthday" depends="required,date"/>
      <field property="age" depends="required,intRange"/>
      <field property="email" depends="required,email"/>
    </form>
  </formset>
</form-validation>

<field property="id" depends="required,mask"/>

<!-- 配置表单中字段的验证规则 -->
<field property="id" depends="required,mask">
  <!-- 用于替换复合消息中的参数 -->
  <arg key="id" resource="false" />
  <!-- 指定验证规则对应的消息文本 -->
  <msg name="mask" key="id is error [B001]" resource="false" />
  <!-- 用来向验证规则传递参数 -->
  <var>
    <var-name>mask</var-name>
    <var-value>^[B]{1}[0-9]{3}$</var-value>
  </var>
</field>

<field property="name" depends="required"/>

<field property="name" depends="required">
  <arg key="name" resource="false" />
</field>

<field property="pwd" depends="required,minlength,maxlength"/>

<field property="pwd" depends="required,minlength,maxlength">
  <arg0 key="pwd" resource="false" />
  <arg1 name="minlength" key="${var:minlength}" resource="false" />
  <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
  <var>
    <var-name>minlength</var-name>
    <var-value>4</var-value>
  </var>
  <var>
    <var-name>maxlength</var-name>
    <var-value>10</var-value>
  </var>
</field>

<field property="birthday" depends="required,date"/>

<field property="birthday" depends="required,date">
  <arg key="birthday" resource="false" />
</field>

<field property="age" depends="required,intRange"/>

<field property="age" depends="required,intRange">
  <arg key="age" resource="false" />
  <arg name="intRange" key="age" 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>

<field property="email" depends="required,email"/>

<field property="email" depends="required,email">
  <arg key="email" resource="false" />
</field>

在Validator框架中使用JavaScript
在默认情况下,Validaor框架在Web服务器端执行表单验证,事实上,Validator框架也可以进行浏览器客户端验证。
<html:javascript formName="userForm"/>
<html:form action="/user" onsubmit="return validateUserForm(this);">

你可能感兴趣的:(apache,框架,bean,xml,struts)