<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
    主站蜘蛛池模板: 亚洲AV无码一区二区三区电影| 亚洲AV午夜福利精品一区二区| 久久亚洲精品国产精品婷婷| 日韩精品免费一级视频| 亚洲精品一区二区三区四区乱码| 182tv免费观看在线视频| 亚洲专区在线视频| 精品久久8x国产免费观看| 亚洲日本国产乱码va在线观看| 成人免费视频69| 亚洲一区二区三区成人网站| 国产婷婷高清在线观看免费| 欧洲亚洲综合一区二区三区| 亚洲日本va午夜中文字幕久久| a级毛片免费观看视频| 亚洲欧洲日产国产综合网| 中文字幕乱码免费视频| 亚洲中文字幕无码久久2020 | 四虎最新永久免费视频| 亚洲色偷偷av男人的天堂| 免费a级毛片无码a∨蜜芽试看| 亚洲精品天堂无码中文字幕| 国产黄色片在线免费观看| 一级中文字幕免费乱码专区| 亚洲成AV人片在线观看| 成人免费观看一区二区| 国产精品亚洲精品久久精品| 亚洲综合网站色欲色欲| 9277手机在线视频观看免费| 亚洲日韩AV无码一区二区三区人| 免费在线观看你懂的| 免费在线中文日本| 中文字幕 亚洲 有码 在线| 亚洲国产精品无码久久青草| 久久这里只精品国产免费10| 亚洲日本天堂在线| 亚洲精品乱码久久久久久| 免费观看AV片在线播放| jizz中国免费| 亚洲国产精品yw在线观看| 亚洲精品无码99在线观看|