Struts1.x 中的 Validate 框架

轉載於http://www.blogjava.net/nokiaguy/archive/2009/02/12/254421.htmljavascript

1、Validator框架的優點

       Validator框架是一個Struts插件,最初由David Winterfeldt設計並實現。Validator框架從Struts 0.5時代就可使用,但那時Validator框架只是被捐助的一個jar包。Apache組織爲了使開發人員更方便地使用Validator框架,決定從Struts1.1開始,將Validator框架做爲Struts的一部分同Struts一塊兒發佈。html

Validator框架能夠在XML文件中配置驗證規則和驗證對象。所以,使用Validator框架能夠無需在ActionForm的子類中覆蓋validate方法就能夠很方便地驗證客戶端的提交數據。因爲Validator框架內置了不少預約義的驗證機制,如驗證某個屬性是否存在,驗證EMail是否合法等。因此在通常狀況下,只須要配置XML文件就能夠知足咱們的驗證需求。java

在使用Validator框架時,就會發現這種方式要比直接使用validate方法進行驗證會給咱們帶來以下的好處:正則表達式

1.  更容易維護。 因爲驗證信息能夠被放置在同一個配置文件中,所以,咱們能夠更容易地來維護這些驗證信息。apache

2.  標準化。因爲不少簡單的驗證都是相同的。如用戶名和密碼都要求由字母、數字以及下劃下組成。若是將這些驗證都寫在validate方法中,對這些驗證進行標準化很是困難。而在Validator框架中的這些驗證機制都是預先定義的,所以,標準化相同的驗證對於Validator框架來講將是一件很是輕鬆的事。app

3.  避免重造輪子。雖然一些驗證很簡單,但若是想正確實現它們也是很是困難的。一個典型的例子是驗證EMail地址的格式。若是這個驗證要想天衣無縫,就必須按着RFC-2822規範的要求來驗證EMail地址。而若是咱們使用Validator框架,就無需再重造輪子來驗證EMail地址了。框架

4.  減小重複代碼的數量。因爲Validator框 架提供了不少預約義的驗證,所以,咱們能夠避免本身寫不少重複的代碼進行驗證。固然,咱們也能夠將大量使用的驗證封裝在類的方法中,這些雖然能夠避免大量 的重複勞動,但這就意味着咱們團隊的新成員要使用這些被封裝的驗證方法以前必須先學習它們。而最糟糕的狀況是不少開發人員可能會忘記使用這些由其餘成員實 現的驗證庫,而本身從新編寫具備一樣功能的驗證庫。固然,這一切若是使用Validator框架就均可以獲得解決。jsp

    5.  客戶端和服務端驗證自動切換。咱們只須要簡單地在JSP頁面中放一個單獨的<html::JavaScript/>元素就能夠將服務端的驗證轉換爲客戶端驗證(基於JavaScript的驗證)
    雖然Validator框架的預約義驗證已經能夠知足大多數的驗證需求了,但在某些特殊狀況下,這些預約義驗證就沒法知足咱們的需求了,爲此,Validator框架也爲開發人員提供了擴展驗證機制的功能。這也使得Validator框架能夠完成更復雜的驗證工做。
<!--[endif]-->學習

2、配置和使用Validator框架測試

 1.  安裝Validator框架

    因爲Validator是Struts的一個插件,所以,就須要在struts-config.xml文件中按着Struts插件的方式來安裝Validator框架。打開struts-config.xml文件,在<struts-config>元素中加入一個<plug-in>子元素,以下面的代碼所示:

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator.xml" />
</plug-in>     

其中<set-property>元素設置了插件中使用的pathnames屬性的值。在pathnames屬性值中包含了兩個xml文件。

(1)validator-rules.xml:在這個文件中聲明瞭Validator框架的預約義驗證。這個文件能夠在Struts的發行包的lib目錄中能夠找到這個文件。在使用MyEclipse爲Web工程添加Struts功能後,會自動將這個文件加到WEB-INF目錄中。

(2)validator.xml:這個文件定義了要驗證的對象。實際上,在這個文件中,包含了一個或多個ActionForm的子類及其要驗證的屬性和驗證規則。所以,這個文件就至關於validate方法。在Validator框架中,能夠有多個定義驗證對象的xml文件(能夠將不一樣的ActionForm的子類分散到不一樣的xml文件中),中間用逗號(,)隔開,以下面的代碼所示:
<!--[endif]-->

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml, /WEB-INF/validator1.xml,
                                             /WEB-INF/validator2.xml, /WEB-INF/validator3.xml" />
</plug-in>     

2.  使用Validator框架的一個例子

    在本節將舉一個例子來演示如何使用Validator框架來驗證數據。咱們須要按着以下的六步來完成這個例子:

【第1步】創建FirstValidatorForm類(ValidatorForm的子類)

在<samples工程目錄>/src/actionform目錄中創建一個FirstValidatorForm.Java文件,代碼以下:

 
 package actionform;
  import org.apache.struts.validator.ValidatorForm;
  public class FirstValidatorForm extends ValidatorForm  // 必須從ValidatorForm繼承
  {
      private String name;
      private String age;
      private String email;
      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;
      }
      public String getAge()
      {
          return age;
      }
      public void setAge(String age)
      {
          this.age = age;
      }
  }

 

    要注意的是,要想使用Validator框架驗證數據,Form類就必須從ValidatorForm繼承,而不能從ActionForm繼承。這是由於ValidatorForm類是從ActionForm繼承的,在ValidatorForm類中已經覆蓋了validate方法來自動進行驗證工做,所以,咱們在ValidatorForm的子類中就不用寫validate方法了。
<!--[endif]-->

【第2步】創建ValidatorAction類(Action的子類)
    在<samples工程目錄>/src/action目錄中創建一個ValidatorAction.java文件,代碼以下:

 
package action;
  import javax.servlet.http.*;
  import org.apache.struts.action.*;
  public class ValidatorAction extends Action
  {
      public ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
      {
          response.setCharacterEncoding("GBK");
          try
          {
              response.getWriter().println("驗證成功!");
          }
          catch (Exception e)
          {
          }
          return null;
      }
  }

 

        ValidatorAction類是一個空的Struts動做類(除了輸出一行「驗證成功!」字符串)。這個動做是爲了正常運行含有Struts元素的JSP程序所編寫的。在之後的代碼中會常用到這個Struts動做類。

【第3步】配置struts-config.xml文件

    配置FirstValidatorForm和ValidatorAction的代碼以下所示

<form-bean name="firstValidatorForm" type=" actionform.FirstValidatorForm" />
<action name="firstValidatorForm" path="/firstValidator" scope="request" type=" action.ValidatorAction"  input="/firstValidator.jsp"/>    

其中firstValidator.jsp是用戶錄入信息的界面,也是顯示錯誤信息的界面。

【第4步】創建firstValidator.jsp
    在Web根目錄創建一個firstValidator.jsp文件,代碼以下:
<!--[endif]-->

 
<%@ page pageEncoding="GBK"%>
  <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
  <html>
    <head>
      <title>第一個Validator程序</title>
    </head>
    <body>
      <html:form action="firstValidator" >
         姓  名:
<html:text property="name" />&nbsp;&nbsp;<font color="red"><html:errors property="name"/></font><p>
         年  齡:
<html:text property="age"/>&nbsp;&nbsp;<font color="red"><html:errors property="age"/></font><p>
       EMail:
<html:text property="email"/>&nbsp;&nbsp;<font color="red"><html:errors property="email"/></font><p>
              <html:submit value="提交"/>
      </html:form>  
    </body>
  </html>

 

    從firstValidator.jsp中能夠看出,不論是否使用Validator框架進和驗證,對於JSP代碼來講是徹底同樣的。仍然是使用<html:errors>元素來顯示錯誤信息。但要注意,在使用Validator框架時,<html:errors>標籤的property屬性的值就是所對應ValidatorForm的子類的屬性名。

【第5步】配置validator.xml文件
    在本例中只使用了一個XML文件(validator.xml)來配置要驗證的對象。validator.xml的代碼以下:

 

<!--[endif]-->
  <?xml version="1.0" encoding="GBK" ?>
  <!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="firstValidatorForm">
              <field property="name" depends="required,maxlength,minlength,mask">
                  <msg name="required" key="error.name.blank" />
                  <msg name="minlength" key="error.name.minLength" />
                  <msg name="maxlength" key="error.name.maxLength" />
                  <msg name="mask" key="error.name.alphanum" />
  
                  <arg name="minlength" key="${var:minlength}" position="0" resource="false" />
                  <arg name="maxlength" key="${var:maxlength}" position="0" resource="false" />
                  <var>
                      <var-name>minlength</var-name>
                      <var-value>5</var-value>
                  </var>
                  <var>
                      <var-name>maxlength</var-name>
                      <var-value>10</var-value>
                  </var>
                  <var>
                      <var-name>mask</var-name>
                      <var-value>^[a-zA-Z0-9]*$</var-value>
                  </var>
              </field>
              <field property="age" depends="required,integer,intRange">
                  <msg name="required" key="error.age.blank" />
                  <msg name="integer" key="error.age.integer" />
                  <msg name="intRange" key="error.age.intRange" />
  
                  <arg name="intRange" key="${var:min}" position="0" resource="false" />
                  <arg name="intRange" key="${var:max}" position="1" resource="false" />
                  <var>
                      <var-name>min</var-name>
                      <var-value>18</var-value>
                  </var>
                  <var>
                      <var-name>max</var-name>
                      <var-value>60</var-value>
                  </var>  
              </field>
              <field property="email" depends="required,email">
                  <msg name="required" key="error.email.blank" />
                  <msg name="email" key="error.email.invalid" />
              </field>
          </form>
      </formset>
  </form-validation>

 

        validator.xml文件中的全部配置都放到<form-validation>元素中。在<form-validation>元素中有一個<formset>子元素,這個元素能夠定義多個<Form>元素,這個元素用來定義要驗證的ValidatorForm類的子類。其中name屬性值就是<form-bean>元素中的name屬性值。

<field>元素用來定義某個屬性的約束條件,如第一個<field>元素定義了name屬性必須存在(required)、必需要知足最小長度(minlength)和最大長度(maxlength)以及還要經過mask所指的正則表達式的驗證。

<msg>元素用來定義出錯信息在屬性文件中的Key(全部的出錯信息都在屬性文件中)。<arg>元素用來向出錯信息中的參數傳遞參數值。<var>元素用來定義變量名和變量值。

【第6步】在ErrorDescription.properties文件中添加錯誤信息

    打開ErrorDescription.properties文件,在文件的後面添加以下的內容:

 
 error.name.blank = 姓名不能爲空
  error.name.minLength = 姓名的長度不能小於{0}
  error.name.maxLength = 姓名的長度不能大於{0}
  error.name.alphanum = 姓名必須由字母和數字組成
  error.age.blank = 年齡不能爲空
  error.age.integer = 年齡必須爲數字
  error.age.intRange = 年齡必須在{0}和{1}之間

 

  啓動Tomcat,在IE中輸入以下的URL來測試程序:

    http://localhost:8080/samples/%20firstValidator.jsp

相關文章
相關標籤/搜索