隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

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

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:Struts1.x系列教程(9):上傳任意多個文件

          Struts2教程4:使用validate方法驗證數據

          Struts2教程5:使用Validation框架驗證數據

          一、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框架可以完成更復雜的驗證工作。

          二、配置和使用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文件中),中間用逗號(,)隔開,如下面的代碼所示:

          <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方法了。

          【第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文件,代碼如下:

            <%@ 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的代碼如下:

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

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




          下一篇:
          Struts1.x系列教程(11):Validator驗證框架高級應用





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-02-12 16:55 銀河使者 閱讀(7793) 評論(7)  編輯  收藏 所屬分類: javaweb 原創struts1.x

          評論

          # re: Struts1.x系列教程(10):Validator驗證框架入門[未登錄]  回復  更多評論   

          什么年代了還struts1.....
          2009-02-12 17:05 | xxx

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          啊,我很久以前寫的東西,一直沒發,現在發上了。現在仍然有很多人在使用struts1.x。
          2009-02-12 17:08 | 銀河使者

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          老大,給你來捧場了
          2009-02-13 19:44 | 阿蜜果

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          nothing is obsolete , if it can work , use it .
          2009-02-13 22:22 | Hadis

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          沒看到如何指定到 這個 ErrorDescription.properties文件
          新手菜鳥 望賜教
          2012-03-13 15:26 | 許齊

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          akkkkkkkkkkkkkkkkkk
          2013-01-23 21:45 | ashen

          # re: Struts1.x系列教程(10):Validator驗證框架入門  回復  更多評論   

          大師,又來看你的博客了,struts 1.x 的系列教程怎么不全啊?好想詳細了解一下
          2014-07-25 11:48 | 微笑的江豚
          主站蜘蛛池模板: 长宁县| 肇东市| 深水埗区| 秭归县| 自治县| 福建省| 嘉黎县| 佛教| 珠海市| 东光县| 盖州市| 新密市| 忻城县| 达州市| 望城县| 西畴县| 赤壁市| 崇明县| 阿克苏市| 云龙县| 随州市| 辉南县| 班玛县| 新野县| 乌拉特后旗| 安远县| 日喀则市| 乐至县| 清徐县| 上犹县| 祥云县| 永和县| 兰考县| 巴塘县| 布尔津县| 玛沁县| 特克斯县| 社会| 隆化县| 中阳县| 大城县|