`
反求诸己
  • 浏览: 534956 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

struts1 validator验证框架

阅读更多
struts1 validator验证框架

MyEclipse

本文以一登录页面(Login.jsp)为例,讲叙我在JBuilder 2005中如果使用Validator框架来对输入的数据进行验证。
   在用户进行主页面前需要进行身份验证,此页面的验证规则为用户名和密码均不能为空,且密码的长度必须大于等于6个字符。

为了达到以上所说的目的,在Struts中有两种办法:
        1.使用ActionForm Bean中的Validate()函数实现,将需要验证的逻辑写入该函数,即在提交表单时会对其进行验证,这中方法的缺点在于必须通过程序代码来实现验证逻辑,如果验证逻辑发生改变,则必重新编写和编译程序代码,此外如果程序中多个ActionFrom Bean共用相同的验证逻辑,则必须重复编程,降低代码的重用性。
        2.使用Validator验证框架实现,它能够克服以上所说的局限,此外它的配置灵活,无需编程。

  Validator框架采用两个基于XML的配置文件来配置验证规则,这两个文件为validator-rules.xml和validation.xml,在Struts应用中,这两个文件必须存放在WEB-INF目录下。

  下面从页面开始讲述如果创建此登录验证页面。
Login.jsp页面的关键代码如下:
        <tr>
          <td width="70" class="TableText">用户名:</td>
          <td>
            <html:text property="userName" style="TextBoxLong">    </html:text>
           <html:errors property="userName" />
          </td>
        </tr>
        <tr>
          <td class="TableText">密 码:</td>
          <td>
            <html:password property="password" style="TextBoxLong">   </html:password>
           <html:errors property="password"/>
          </td>
         </tr>
  说明:
        1.用户名文本框的属性名称为userName,对应其ActionFrom中的userName,接下来为显示错误的Struts标签,其属性名称与文本框同名,意为只显示文本框的错误信息,如果没有property,则显示所有错误信息,此标签的作用是一但用户名文本框有错误则通过其进行显示。
        2.密码框与用户名文本框基本类似,在此不再叙述。

Login页面创建完成后,即需要创建ActionFrom Bean,名称为LoginActionForm
        import javax.servlet.http.*;
        import org.apache.struts.action.*;
        import org.apache.struts.validator.*;

        public class LoginActionForm extends ValidatorForm {
            private String password;
            private String userName;
            private Integer id;
            public String getPassword() {
                return password;
            }

            public void setPassword(String password) {
                this.password = password;
            }

            public void setUserName(String userName) {
                this.userName = userName;
            }

           public void setId(Integer id) {
                this.id = id;
            }

            public String getUserName() {
                return userName;
            }

            public Integer getId() {
                return id;
            }

           public void reset(ActionMapping actionMapping,
                              HttpServletRequest servletRequest) {
                password = null;
                userName = null;
            }
        }
  说明:
        1.此处的LoginActionForm必须继承自ValidatorForm,而不是ActionForm,原因在于ActionForm不能使用Validator框架完成验证。
        2.此LoginActionForm中必须包含有Login.jsp页面中<html:text/>和<html:password/>标签propety属性所指定的属性字段名,即userName和password.
        3.除以上所说外,该LoginActionForm就是一个JavaBean类。

定义Action--LoginAction
  此Action与普通的Action并无任何区别,均是完成相应的后台逻辑功能,此页面则是读取数据库中的数据与输入的相比较,匹配则转向主页面,否则转向错误页面,具体实现在此就不叙述了。


创建validator-rules.xml文件,制定验证规则
        <!DOCTYPE form-validation PUBLIC
                  "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
                  "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd ">

        <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,
                       javax.servlet.http.HttpServletRequest"
                   msg="errors.required">
              </validator>
         
              <validator name="minlength"
                  classname="org.apache.struts.validator.FieldChecks"
                  method="validateMinLength"
                  methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.minlength">
                 depends="required"
            </validator>
           </global>
        </form-validation>
  说明:
        1.每个<validator>元素定义了一个惟一的验证规则,此处一共定义了两个验证规则:名为required的规则和名为minlength的规则。
        2.<validator>元素的name属性指定验证规则的逻辑名,此名字必须惟一;classname和method属性分别指定实现验证规则逻辑的类和方法;methodParams属性用来指定验证方法包含的参数,多个参数之间用逗号隔开;msg属性指定来自于Resource Bundle中的消息key,此程序的Resource Bundle为ApplicationResources.properties文件,当验证失败时,Validator框架将根据这个消息key到Resource Bundle中查找匹配的消息文本,默认情况下,Validator框架有一组定义的消息文本,参见下文“定义Resource Bundle消息文件”,此处的消息也可以自定义,而不使用其默认消息。
        3.除上述的属性外,<validator>还有一个depends属性,用于指定在调用当前验证规则之前必须先调用的其他验证规则,例如上面代码中在调用minlength验证前需先调用required验证规则。如果depends包含多个验证,使用逗号分隔,如depends="required, maxlength",需注意的是如果调用depends规则时验证失败,则不会调用下一个验证规则。
        4.下面给出FieldChecks类包含的验证方法,即method后可以写的方法(上面代码中蓝色显示),此外,可以自定义方法。
                validateByte、validateCreditCard、validateDate、validateDouble、validateEmail、validateFloat、validateInteger、validateLong、validateMask、validateMinLength、validateMaxLength、validateRange、validateRquired、validateShort。

创建validation.xml文件,此文件可以为应用中的ActionForm配置所需的验证规则,取代在ActionForm类中以编程的方式来实现验证逻辑。
        <?xml version="1.0" encoding="ISO-8859-1" ?>
        <!DOCTYPE form-validation PUBLIC
          "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"
          "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd ">
        <form-validation>
          <formset language="zh_CN">
            <form name="LoginActionForm">
              <field property="userName" depends="required">
                <arg0 name="required" key="User.name" resource="true"/> ==> <msg name="required" key="user.required" resource="true"/>
              </field>
              <field property="password" depends="required,minlength">
                <arg0 key="password.name" />
                <arg1 name="minlength" key="${var:minlength}"/>
                <var>
                  <var-name>minlength</var-name>
                  <var-value>6</var-value>
                </var>
              </field>
            </form>
          </formset>
        </form-validation>
  说明:
        1.<form>元素用于为表单配置验证规则,它的name属性为需要验证的ActionForm的名称,它需要与struts-config.xml中的名称一致,如此处为LoginActionForm.
        2.<field>元素用于为表单字段配置验证规则,它的property属性名称需要与Login.jsp页面中的用户名文本框和密码框的property属性名一致。
        3.<depends>元素为该字段所采用的验证规则有哪些,如果有多个,则使用逗号分隔。
        4.参看以上<msg>一行,<msg>元素指定验证规则对应的消息文本,该消息文本将替代在validator-rules.xml文件中为验证规则配置的默认消息文本。意思即是说,如果上面使用的是<msg name="required" key="user.required" resource="true"/>,而非<arg0 name="required" key="User.name" resource="true"/>,则如果验证失败,验证规则将使用msg中key指定的消息,而非默认的errors.required消息(validator-rules.xml中定义,参看上文)。
        5.<field>字段可以包含四个附加的子元素,<arg0>、<arg1>、<arg2>、<arg3>,用于替换复合消息中的参数,<arg0>指定第一个替换值,<arg1>指定第二个,依此类推。每个arg元素包含三个属性:name,key和resource,用法与<msg>相似。如上代码中<arg0 name="required" key="User.name" resource="true"/>意为使用从消息文件ApplicationResources.properties中消息key User.name取出的文本(Username)来替换默许消息文本errors.required中的参数,使之组合成一句有意思的文本,errors.required的原文本为:{0}is requuired.

向struts-config.xml中添加validate属性,使相应字段开启验证过程,并配置validator-rules.xml和validation.xml,使之起作用。
        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd ">
        <struts-config>
          <form-beans>
            <form-bean name="LoginActionForm" type="personal.system.Login.struts.actionform.LoginActionForm" />
          </form-beans>
          <action-mappings>
            <action input="/JSP/Login.jsp" name="LoginActionForm" path="/LoginAction" scope="request" type="personal.system.Login.struts.action.LoginAction" validate="true">
              <forward name="succeed" path="/JSP/index.jsp" />
              <forward name="failed" path="/JSP/Failed.jsp" />
            </action>
          </action-mappings>
          <message-resources parameter="ApplicationResources" />             ==>指定消息资料文件(Resource Bundle)的文件名,此处全名文件名即为ApplicationResources.properties
          <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>

定义Resource Bundle消息文件--ApplicationResources.properties
           password.name=Password              ==>定义参数值,password字段使用:<arg0 key="password.name" />
           User.name=Username                 ==>定义参数值,username字段使用:<arg0 name="required" key="User.name" resource="true"/>
   
           ##以下均为Validator框架的默认消息文本,其中的{0},{1},{2}...代表传入参数的取代位置。
           errors.required=<font color="red">{0} is required.</font>
           errors.minlength=<font color="red">{0} can not be less than {1} characters.</font>
           errors.maxlength=<font color="red">{0} can not be greater than {1} characters.</font>
           errors.invalid=<font color="red">{0} is invalid.</font>

           errors.byte=<font color="red">{0} must be a byte.</font>
           errors.short=<font color="red">{0} must be a short.</font>
           errors.integer=<font color="red">{0} must be an integer.</font>
           errors.long=<font color="red">{0} must be a long.</font>
           errors.float=<font color="red">{0} must be a float.</font>
           errors.double=<font color="red">{0} must be a double.</font>

           errors.date=<font color="red">{0} is not a date.</font>
           errors.range=<font color="red">{0} is not in the range {1} through {2}.</font>
           errors.creditcard=<font color="red">{0} is an invalid credit card number.</font>
           errors.email=<font color="red">{0} is an invalid e-mail address.</font>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics