爪哇一角

共同探讨STRUTS#HIBERNATE#SPRING#EJB等技术
posts - 3, comments - 6, trackbacks - 0, articles - 99
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

六 JSF自定义转换验证标签

Posted on 2009-01-20 14:48 非洲小白脸 阅读(355) 评论(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,

                           "密码必须包括字元与数字",

                           "密码必须是字元加数字所组成");

                     throw new ValidatorException(message);

              }

       }

}

我们在用上面的验证器进行验证的时候,就可以设定pattern的属性了。

这样我们就必须制作自己的验证标签,自定义标签需要继承javax.faces.webapp.ValidatorTag来实现。

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 就可以运行了。

具体程序参看示例程序。

 


只有注册用户登录后才能发表评论。


网站导航: