Struts1.x系列教程(10):Validator驗證框架入門

一、Validator框架的優勢



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

Validator框架可以在XML文件中配置驗證規則和驗證對象。因此,使用Validator框架可以無需在ActionForm的子類中覆蓋validate方法就可以很方便地驗證客戶端的提交數據。由於Validator框架內置了很多預定義的驗證機制,如驗證某個屬性是否存在,驗證EMail是否合法等。所以在一般情況下,只需要配置XML文件就可以滿足我們的驗證需求。

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

1.  更容易維護。 由於驗證信息可以被放置在同一個配置文件中,因此,我們可以更容易地來維護這些驗證信息。

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

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

4.  減少重複代碼的數量。由於Validator框架提供了很多預定義的驗證,因此,我們可以避免自己寫很多重複的代碼進行驗證。當然,我們也可以將大量使用的驗證封裝在類的方法中,這些雖然可以避免大量的重複勞動,但這就意味着我們團隊的新成員要使用這些被封裝的驗證方法之前必須先學習它們。而最糟糕的情況是很多開發人員可能會忘記使用這些由其他成員實現的驗證庫,而自己重新編寫具有同樣功能的驗證庫。當然,這一切如果使用Validator框架就都可以得到解決。

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

二、配置和使用Validator框架

 

1.  安裝Validator框架

    由於ValidatorStruts的一個插件,因此,就需要在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文件。

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

2validator.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文件

    配置FirstValidatorFormValidatorAction的代碼如下所示
<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



   
在輸入一些錯誤信息後,點擊“提交”按鈕,將出現類似下圖的效果。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章