我们的验证器只能验证一种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);
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"%>
<%@
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}">
<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
就可以运行了。
具体程序参看示例程序。