使用Facelets 1.1.12在JSF 1.2中创建自己的Validator

时间:2009-10-12 09:54:34

标签: java jsp jsf facelets

我正在审核以下link并发现javax.faces.webapp.ValidatorTag已被弃用并被ValidatorELTag取代,但我似乎无法找到有关此问题的任何有用信息。

我想创建一个正则表达式验证器,它接受输入:正则表达式和错误消息。

意思是我希望拥有这样的控件:

<regexValidator for="myControl" check="([a-Z]^)" errorMessage="Your input contained incorrect characters" />

现在上面给出的链接显示了如何做到这一点的一小部分,但是自从编写并且方法被弃用以来,已经发生了很多变化,我该如何处理这个问题?

2 个答案:

答案 0 :(得分:3)

请参阅Creating a Custom Validator中的JEE5 TutorialCreating a Custom Tag部分详细介绍了如何实施ValidatorELTag课程。


for="myControl"

我怀疑你是否需要这个属性(我不确定你是如何使用它的)。验证器将在父控件上设置。 for属性通常仅在一个控件引用另一个控件时使用,如标签组件中那样。


编辑:我误解了这个问题;上面的答案适用于JSP(核心JSF 1.2中与标记相关的类仅适用于JSP; Facelets有自己的标记系统;好消息是您不需要专门用于Java类的Java类定义标签)。

示例验证器:

public class RegexValidator implements Validator, StateHolder {
  private boolean isTransient;
  private String regex;

  public String getRegex() { return regex; }
  public void setRegex(String regex) { this.regex = regex; }

  public void validate(FacesContext context, UIComponent component, Object value)
      throws ValidatorException {
    //TODO: throw ValidatorException if not valid
  }

  //TODO: implement remaining StateHolder methods...
}

然后在faces-config.xml

中注册此验证器
  <validator>
    <validator-id>regex.validator</validator-id>
    <validator-class>val.RegexValidator</validator-class>
  </validator>

然后add a tag library到应用(例如WEB-INF/facelets/foo.taglib.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC
  "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
  "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
  <namespace>http://demo</namespace>
  <tag>
    <tag-name>regexValidator</tag-name>
    <validator>
      <validator-id>regex.validator</validator-id>
    </validator>
  </tag>
</facelet-taglib>

向要使用标记库的任何Facelets视图添加xmlns:demo="http://demo"声明;您的验证者标签将以<demo:regexValidator ...形式开头;将通过内省验证器类来获取属性。

答案 1 :(得分:0)

这是我忘记添加到我的代码中的那篇文章,让我绊倒了......

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/WEB-INF/faces/foo.taglib.xml</param-value>
</context-param>

您还需要将check="([a-Z]^)"更改为regex="..."

我喜欢这种方法,因为不需要扩展ValidatorELTag。我是facelets的忠实粉丝,这是一个很酷的功能。