Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks

          JSF Validator入門基礎篇 - JSF Validator的介紹與使用

          JSF框架提供Validator機制,對用戶輸入值的合法性進行驗證。若用戶輸入值無效,還提供了錯誤消息顯示功能,以幫助用戶能正確輸入。

          在開始本文之前,建議閱讀下面的文章:
          深入了解JSF
          深入了解JSF(二):從JSF的Lifecycle看JSF對頁面的處理機制和流程
          以了解JSF的概念等。

          JSF Validator圖:


          JSF Validator特點:
          輸入數據的驗證放在服務器端進行。
          需要驗證輸入值的組件(輸入組件)在JSP里通過JSF標簽加以設置,方法簡單直觀。
          每個輸入組件可以同時綁定多個Validator。
          驗證發生錯誤時,可以向FacesContext登錄錯誤信息,并且可以通過JSP直接顯示。顯示風格與位置可以自由設定。
          驗證錯誤時,JSF的生命周期控制機制自動中止處理流程,跳轉到畫面描畫階段(Render Response Phase)。
          JSF標準提供對數值(long, double)的最大最小值驗證,文字列的最大最小長度驗證,以及必須(required)驗證等Validator。
          支持用戶自定義Validator。用戶自定義Validator的方法有2種,一種是Method Validator,一種是實現javax.faces.validator.Validator接口。本文的后面將對其作詳細介紹。


          JSF標準Validator

          validateDoubleRange


          Validator標簽名:f:validateDoubleRange標簽。
            屬性名:
                maximum="最大值"
                minimum="最小值"
          Validator ID:javax.faces.DoubleRange
          Validator 類:javax.faces.validator.DoubleRangeValidator
          輸入值的范圍驗證。
          輸入值必須為Number(數值)類型或者可以轉換為Double類型的值

          validateLongRange


          Validator標簽名:f:validateLongRange
            屬性名:
                maximum="最大值"
                minimum="最小值"
          Validator ID:javax.faces.LongRange
          Validator 類:javax.faces.validator.LongRangeValidator
          輸入值的范圍驗證。
          輸入值必須為Number(數值)類型或者可以轉換為Long類型的值

          validateLength


          Validator標簽名:f:validateLength
            屬性名:
                maximum="最大值"
                minimum="最小值"
          Validator ID:javax.faces.Length
          Validator 類:javax.faces.validator.LengthValidator
          輸入值的長度驗證。
          輸入值必須為String(字符串)或者可以轉換為String類型的值


          JSF required(必須輸入) Validator
          JSF的幾個輸入組件還可以使用required屬性簡單地驗證表單元素是否得到輸入。
          <h:inputHidden required="true/false"></h:inputHidden>
          <h:inputSecret required=“true/false”></h:inputSecret>
          <h:inputText required=“true/false”></h:inputText>
          <h:inputTextarea required=“true/false”></h:inputTextarea>

          <h:selectBooleanCheckbox required=“true/false”></h:selectBooleanCheckbox>
          <h:selectManyCheckbox required=“true/false”></h:selectManyCheckbox>
          <h:selectManyListbox required=“true/false”></h:selectManyListbox>
          <h:selectManyMenu required=“true/false”></h:selectManyMenu>
          <h:selectOneListbox required=“true/false”></h:selectOneListbox>
          <h:selectOneMenu required=“true/false”></h:selectOneMenu>
          <h:selectOneRadio required=“true/false”></h:selectOneRadio>

          JSF Validator的使用
          各輸入組件使用required validator的方法上面已經作了介紹,這里不再重復。

          使用Method Validator


          JSF支持Method級別的Validator,這種Validator實現起來比較簡單,可以在任何JSF的managed-bean里實現一個類似以下的方法:
          1. public void validateXxxx(FacesContext context,   
          2.         UIComponent component, Object value){  
          3.   
          4.     String text = value.toString();  
          5.     if(!text.equals("xxxx")){  
          6.         throw new ValidatorException(new FacesMessage("some message"));  
          7.     }  
          8. }  

          其中,context變量為JSF容器上下文環境,component為 綁定的組件,value為組件的輸入值。validateXxxx可以為任意你喜歡的方法名。與預期的輸入值不符合的話,可以通過throw一個 ValidatorException。"some message"便是想要顯示的錯誤消息。

          然后在JSP中:
          1. <h:inputText value="#{mybean.someValue}" validator="#{mybean.validateXxxx}"/>  

          便可。
          錯誤消息的顯示稍后再作介紹。


          Validator標簽的使用


          Validator標簽可以接收參數,所以功能上比較強大,也比較靈活。同時,除了使用JSF標準的Validator標簽之外,你還可以自定義Validator標簽。關于自定義Validator標簽我們將在另外的文章中加以介紹。
          Validator標簽的使用例:
          1. <h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">  
          2.  <f:validateDoubleRange maximum="5"></f:validateDoubleRange>  
          3. </h:inputText>  
          4. <h:message for="xxxxValue"></h:message>  

          上 例對id為xxxxValue的輸入框組件的輸入值做double范圍驗證,指定范圍最大值為5。超過5的情況則顯示錯誤消息,錯誤消息可以使 用<h:message />或者<h:messages />標簽顯示。有關消息處理的詳細介紹請參考:
          JSF全面理解之消息處理
          一文

          f:validator標簽的使用與Validator ID


          除了以上2種驗證方法之外,還可以使用f:validator標簽對輸入值加以驗證。f:validator標簽需要指定validatorId屬性,Validator Id需要在faces-config.xml配置文件中加以配置。


          f:validator標簽的使用例:
          1. <h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">  
          2.   <f:validator validatorId="Some Validator ID"></f:validator>  
          3. </h:inputText>  

          "Some Validator ID"為具體的Validator ID,我們將在自定義Validator標簽一文中對Validator ID做詳細介紹。

          JSF框架將調用指定Validator ID所對應的Validator的
          public void validate(FacesContext context, UIComponent component, Object value)
          方法。

          跟Method Validator一樣,不能f:validator標簽傳入參數。

          本文介紹了JSF Validator的機制,特點,種類,以及使用方法等。我們將在近期其它文章中介紹怎么自定義Validator。

          JSF Validator進階篇 - 自定義JSF Validator


          JSF框架提供Validator機制,對用戶輸入值的合法性進行驗證。若用戶輸入值無效,還提供了錯誤消息顯示功能,以幫助用戶能正確輸入。


          JSF Validator入門基礎篇 - JSF Validator的介紹與使用  一文中我們介紹了JSF Validator的機制,特點,種類,以及使用方法等。

          本文將介紹怎么自定義Validator和Validator標簽。

          自定義Validator有2種方法:一種是Method Validator,我們在JSF Validator入門基礎篇 - JSF Validator的介紹與使用  一文中已作了介紹,這里不再詳述;另一種是通過實現Validator接口,也就是使用自定義的Validator類。

          自定義Validator類與Validator標簽有以下幾個步驟:
          自定義Validator類的實現
          faces-config.xml登錄
          自定義Validator標簽類
          設置TLD文件


          自定義Validator類的實現
          定義一個類,該類實現javax.faces.validator.Validaotr接口:

          MyValidator.java
          1. package com.mypackages;  
          2.   
          3. import javax.faces.validator.Validaotr;  
          4.   
          5. public class MyValidator implements Validator {  
          6.     public void validate(FacesContext context, UIComponent component, Object value)  
          7.             throws ValidatorException {  
          8.   
          9.         String text = value.toString();  
          10.         if(!text.equals("xxxx")){  
          11.             throw new ValidatorException(new FacesMessage("some message"));  
          12.         }  
          13.     }  
          14.   
          15.     ... //其它參數設置,方法等(略)  
          16. }  


          faces-config.xml登錄
          自定義Validator類之后,還得向faces-config.xml登錄之后才能使用。
          faces-config.xml
          1. <?xml version="1.0"?>  
          2. <!DOCTYPE faces-config PUBLIC  
          3.   "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"  
          4.   "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">  
          5.   
          6.   
          7. <faces-config xmlns="http://java.sun.com/JSF/Configuration">  
          8.     <validator>  
          9.         <validator-id>MyValidator</validator-id>  
          10.         <validator-class>com.mypackages.MyValidator</validator-class>  
          11.     </validator>  
          12. </faces-config>  


          經過上面2個步驟,就可以使用MyValidator了。
          例:
          <h:inputText id="xxxxValue" value="#{mybean.xxxxValue}">
            <f:validator validatorId="MyValidator"></f:validator>
          </h:inputText>

          自定義Validator標簽類
          上面的MyValidator雖然可以通過f:validator標簽加以利用, 但不能向其傳入參數,若要向其傳入參數,則需要定義自定義Validator標簽類。
          MyValidatorTag.java
          1. package com.mypackages;  
          2.   
          3. import javax.faces.webapp.ValidatorTag;  
          4.   
          5. public class MyValidatorTag extends ValidatorTag{  
          6.   
          7.     private String xxxParam;  
          8.       
          9.     public MyValidatorTag(){  
          10.         setValidatorId("MyValidator");  
          11.     }  
          12.       
          13.     protected Validator createValidator() throws JspException {  
          14.         MyValidator validator =  (MyValidator)super.createValidator();  
          15.         validator.setXxxParam(xxxParam);  
          16.         return validator;  
          17.     }  
          18.   
          19.     public String getXxxParam() {  
          20.         return xxxParam;  
          21.     }  
          22.   
          23.     public void setXxxParam(String xxxParam) {  
          24.         this.xxxParam = xxxParam;  
          25.     }  
          26. }  

          另外,為MyValidator.java加入相應參數及方法實現。

          TLD文件
          定義好Validator標簽類之后,還需要在TLD文件設置,有關TLD這里就不介紹了。請大家參考相關資料。

          MyValidator.tld
          1. <?xml version="1.0" encoding="ISO-8859-1" ?>  
          2. <!DOCTYPE taglib  
          3.   PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"  
          4.   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
          5. <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">  
          6.     <tlib-version>1.0</tlib-version>  
          7.     <jsp-version>1.2</jsp-version>  
          8.     <short-name>myv</short-name>  
          9.     <uri>my validator tag</uri>  
          10.     <display-name>my validator tag</display-name>  
          11.   
          12.     <tag>  
          13.         <name>validateMyData</name>  
          14.         <tag-class>com.mypackages.MyValidatorTag</tag-class>  
          15.         <attribute>  
          16.             <name>xxxParam</name>  
          17.             <required>false</required>  
          18.         </attribute>  
          19.     </tag>  
          20. </taglib>  


          自定義Validator標簽的使用
          web.xml
          1.  <taglib>  
          2.   <taglib-uri>/WEB-INF/MyValidator.tld</taglib-uri>  
          3.   <taglib-location>/WEB-INF/MyValidator.tld</taglib-location>  
          4.  </taglib>  



          JSP
          1. <%@ taglib uri="WEB-INF/MyValidator.tld" prefix="myv" %>  
          2.   
          3. ...  
          4.   
          5. <h:inputText value="#{mybean.xxxxValue}">  
          6.     <myv:validateMyData xxxParam="Some Parameter"/>  
          7. </h:inputText>  

          posted on 2009-04-14 10:58 seal 閱讀(3821) 評論(1)  編輯  收藏 所屬分類: Seam

          評論

          # re: JSF Validator(轉) 2015-10-15 14:40 asdfdsdfsadfasdfasdfsdf
          adsfasdfasdfadsfsdfadsf  回復  更多評論
            

          主站蜘蛛池模板: 南华县| 阜康市| 东方市| 凉城县| 清河县| 若尔盖县| 独山县| 乌海市| 福清市| 庆城县| 牙克石市| 福泉市| 永靖县| 抚宁县| 扬州市| 嵊州市| 宜春市| 湖口县| 红安县| 洪江市| 建水县| 江安县| 重庆市| 淅川县| 新巴尔虎右旗| 江北区| 南京市| 阿拉善右旗| 巢湖市| 洛川县| 防城港市| 宝山区| 镇安县| 龙井市| 贵阳市| 朔州市| 大丰市| 怀集县| 潞西市| 南木林县| 佳木斯市|