2

我正在查看以下链接,发现它javax.faces.webapp.ValidatorTag已被 ValidatorELTag 弃用并取代,但是我似乎找不到任何关于此的好信息。

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

这意味着我想要这样的控件:

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

现在上面给定的链接显示了如何做这件事的一小部分,但是自从编写和不推荐使用方法以来,已经发生了很多变化,我该如何解决这个问题?

4

2 回答 2

3

请参阅JEE5 教程中的创建自定义验证器创建自定义标签部分详细介绍了如何实现您的类。ValidatorELTag


for="myControl"

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


编辑:我误读了这个问题;上面的答案适用于 JSP(核心 JSF 1.2 中与标签相关的类仅适用于 JSP;Facelets 有自己的标签系统;好消息是您不需要专门用于定义标签的 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>

然后,您将标签库添加到应用程序(例如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>

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

于 2009-10-12T11:35:35.410 回答
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 的忠实粉丝,这是一个更酷的功能。

于 2010-05-17T14:22:02.537 回答