2009年5月7日

2009年5月7日星期四

2009年5月7日

                                                        Struts1.1的页面校验


 


Struts作为一个不停发展的开源项目,在页面校验这一块采用了Jakarta的Commons项目的Validate,结合Struts的MVC体系,


用起来确实不错。建议校验这部分在完成jsp后加入。


原理:Struts的页面校验分两种方法,一种是前台生成Javascript,一种是后台class。


      而出错信息对应的也有两种显示方法,一种是弹出消息框,一种是在原页面显示。


      我个人比较喜欢弹出消息框这种,因为可以将焦点置到出错的field中。


      所以我侧重介绍如何实现这种。


      请按下列步骤一步一步进行,进行的时候思考它的做法。


     


1     将Struts所需lib加入到项目lib路径或服务器的lib路径


      Struts1.1需要如下lib:struts-legacy.jar struts.jar jakarta-oro.jar commons-validator.jar


      commons-logging.jar commons-lang.jar commons-fileupload.jar commons-digester.jar commons-collections.jar


      commons-beanutils.jar(可以看到Struts1.1用了很多Commons项目的东东)


2     将下载的Struts1.1的包中的webapps\struts-validator.war 中的validation.xml和validator-rules.xml


      拷到项目的WEB-INF路径


      仔细研究一下这两个文件,可以看到validator-rules.xml是提供一些常用的validation规则。


      目前提供了required,requiredif,minlength,maxlength,mask,byte,short,integer,long,float,


      double,date,range,intRange,floatRange,creditCard,email,


      我看了一下,只有mask不知道具体是干啥的,其他望文生义。(至于如何DIY一条自己的rule,俺还不会)


      重头戏来了,修改validation.xml。可以看一下validation.xml结构


validation.xml:     


<?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>


   <global>


      <constant>


        <constant-name>phone</constant-name>


        <constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$</constant-value>


      </constant>


      <constant>


        <constant-name>zip</constant-name>


        <constant-value>^\d{5}\d*$</constant-value>


      </constant>


   </global>


   <formset>


      <constant>


        <constant-name>zip</constant-name>


        <constant-value>^\d{5}(-\d{4})?$</constant-value>


      </constant>


      <form    name="registrationForm">


         <field    property="firstName"


             depends="required,mask,minlength">


               <arg0 key="registrationForm.firstname.displayname"/>


               <arg1 name="minlength" key="${var:minlength}" resource="false"/>


                     <var>


                       <var-name>mask</var-name>


                       <var-value>^\w+$</var-value>


                     </var>


                     <var>


                       <var-name>minlength</var-name>


                       <var-value>5</var-value>


                     </var>


         </field>


        ..........


      


      相信大家仔细一看就明白了,首先,可以定义一些用正则表达式表示的规则,这些规则还分全局和局部。


      这样就可以DIY一些可以用正则表达式表示的规则了,例如下面就具体用到了自定义的规则:phone。


      ...


   <global>


      <constant>


        <constant-name>phone</constant-name>


        <constant-value>^\(?(\d{3})\)?[-| ]?(\d{3})[-| ]?(\d{4})$</constant-value>


      </constant>


   </global>


   ...  


      <field    property="mobile"


             depends="mask">


               <arg0 key="registrationForm.mobile.displayname"/>


                     <var>


                       <var-name>mask</var-name>


                       <var-value>${phone}</var-value>


                     </var>


      </field>


   ...


      这下也明白mask的作用了,原来它是专门用于自定义规则!


      然后就可以添加需要加validation的field了,格式如下:


      <formset>


      <form name="registrationForm">


         <field    property="firstName"


             depends="required,mask,minlength">


               <arg0 key="registrationForm.firstname.displayname"/>


               <arg1 name="minlength" key="${var:minlength}" resource="false"/>


                     <var>


                       <var-name>mask</var-name>


                       <var-value>^\w+$</var-value>


                     </var>


                     <var>


                       <var-name>minlength</var-name>


                       <var-value>5</var-value>


                     </var>


         </field>


      </form>


      </formset>


     


3     将需要加validation的formbean全部改成 extends ValidatorForm


4     在struts-config.xml文件中加入一段代码<plug-in></plug-in>,位置如下:


......


    <action name="performanceSearchForm" path="/performanceRptAction" scope="request" type="com.hp.elog2.action.report.PerformanceRptAction">


      <forward name="success" path="/FinalRpt.jsp" redirect="false" />


    </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>


5     在ApplicationResources.properties文件中加入如下内容:


# Errors


errors.header=Validation Error


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 an byte.


errors.short={0} must be an short.


errors.integer={0} must be an integer.


errors.long={0} must be an long.


errors.float={0} must be an float.


errors.double={0} must be an double.


errors.date={0} is not a date.


errors.range={0} is not in the range {1} through {2}.


errors.creditcard={0} is not a valid credit card number.


errors.email={0} is an invalid e-mail address.


      


      且注意在修改validation.xml时,如


       <arg0 key="registrationForm.firstname.displayname"/>


      则ApplicationResources.properties中要有对应的 registrationForm.firstname.displayname 值。


      这就可以实现出错信息本地化。


6     修改要加validation的jsp文件。两处:


        1 在页面的form标签中加入onsubmit事件


        <html:form action="registration" onsubmit="return validateRegistrationForm(this);">


        2 在</body>之前加入一段代码,内容如下:


        <html:javascript formName="registrationForm" dynamicJavascript="true" staticJavascript="false"/>


        这段代码会自动生成上面的validateRegistrationForm(this)函数,并且隐藏其他固有验证比如email等的校验,使页面整洁;同时还需添加<script language="Javascript1.1" src="../jsLib/staticJavascript.jsp"></script>


 staticJavascript.jsp的内容是:<%@ page contentType="application/x-javascript" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<html:javascript dynamicJavascript="false" staticJavascript="true"/>     


     一步一步下来,终于明白它的思路了,就是根据配置自动生成javascript代码来校验。


0 评论:

发表评论