我正在审核以下link并发现javax.faces.webapp.ValidatorTag
已被弃用并被ValidatorELTag取代,但我似乎无法找到有关此问题的任何有用信息。
我想创建一个正则表达式验证器,它接受输入:正则表达式和错误消息。
意思是我希望拥有这样的控件:
<regexValidator for="myControl" check="([a-Z]^)" errorMessage="Your input contained incorrect characters" />
现在上面给出的链接显示了如何做到这一点的一小部分,但是自从编写并且方法被弃用以来,已经发生了很多变化,我该如何处理这个问题?
答案 0 :(得分:3)
请参阅Creating a Custom Validator中的JEE5 Tutorial。 Creating a Custom Tag部分详细介绍了如何实施ValidatorELTag
课程。
for="myControl"
我怀疑你是否需要这个属性(我不确定你是如何使用它的)。验证器将在父控件上设置。 for
属性通常仅在一个控件引用另一个控件时使用,如标签组件中那样。
示例验证器:
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的忠实粉丝,这是一个很酷的功能。