<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sung in Blog

               一些技術文章 & 一些生活雜碎

    用Validator(驗證器)提供的豐富的內置驗證方法簡化Struts的開發過程。

    Struts框架的一個主要好處是它提供了對接收到的表單數據進行驗證的內置界面。如果有任何驗證失敗,則應用程序都會重新顯示HTML表單,這樣就可以改正無效的數據了。如果驗證成功,則處理過程會繼續進行。Struts框架的簡單驗證界面會減少與處理數據驗證有關的令人頭疼的事情,這樣你就可以把精力集中到驗證代碼上,而不是放到捕獲數據、重新顯示不完整或無效數據的技巧上。

    但是,Struts內置的驗證界面也有缺點。例如,在整個應用程序中驗證代碼常常會大量重復,因為許多域需要相同的驗證邏輯。對一些相似字段的驗證邏輯進行任何修改都要求在幾個地方修改代碼,還要重新編譯受影響的代碼。為了解決這個問題并增強Struts驗證界面的功能,作為Struts的第三方附加件創建了Validator框架。后來,Validator被集成到核心Struts代碼庫中,并從Struts中分離出來,現在它是一個獨立的Jakarta Commons項目。雖然Validator是一個獨立的框架,但它仍能與其他程序封裝在一起后提供,并與Struts無縫集成。

    Validator概述

    沒有Validator,你就不得不編寫驗證表單數據所需的全部代碼,并把它放入Form Bean對象的validate( )方法中。對于想在其上進行數據驗證的每個Form Bean域來說,都需要編寫邏輯代碼來實現驗證。此外,你還必須編寫代碼來存儲驗證失敗時的出錯消息。

    有了Validator,你就不必在Form Bean中編寫用于驗證或存儲錯誤消息的任何代碼。相反,Form Bean提供了Validator的一個ActionForm子類,它提供驗證或存儲錯誤消息的功能。

    可把Validator框架作為一個可用于Form Bean驗證的可插入的驗證例行程序系統來進行安裝。每個驗證例行程序都只是一個Java方法,負責執行特定類型的驗證任務,驗證可能通過,也可能失敗。 默認情況下,Validator與幾個有用的驗證例行程序封裝在一起來提供,這些例行程序能滿足大多數情況下的驗證要求。但是,如果Validator框架沒有提供你需要的驗證例行程序,那么你可以自己創建定制的驗證例行程序,并將它插入到該框架中。此外,Validator還支持服務器端和客戶端(JavaScript)的驗證,而Form Bean只提供服務器端驗證界面。

    Validator使用兩個XML配置文件來分別確定安裝哪個驗證例行程序和如何將它們應用于給定的應用程序。第一個配置文件validator-rules.xml說明應該被插入到框架中的驗證例行程序,并提供每個驗證的邏輯的名稱。validator-rules.xml文件還定義了每個驗證例行程序的客戶端JavaScript代碼。可以配置Validator讓它把這個JavaScript代碼發送到瀏覽器上,這樣驗證就可以在客戶端和服務器端進行了。

    第二個配置文件validation.xml確定哪個驗證例行程序應用到哪個Form Bean。文件中的定義使用struts-config.xml文件給出的Form Bean的邏輯名稱以及validator-rules.xml文件給出的驗證例行程序的邏輯名稱,以便把二者關聯起來。

    使用Validator框架包括啟用Validator插件、配置Validator的兩個配置文件,以及創建提供Validator的ActionForm子類的Form Beans。下面詳細解釋如何配置和使用Validator。

    啟用Validator插件

    雖然Validator框架是與Struts封裝在一起提供的,但在默認狀況下Validator并不被啟用。為了啟用Validator,要向你的應用程序的struts-config.xml文件中添加下面的插件定義。

    <!-- Validator Configuration -->
    <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為你的應用程序加載并初始化Validator插件。在初始化時,該插件裝入由路徑名屬性指定的、用逗號分隔的Validator配置文件清單。每個配置文件的路徑應該用與Web應用程序的相關的路徑來指定,如前面的例子所示。

    請注意,你的應用程序的struts-config.xml文件必須與Struts Configuration Document Type Definition(Struts配置文檔類型定義,DTD)一致,后者規定文件中元素出現的順序。所以,你必須把Validator插件定義放到該文件的適當位置。確保文件中元素適當排列的最簡便方法就是使用諸如Struts Console的工具,它自動格式化你的配置文件,以便與DTD保持一致。

    配置validator-rules.xml

    Validator框架可以設置為可插入系統,其驗證例行程序僅僅是插入到該系統中執行具體驗證的Java方法。validator-rules.xml文件說明性地插入Validator用于執行驗證的驗證例行程序中。Struts示例應用程序帶有這個文件的預配置拷貝。在大多數情況下,你不必修改這個預配置拷貝,除非你要向該框架中添加自己定制的驗證。

    清單1 是一個示例validator-rules.xml文件,說明如何將驗證例行程序插入到Validator中。validator-rules.xml文件中的每個驗證例行程序都有自己的定義,它用validator標記聲明,利用name屬性為該驗證例行程序指定邏輯名,并指定該例行程序的類和方法。該例行程序的邏輯名稱供該文件中的其他例行程序以及validation.xml文件中的驗證定義用于引用該例行程序。

    請注意,validator標記放在javascript的標記中,javascript標記用于定義客戶端JavaScript代碼,以便在客戶端執行與服務器端相同的驗證。

    提供的驗證程序

    默認情況下,Validator中包括幾個基本驗證例行程序,你可以用它們來處理大多數驗證問題。這些例行程序具有邏輯名稱,如required(用于輸入要求的值)、CreditCard(用于輸入信用卡號碼值)、email(用于輸入電子郵件地址值),等等。

    創建Form Bean

    為了使用Validator,你的應用程序的Form Bean必須歸到Validator的ActionForm的某一子類,而不是ActionForm本身。Validator的ActionForm子類提供了ActionForm的validate( )方法(它嵌入到Validator框架中)的實施過程。你不必從頭編寫驗證代碼并把它投入validate( )方法中,相反,可以完全忽略該方法,因為Validator為你提供了驗證代碼。

    與Struts提供的核心功能相類似,Validator提供給你兩種可供選擇的方法來創建Form Bean。 你可以選擇的第一種方法就是像下面這樣創建一個特定的Form Bean對象:

    package com.jamesholmes.minihr;
    
    import org.apache.struts.validator
    .ValidatorForm;
    
    
    public class LogonForm extends ValidatorForm {
      private String username;
      private String password;
      
      public String getUsername() {
        return username;
      }
      
      public void setUsername(String 
    username) {
        this.username = username;
      }
    
    
      public String getPassword() {
        return password;
      }
    public void setPassword(String 
    password) {
        this.password = password;
      }
    }
    

    這個類與你不是用Validator所創建的類相似,但它提供ValidatorForm而不是ActionForm。這個類也不提供ActionForm的空reset( )和validate( )方法的實施過程,因為ValidatorForm提供了相應過程。

    在struts-config.xml文件中配置這個特定Form Bean的方法與配置正則Form Bean的方法相同:

    <form-beans>
      <form-bean name="logonForm"
                type="com.jamesholmes
      .minihr.LogonForm"/>
    </form-beans>
    

    用表單標記的name屬性給特定Form Bean指定的邏輯名是在定義validation.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>
      <formset>
        <form name="logonForm">
          <field property="username" 
                depends="required">
            <arg0 key="prompt.username"/>
          </field>
        </form>
      </formset>
    </form-validation>
    

    Validator使用該表單標記的name屬性的值將驗證定義與要應用這些定義的Form Bean的名稱相匹配。

    創建Form Bean時可以選擇的第二種方法是在struts-config.xml文件中定義一個動態Form Bean,如下所示:

    <form-beans>
      <form-bean name="logonForm"
                type="org.apache
    .struts.validator.DynaValidatorForm">
        <form-property name="username"
                type="java.lang.String"/>
        <form-property name="password"
                type="java.lang.String"/>
      </form-bean>
    </form-beans>
    

    動態Form Bean不要求創建特定的Form Bean對象;相反,要定義Form Bean應該具有的屬性和類型,而Struts為你動態創建Form Bean。 Validator允許你使用這個概念,就像在核心Struts中使用這個概念一樣。與使用Validator的惟一區別就是要指定Form Bean是org.apache.struts.validator.DynaValidatorForm類型,而不是org.apache.struts.action.DynaActionForm類型。

    分配給動態Form Bean的邏輯名是在定義validation.xml文件中的驗證時使用的名稱。Validator使用與之相匹配的名稱將這些驗證與Form Bean聯系在一起。

    除了創建Form Bean的這兩種標準方法之外,Validator還提供了一個高級特性,用于將多個驗證定義與一個Form Bean定義聯系起來。當你使用基于validatorForm或基于DynaValidatorForm的Form Bean時,Validator使用struts-config.xml文件中的Form Bean的邏輯名稱,將Form Bean映射到validation.xml文件中的驗證定義。這種機制在大多數情況下非常有用,但在某些時候,Form Bean要在多個操作中共享。 一個操作可能使用Form Bean的所有域(fields),而另一個操作可能只使用這些域的一個子集。因為驗證定義被連接到Form Bean,所以只使用域的一個子集的操作就無法繞過對未使用域的驗證。當驗證Form Bean時,就會對未使用的域生成錯誤消息,因為Validator無從知道不去驗證未使用的域,它只是簡單地把它們看作缺失或無效。

    為了解決這個問題,Validator提供了兩個附加的ActionForm子類,它使你能夠將驗證與操作相關聯,而不是與Form Bean相關聯。這樣你就可以根據哪個操作正在使用Form Bean來指定把哪些驗證用于該Form Bean了。對于特定的Form Bean,你要像下面這樣聲明org.apache.struts.validator.ValidatorActionForm子類:

    public class AddressForm extends ValidatorActionForm {
      ...
    }
    

    對于動態Form Bean,在struts-config.xml文件中為Form Bean定義指定org.apache.struts.validator.DynaValidatorActionForm的類型,如下所示:

    <form-bean name="addressForm"
              type="org.apache.struts
    .validator.DynaValidatorActionForm">
      ...
    </form-bean>
    

    在validation.xml文件中,把一組驗證映射到一個操作路徑,而不是映射到Form Bean名,因為如果你定義了Create Address和Edit Address兩個操作(它們使用同一個Form Bean),那么每個操作都會有一個惟一的操作名,如下所示:

    <action-mappings>
      <action path="/createAddress"
             type="com.jamesholmes
      .minihr.CreateAddressAction"
             name="addressForm"/>
      <action path="/editAddress"
             type="com.jamesholmes
      .minihr.EditAddressAction"
             name="addressForm"/>
    
    </action-mappings>
    

    下面的validation.xml文件片斷顯示了兩組驗證,它們用于同一個Form Bean,但卻有不同的操作路徑:

    <formset>
      <form name="/createAddress">
        <field property="city"
              depends="required">
          <arg0 key="prompt.city"/>
        </field>
      </form>
      <form name="/editAddress">
        <field property="state"
              depends="required">
          <arg0 key="prompt.state"/>
        </field>
      </form>
    </formset>
    

    因為Form Bean要么屬于ValidatorActionForm子類,要么屬于DynaValidatorActionForm子類,所以Validator知道用一個操作路徑代替Form Bean的邏輯名稱來找出用于Form Bean的驗證。

    配置validation.xml文件

    validation.xml文件用于聲明將應用到Form Beans的一組驗證。要驗證的每個Form Bean在這個文件中都有自己的定義。在這個定義中,指定要應用到該Form Bean的各域的驗證。下面是一個validation.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>
      <formset>
        <form name="logonForm">
          <field property="username"
                depends="required">
            <arg0 key="prompt.username"/>
    
          </field>
          <field property="password"
                depends="required">
            <arg0 key="prompt.password"/>
          </field>
        </form>
      </formset>
    </form-validation>
    

    validation.xml文件的第一個元素是form-validation。這個元素是該文件的主元素,而且只定義一次。在form-validation元素內定義form-set元素,它包括多個表單元素。一般來說,在文件中只定義一個form-set元素,但是如果要將驗證國際化,那就要在每個地方單獨使用一個form-set元素。

    每個表單元素使用name屬性將名稱與其所包含的域驗證集關聯起來。Validator使用這個邏輯名稱將這些驗證映射到在struts-config.xml文件中定義的一個Form Bean。根據要驗證的Form Bean的類型,Validator力求將該名稱與Form Bean的邏輯名稱或操作路徑相匹配。在表單元素內,field元素定義要應用到Form Bean的特定域的驗證。field元素的property屬性對應于特定Form Bean中的域名。depends屬性利用validator-rules.xml文件指定驗證例行程序的邏輯名稱,這些例行程序將應用到域驗證中。

    配置ApplicationResources.properties

    Validator使用Struts的資源綁定(Resource Bundle)機制將錯誤消息具體化。不用在框架中對錯誤消息進行硬編碼,Validator使你能在ApplicationResources.properties文件中為一個消息指定一個鍵值,如果驗證失敗則將返回該鍵值。validator-rules.xml文件中的每個驗證例行程序都用validator標記的msg屬性指定錯誤消息的鍵值,如下所示:

    <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.ActionErrors, javax.servlet
    .http.HttpServletRequest"
              msg="errors.required">
    

    如果在驗證例行程序運行時驗證失敗,則返回與msg屬性指定的鍵值對應的消息。

    下面的片段顯示來自ApplicationResources.properties文件的驗證出錯時的默認消息集,它們由Struts示例應用程序提供。每個消息的鍵值對應于每個由validator-rules.xml文件中的驗證例行程序所指定的消息,它們由Struts示例應用程序提供。

    # Error messages for Validator framework validations
    errors.required={0} is required.
    errors.minlength={0} cannot be less than {1} characters.
    errors.maxlength={0} cannot be greater than {2} characters.
    errors.invalid={0} is invalid.
    errors.byte={0} must be a byte.
    errors.short={0} must be a short.
    errors.integer={0} must be an integer.
    errors.long={0} must be a long.0.   errors.float={0} must be a float.
    
    errors.double={0} must be a 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.
    

    請注意,每條消息都有占位符,形式為{0}、{1}或{2}。在運行期間,占位符被另一個值代替,如所驗證的域的名稱。這一特性特別有用,它使你能夠創建可被幾個不同的域重復使用的通用驗證錯誤消息。

    例如,下面給出required驗證的錯誤消息errors.required:

    errors.required={0} is required.
    

    當你使用validation.xml文件中的該required驗證時,必須定義用于替換該錯誤消息中的{0}的值,如下所示:

    <form name="auctionForm">
      <field property="bid" depends="required">
        <arg0 key="prompt.bid"/>
      </field>
    </form>
    

    錯誤消息最多可以有4個占位符:{0}和{3}。這些占位符分別稱為arg0到arg3,你可以通過使用arg0~arg3標記來指定它們。在上面的例子中,arg0標記指定了用于替換{0}占位符的值。該標記的key屬性指定來自ApplicationResources.properties文件的一個消息鍵值,它的值用于替換占位符,如下所示:

    prompt.bid=Auction Bid
    

    使用消息鍵值代替占位符的值,這一方法使你不必在validation.xml文件中對替換值反復硬編碼。但是,如果你不想使用Resource Bundle的鍵值/值機制來指定占位符的值,則可以使用arg0標記的如下語法顯式地指定占位符的值:

    <arg0 key="Auction Bid" resource="false"/>
    

    在這個例子中,resource屬性的值設為false,以便通知Validator要把該key屬性指定的值作為占位符的值,而不要作為ApplicationResources.properties文件中消息的一個鍵值。

    啟用客戶端驗證

    Validator除了提供了簡化服務器端表單數據驗證過程的框架外,它還提供了執行客戶端驗證時易于使用的方法。在validator-rules.xml文件中定義的每一個驗證例行程序都可以隨意指定JavaScript代碼,這些代碼可以在瀏覽器(客戶端上的)中運行,從而執行與服務器端進行的驗證相同的驗證過程。在客戶端進行驗證時,除非所有表單都通過驗證,否則這些表單不允許被提交。

    為了啟用客戶端驗證,必須在每個需要驗證的JSP中放上Struts HTML Tag Library(標記庫)的javascript標記,如下所示:

    <html:javascript formName="logonForm"/>
    

    javascript標記要求使用formName屬性來為想要對其執行驗證的表單指定validation.xml文件中給出的表單定義名,如下所示:

    <form name="logonForm">
      <field property="username"
            depends="required">
        <arg0 key="prompt.username"/>
      </field>
      <field property="password"
            depends="required">
        <arg0 key="prompt.password"/>
      </field>
    </form>
    

    為表單定義指定的服務器端的所有驗證都將在客戶端運行。由于客戶端驗證用JavaScript執行,所以可以有多種方法不去執行它。要確保驗證過程總是能運行,不論你是否選擇啟用了客戶端驗證,Validator都在服務器端執行這些驗證。

    結論

    Validator框架針對表單數據的驗證提供了可配置的系統,從而為核心Struts框架添加了很多有價值的功能。通過把Validator框架用于你的應用程序,你可以節約時間并簡化Struts應用程序的開發過程。

    posted on 2005-11-01 10:29 Sung 閱讀(300) 評論(0)  編輯  收藏 所屬分類: Struts
    主站蜘蛛池模板: 久久永久免费人妻精品下载| 久久国产乱子伦精品免费午夜| 亚洲视频在线免费观看| 久久精品国产亚洲香蕉 | 亚洲AV无码片一区二区三区| 一个人看www在线高清免费看| 亚洲最大的黄色网| 最近中文字幕无吗免费高清| 亚洲精品永久在线观看| 国产无遮挡裸体免费视频| 美女裸免费观看网站| 亚洲综合av永久无码精品一区二区 | 亚洲精品国产美女久久久| 中文字幕免费不卡二区| 亚洲伦理一区二区| 国产麻豆视频免费观看| 无忧传媒视频免费观看入口| 亚洲天堂免费在线视频| 无码人妻AV免费一区二区三区| 亚洲伊人久久大香线蕉在观| 日本高清色本免费现在观看| 一级毛片高清免费播放| 亚洲AV电影院在线观看| 午夜宅男在线永久免费观看网| 国产成人高清亚洲一区91| 亚洲色欲色欲www在线丝| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 免费特级黄毛片在线成人观看| 永久免费无码日韩视频| 亚洲国产AV无码专区亚洲AV| 很黄很色很刺激的视频免费| 一边摸一边爽一边叫床免费视频 | 免费无毒a网站在线观看| 亚洲av日韩综合一区在线观看| 成人免费的性色视频| 污网站在线观看免费| 亚洲美女aⅴ久久久91| 国产免费变态视频网址网站 | 女人18特级一级毛片免费视频| 免费看美女午夜大片| 亚洲欧洲日本天天堂在线观看|