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

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

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

    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 閱讀(240) 評論(0)  編輯  收藏 所屬分類: JSF
    主站蜘蛛池模板: 免费大香伊蕉在人线国产| 国产精品成人免费一区二区| 免费人成在线观看网站视频| 亚洲中文字幕无码中文字| 久久久久免费看黄A片APP | 免费毛片在线看不用播放器 | 嫩草视频在线免费观看| 亚洲乱码在线卡一卡二卡新区| 啦啦啦中文在线观看电视剧免费版 | 亚洲AV成人一区二区三区观看 | 亚洲成在人线在线播放无码| 好吊妞视频免费视频| 极品色天使在线婷婷天堂亚洲 | 亚洲高清专区日韩精品| 色欲A∨无码蜜臀AV免费播 | 成全视成人免费观看在线看| 亚洲熟妇丰满多毛XXXX| 免费在线看黄网站| 亚洲国产精品久久人人爱| 免费在线观看的网站| 国产精品亚洲综合| 欧洲亚洲国产清在高| 亚洲免费一级视频| 国产精品亚洲一区二区在线观看| 一区二区三区亚洲视频| 中文字幕永久免费| 亚洲日产2021三区| 国产精品免费视频一区| 国产在线观看免费视频软件| 亚洲国产亚洲片在线观看播放| 午夜dj在线观看免费视频| 免费的黄网站男人的天堂| 亚洲第一AAAAA片| 无码国产精品一区二区免费式影视 | 最近2019免费中文字幕视频三| 亚洲日日做天天做日日谢| 亚洲AV日韩精品一区二区三区| 中文字幕免费播放| 国产色在线|亚洲| 久久久久亚洲精品天堂久久久久久| 日本免费一区二区三区|