爪哇一角

          共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
          posts - 3, comments - 6, trackbacks - 0, articles - 99
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          六 JSF自定義轉換驗證標簽

          Posted on 2009-01-20 14:48 非洲小白臉 閱讀(366) 評論(0)  編輯  收藏 所屬分類: JSF

          我們的驗證器只能驗證一種pattern,上例的密碼驗證,只能在程序中指定匹配一種正則表達式“.+[0-9]+“,這對于程序的重復利用和維護都十分不利。

          這里我們可以自定義一個JSF標簽,將pattern作為一個屬性,就可以達到重復利用和易于維護的目的了。

          轉換器也是同樣的道理。

           

          自定義標簽可以直接繼承javax.faces.webapp.ValidatorTag,重新定義它的createValidator()方法。

          我們改造一下上例JSF的密碼驗證器的例子。

          PasswordValidator中增加一個變量pattern,用來存儲密碼驗證的匹配表達式。

          package test;

          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 {

          用來存儲密碼驗證的匹配表達式。

           
                 private String pattern;

           

              public void setPattern(String pattern) {

                  this.pattern = pattern;

              }

                 public void validate(FacesContext context,

                      UIComponent component,

                      Object obj)

                 throws ValidatorException {

          設置默認值。

           
                        if(pattern == null || pattern.equals("")){

                               pattern = ".+[0-9]+";

                        }

                        String password = (String) obj;

                       

                        if(password.length() < 6) {

                               FacesMessage message = new FacesMessage(

                                   FacesMessage.SEVERITY_ERROR,

                                   "字元長度小于6",

                                   "字元長度不得小于6");

                               throw new ValidatorException(message);

                        }

                        if(!password.matches(pattern)) {

                               FacesMessage message = new FacesMessage(

                                     FacesMessage.SEVERITY_ERROR,

                                     "密碼必須包括字元與數(shù)字",

                                     "密碼必須是字元加數(shù)字所組成");

                               throw new ValidatorException(message);

                        }

                 }

          }

          我們在用上面的驗證器進行驗證的時候,就可以設定pattern的屬性了。

          這樣我們就必須制作自己的驗證標簽,自定義標簽需要繼承javax.faces.webapp.ValidatorTag來實現(xiàn)。

          package test;

          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 {

                 private String pattern;

              public void setPattern(String pattern) {

                  this.pattern = pattern;

              }

              protected Validator createValidator() {

                  Application application =

                      FacesContext.getCurrentInstance().

                                   getApplication();

                  PasswordValidator validator =

                      (PasswordValidator) application.createValidator(

          face-config.xml中定義的驗證器的別名一致。

           
                              "test.Password");

                  validator.setPattern(pattern);

          設置pattern的屬性。

           
                  return validator;

              }

           }

          制作完自定義標簽后,還需要部署在TLD文件中。下面簡單定義一下:

          <tag>

                 <description>PasswordValidator</description>

                 <name>passwordValidator</name>

                 <tag-class>

                     test.PasswordValidatorTag

                 </tag-class>

                 <body-content>empty</body-content>

                 <attribute>

                     <name>pattern</name>

                     <required>true</required>

                     <rtexprvalue>false</rtexprvalue>

                 </attribute>

             </tag>

          具體參看textcmd.tld

          <%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>

          <%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

          追加新加入的tld文件。

           
          <%@ taglib uri="/WEB-INF/textcmd.tld" prefix="co" %>

          <%@page contentType="text/html;charset=utf-8"%>

          <html>

          <head>

          <title>JSF 自定義驗證器Tag</title>

          </head>

          <body>

          <f:view>

                 <h:form>

                        <h3>請輸入您的名稱</h3>

                        <h:message for="dateField" style="color:red" /><p>

                        <h:outputText value="#{user.errMessage}" style="color:red"/><p>

                        <!-- 姓名 -->

                        名稱:<h:inputText value="#{user.name}" />

                        <p>密碼:<h:inputSecret id="dateField" value="#{user.password}">

          自定義pattern屬性。

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

                               </h:inputSecret><p>

                        <p><h:commandButton value="送出" action="#{user.verify}" />

                 </h:form>

          </f:view>

          </body>

          </html>

           

          Tomcat啟動后,http://localhost:8080/jsfTest/pages/jsfMyTagValidator.faces 就可以運行了。

          具體程序參看示例程序。

           

          主站蜘蛛池模板: 云阳县| 辉县市| 本溪| 临安市| 三门县| 南涧| 应城市| 麟游县| 宣化县| 商城县| 分宜县| 文登市| 海口市| 镇远县| 盐边县| 武冈市| 桐乡市| 海伦市| 正定县| 大英县| 丰原市| 固始县| 鸡泽县| 岳阳市| 出国| 浠水县| 酒泉市| 钟祥市| 林芝县| 南靖县| 重庆市| 南皮县| 驻马店市| 嘉峪关市| 舒兰市| 柳江县| 卓尼县| 石泉县| 会东县| 赤水市| 邵东县|