posts - 5,  comments - 7,  trackbacks - 0
          UI控件、轉換器和驗證器實現了StateHolder接口表示組件具有了狀態,可以保存一些組件自身的屬性。

          下面我們來看一個簡單的例子。
          這是一個正則表達式驗證器的例子:
          public class RegexValidator implements Validator
          {
              
          /**
               * The message identifier of the Message to be created if
               * the validation fails.
               
          */

              
          public static final String REGEX_INVALID_MESSAGE_ID =
                  
          "validator.Regex_Invalid";
              
              
              
          private String formatPatterns = null
          ;
              
              
          /**
               * 出錯時的提示內容名稱,例如郵編
               
          */

              
          private String errorPatternDisplayName = null;
              
              
          /**
               * 獲得樣式的配置文件
               
          */

              
          private static final ResourceBundle bundle = ResourceBundle.getBundle(Const.BUNDLE_ROOT + ".RegexPattern");
              
              
          /**
               * 資源配置文件中對應的樣式名稱
               
          */

              
          private String formatPatternName = null;
              
              
          public
           RegexValidator()
              
          {
                  
          super
          ();
              }

              
              
          public RegexValidator(String formatPatternName)
              
          {
                  setFormatPatternName(formatPatternName);
              }

              
              
          public void validate(FacesContext context, UIComponent component, Object toValidate)
                      
          throws
           ValidatorException
              
          {
                  
                  
          if(context == null || component == null
          )
                      
          throw new
           NullPointerException();
                  
                  
          if(!(component instanceof
           UIOutput))
                      
          return
          ;
                  
                  
          if(formatPatterns == null || formatPatterns.length() == 0 || null ==
           toValidate)
                      
          return
          ;
                  
                  String value 
          =
           toValidate.toString();
                  Pattern p 
          = Pattern.compile(this
          .formatPatterns);
                  Matcher m 
          =
           p.matcher(value);
                  
          boolean b =
           m.matches();
                  
          if(!
          b)
                  
          {
                      FacesMessage errMsg 
          =
           MessageFactory.getMessage(context, 
                              
          this
          .REGEX_INVALID_MESSAGE_ID, 
                              
          new Object[]{errorPatternDisplayName}
          );

                      
          throw new
           ValidatorException(errMsg);
                  }

              }


              
          public String getFormatPatternName()
              
          {
                  
          return
           formatPatternName;
              }


              
          public void setFormatPatternName(String formatPatternName)
              
          {
                  
          this.formatPatternName =
           formatPatternName;
                  
          this.errorPatternDisplayName =
           bundle.getString(formatPatternName);
                  
          this.formatPatterns = bundle.getString(formatPatternName+"_patterns"
          );
               
              }



          }

          它的Tag標簽:
          public class RegexValidatorTag extends ValidatorELTag
          {
              
          private
           String formatPatternName;
              
              
          public
           RegexValidatorTag()
              
          {
                  
          super
          ();
              }

              
              
          /* (non-Javadoc)
               * @see javax.faces.webapp.ValidatorELTag#createValidator()
               
          */

              @Override
              
          protected Validator createValidator() throws JspException
              
          {
                  RegexValidator v 
          = new
           RegexValidator();;
                  v.setFormatPatternName(formatPatternName);
                  
          return
           v;
              }

              
          public String getFormatPatternName()
              
          {
                  
          return
           formatPatternName;
              }

              
          public void setFormatPatternName(String formatPatternName)
              
          {
                  
                  
          this.formatPatternName =
           formatPatternName;
              }


          }
          這個驗證標簽接受一個名稱作為參數,通過此名稱可以從相關配置文件中查找到相應的正則表達式和其他一些配置信息。

          但如果你使用這個驗證器,你會發現,每次都正確調用了,也都將參數傳進去了,但是在調用validate方法的時候卻發現自定義的幾個驗證器的屬性的值都為null。這是為什么呢?
          因為我們第一次調用的時候初始化了一下,參數都進去了,驗證器也被實例化了,但是這個驗證器卻是瞬時狀態的,剛被頁面實例化好就被釋放了。所以提交表單驗證的時候會重新被初始化,但這時只是調用了默認構造函數,沒有將我們的正則表達式樣式作為參數傳進去。

          如何保存驗證器之前的狀態呢?或者說如何讓驗證器不是瞬時狀態呢。
          這就需要實現StateHolder接口,并且實現幾個方法,讓JSF知道,這個驗證器有自己的狀態需要保存。
          新的代碼:
          public class RegexValidator implements Validator, StateHolder
          {
              
          /**
               * The message identifier of the Message to be created if
               * the validation fails.
               
          */

              
          public static final String REGEX_INVALID_MESSAGE_ID =
                  
          "validator.Regex_Invalid";
              
              
              
          private String formatPatterns = null
          ;
              
              
          /**
               * 出錯時的提示內容名稱,例如郵編
               
          */

              
          private String errorPatternDisplayName = null;
              
              
          /**
               * 獲得樣式的配置文件
               
          */

              
          private static final ResourceBundle bundle = ResourceBundle.getBundle(Const.BUNDLE_ROOT + ".RegexPattern");
              
              
          /**
               * 資源配置文件中對應的樣式名稱
               
          */

              
          private String formatPatternName = null;
              
              
          public
           RegexValidator()
              
          {
                  
          super
          ();
              }

              
              
          public RegexValidator(String formatPatternName)
              
          {
                  setFormatPatternName(formatPatternName);
              }

              
              
          public void validate(FacesContext context, UIComponent component, Object toValidate)
                      
          throws
           ValidatorException
              
          {
                  
                  
          if(context == null || component == null
          )
                      
          throw new
           NullPointerException();
                  
                  
          if(!(component instanceof
           UIOutput))
                      
          return
          ;
                  
                  
          if(formatPatterns == null || formatPatterns.length() == 0 || null ==
           toValidate)
                      
          return
          ;
                  
                  String value 
          =
           toValidate.toString();
                  Pattern p 
          = Pattern.compile(this
          .formatPatterns);
                  Matcher m 
          =
           p.matcher(value);
                  
          boolean b =
           m.matches();
                  
          if(!
          b)
                  
          {
                      FacesMessage errMsg 
          =
           MessageFactory.getMessage(context, 
                              
          this
          .REGEX_INVALID_MESSAGE_ID, 
                              
          new Object[]{errorPatternDisplayName}
          );

                      
          throw new
           ValidatorException(errMsg);
                  }

              }


              
          public String getFormatPatternName()
              
          {
                  
          return
           formatPatternName;
              }


              
          public void setFormatPatternName(String formatPatternName)
              
          {
                  
          this.formatPatternName =
           formatPatternName;
                  
          this.errorPatternDisplayName =
           bundle.getString(formatPatternName);
                  
          this.formatPatterns = bundle.getString(formatPatternName+"_patterns"
          );
               
              }


              
          private boolean transientValue = false;
              
              
          public void setTransient(boolean
           transientValue)
              
          {
                  
          this.transientValue =
           transientValue;
              }

              
              
          public boolean isTransient()
              
          {
                  
          return this
          .transientValue;
              }


              
          public void restoreState(FacesContext context, Object state)
              
          {
                  Object values[] 
          =
           (Object[]) state;
                  formatPatterns 
          = (String) values[0
          ];
                  errorPatternDisplayName 
          = (String) values[1
          ];
              }


              
          public Object saveState(FacesContext context)
              
          {
                  Object[] values 
          = new Object[2
          ];
                  values[
          0=
           formatPatterns;
                  values[
          1=
           errorPatternDisplayName;
                  
          return
           values;
              }


          }

          實現setTransient和isTransient兩個方法是為了標明這個驗證器不是瞬時狀態,需要返回一個false。
          實現saveState和restoreState兩個方法是為了保存和還原狀態,大家可以看下代碼,saveState保存了當前驗證器需要的幾個屬性參數,而restoreState將這些參數重新還原給了驗證器,這樣,我們使用新代碼做驗證的時候,就會發現它起作用了。
          posted on 2008-11-23 01:04 Vincent-chen 閱讀(244) 評論(0)  編輯  收藏 所屬分類: JSF
          主站蜘蛛池模板: 行唐县| 平山县| 金华市| 城步| 高陵县| 个旧市| 长泰县| 华蓥市| 长寿区| 潼关县| 宜城市| 宜宾县| 蓬溪县| 昭通市| 仲巴县| 塘沽区| 商都县| 东兴市| 巴塘县| 广昌县| 方正县| 女性| 宁陕县| 威海市| 宁化县| 武强县| 镇安县| 图木舒克市| 马鞍山市| 静海县| 浮梁县| 沙雅县| 禹城市| 应用必备| 临沭县| 江津市| 洛川县| 哈密市| 丰台区| 诏安县| 分宜县|