我們的驗證器只能驗證一種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
就可以運行了。
具體程序參看示例程序。