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

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

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

    Kimi's NutShell

    我荒廢的今日,正是昨日殞身之人祈求的明日

    BlogJava 新隨筆 管理
      141 Posts :: 0 Stories :: 75 Comments :: 0 Trackbacks
    自訂驗證器 中,我們的驗證器只能驗證一種pattern(.+[0-9]+),我們希望可以在JSF頁面上自訂匹配的pattern,然而由於我們使用<f: validator>這個通用的驗證器標籤,為了要能提供pattern屬性,我們可以使用<f:attribute>標籤來設置,例如:
    								....
      <h:inputSecret value="#{user.password}" required="true"> 
        <f:validator validatorId="onlyfun.caterpillar.Password"/>
        <f:attribute name="pattern" value=".+[0-9]+"/>
     </h:inputSecret><p>
     ....
    						

      使用<f:attribute>標籤來設定屬性,接著我們可以如下取得所設定的屬性:

    								....
     public void validate(FacesContext context, 
                             UIComponent component, 
                             Object obj)
                throws ValidatorException {
         ....
         String pattern = (String)
                      component.getAttributes().get("pattern");
         ....
     }
     ....
    						

      您也可以開發自己的一組驗證標籤,並提供相關屬性設定,這需要瞭解JSP Tag Library的撰寫,所以請您先參考 JSP/Servlet 中有關於JSP Tag Library的介紹。

      要開發驗證器轉用標籤,您可以直接繼承javax.faces.webapp.ValidatorTag,這個類別可以幫您處理大部份的細節,您所需要的,就是重新定義它的createValidator()方法,我們以改寫 自訂驗證器 中的PasswordValidator為例:

    • PasswordValidator.java
    PasswordValidator.java
    								
    										
    												package onlyfun.caterpillar;
    
     import javax.faces.application.FacesMessage;
     import javax.faces.component.UIComponent;
     import javax.faces.context.FacesContext;
     import javax.faces.validator.Validator;
     import javax.faces.validator.ValidatorException;
    
     public class PasswordValidator implements Validator {
        privateString pattern;
    
        public void setPattern(String pattern) {
            this.pattern = pattern;
        }
        
        public void validate(FacesContext context, 
                             UIComponent component, 
                             Object obj)
                throws ValidatorException {
            String password = (String) obj;
            
            if(password.length() < 6) {
                FacesMessage message = new FacesMessage(
                  FacesMessage.SEVERITY_ERROR, 
                  "字元長度小於6", "字元長度不得小於6");
                thrownew ValidatorException(message);
            }
            
            if(pattern != null && !password.matches(pattern)) {
                FacesMessage message = new FacesMessage(
                      FacesMessage.SEVERITY_ERROR, 
                      "密碼必須包括字元與數字", 
                      "密碼必須是字元加數字所組成");
                thrownew ValidatorException(message);
            }
        }
     }
    								
    						

      主要的差別是我們提供了pattern屬性,在validate()方法中進行驗證時,是根據我們所設定的pattern屬性,接著我們繼承javax.faces.webapp.ValidatorTag來撰寫自己的驗證標籤:

    PasswordValidatorTag.java
    								
    										
    												package onlyfun.caterpillar;
    
     import javax.faces.application.Application;
     import javax.faces.context.FacesContext;
     import javax.faces.validator.Validator;
     import javax.faces.webapp.ValidatorTag;
    
     public class PasswordValidatorTag extends ValidatorTag {
        privateString pattern;
        
        public void setPattern(String pattern) {
            this.pattern = pattern;
        }
        
        protected Validator createValidator() {
            Application application = 
                FacesContext.getCurrentInstance().
                             getApplication();
            PasswordValidator validator = 
                (PasswordValidator) application.createValidator(
                        "onlyfun.caterpillar.Password");
            validator.setPattern(pattern);
            return validator;
        }
     }
    								
    						

      application.createValidator()方法建立驗證器物件時,是根據在faces-config.xml中註冊驗證器的識別(Validater ID):

    • faces-config.xml
    faces-config.xml
    								<?xml version="1.0"?>
     <!DOCTYPE faces-config PUBLIC
     
    								
    										
    												"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
    										
    								
    								
    										
    												"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
    
     <faces-config>
     ....
        <validator>
            <validator-id>
                onlyfun.caterpillar.Password
            </validator-id>
            <validator-class>
                onlyfun.caterpillar.PasswordValidator
            </validator-class>
        </validator>
     ....
     </faces-config>
    								
    						

      剩下來的工作,就是佈署tld描述檔了,我們簡單的定義一下:

    • taglib.tld
    taglib.tld
    								<?xml version="1.0" encoding="UTF-8" ?> 
     
     <taglib xmlns=
    								
    										
    												"http://java.sun.com/xml/ns/j2ee"    xmlns:xsi=
    								
    								
    										
    												"http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http:
    								
    								
    										
    												//java.sun.com/xml/ns/j2ee 
                            web-jsptaglibrary_2_0.xsd" 
        version="2.0"> 
        
        <description>PasswordValidator Tag</description> 
        <tlib-version>1.0</tlib-version> 
        <jsp-version>2.0</jsp-version> 
        <short-name>co</short-name> 
        <uri>http:
    								
    								
    										
    												//caterpillar.onlyfun.net</uri> 
    
        <tag> 
            <description>PasswordValidator</description> 
            <name>passwordValidator</name> 
            <tag-class>
                onlyfun.caterpillar.PasswordValidatorTag
            </tag-class> 
            <body-content>empty</body-content> 
            <attribute> 
                <name>pattern</name> 
                <required>true</required> 
                <rtexprvalue>false</rtexprvalue> 
            </attribute> 
        </tag> 
    
     </taglib>
    								
    						

      而我們的index.jsp改寫如下:

    • index.jsp
    index.jsp
    								<%@ taglib uri=
    								
    										
    												"http://java.sun.com/jsf/core" prefix="f" %>
     <%@ taglib uri=
    								
    								
    										
    												"http://java.sun.com/jsf/html" prefix="h" %>
     <%@ taglib uri="/WEB-INF/taglib.tld" prefix="co" %>
     <%@page contentType="text/html;charset=Big5"%> 
     <html>
     <head>
     <title>驗證器示範</title>
     </head>
     <body>
        <f:view>
            <h:messages layout="table" style="color:red"/>
            <h:form>
                <h3>請輸入您的名稱</h3>
                <h:outputText value="#{user.errMessage}"/><p>
               名稱: <h:inputText value="#{user.name}" 
                                  required="true"/><p>
               密碼: <h:inputSecret value="#{user.password}" 
                                    required="true">
                         <co:passwordValidator pattern=".+[0-9]+"/>
                     </h:inputSecret> <p>
                <h:commandButton value="送出" 
                                 action="#{user.verify}"/>
            </h:form>
        </f:view>
     </body>
     </html>
    								
    						

      主要的差別是,我們使用了自己的驗證器標籤:

    								<co:passwordValidator pattern=".+[0-9]+"/>
    						

      如果要自訂轉換器標籤,方法也是類似,您要作的是繼承javax.faces.webapp.ConverterTag,並重新定義其createConverter()方法。

    posted on 2006-05-19 11:02 Kimi 閱讀(403) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 最新免费jlzzjlzz在线播放| heyzo亚洲精品日韩| 亚洲精品无码成人| 亚洲国产综合久久天堂| 成人爽a毛片免费| 亚洲AV成人影视在线观看| 免费在线观看的黄色网址| 免费在线看黄的网站| 亚洲性无码一区二区三区| 国产精品亚洲w码日韩中文| 91免费在线播放| 天堂亚洲免费视频| 亚洲无成人网77777| 免费人成视频x8x8入口| 免费v片在线观看视频网站| 免费人成再在线观看网站| 亚洲国产人成在线观看| 亚洲一区日韩高清中文字幕亚洲| 天天影视色香欲综合免费| 成人av片无码免费天天看| 亚洲影院天堂中文av色| 亚洲电影国产一区| 波多野结衣视频在线免费观看| 91精品视频在线免费观看| 国产精品亚洲片在线花蝴蝶| 亚洲成人黄色在线| 亚洲国产精品无码专区| 可以免费观看的一级毛片| 999久久久免费精品国产| 最近免费中文字幕中文高清| 亚洲AV日韩AV一区二区三曲 | 亚洲性久久久影院| 成年女人视频网站免费m| 99爱免费观看视频在线| 一级午夜免费视频| 久久久久亚洲精品无码网址色欲 | 亚洲精品一卡2卡3卡三卡四卡| 91麻豆国产自产在线观看亚洲| 国产高清免费的视频| 91成年人免费视频| 99爱免费观看视频在线|