前面我們舉的例子,用戶需要輸入用戶名和密碼提交驗(yàn)證。那么你輸入的密碼如果有長(zhǎng)度限制,或者只能輸入數(shù)字的話,
你可能會(huì)在用戶驗(yàn)證之前進(jìn)行檢查,這樣做也可以。
但是我個(gè)人的理解,喚起應(yīng)用程序和執(zhí)行驗(yàn)證相比,更靠后,程序效率會(huì)變低。而且程序的層次不清楚,驗(yàn)證和邏輯混合,不易維護(hù)。
所以我們可以自定義驗(yàn)證器來(lái)解決。
自定義驗(yàn)證器要實(shí)現(xiàn)javax.faces.validator.Validator的validate()方法
驗(yàn)證出錯(cuò)時(shí)ValidatorException,接受參數(shù)FacesMessage,可以在前臺(tái)用標(biāo)簽<h:messages>顯示。
我們先寫(xiě)個(gè)驗(yàn)證器:
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;
//自定義驗(yàn)證器
public
class PasswordValidator implements Validator {
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
String password = (String) obj;
if(password.length() < 6) {
FacesMessage message = new
FacesMessage(
FacesMessage.SEVERITY_ERROR,
"字元長(zhǎng)度小于6",
"字元長(zhǎng)度不得小于6");
throw new
ValidatorException(message);
}
if(!password.matches(".+[0-9]+"))
{
FacesMessage message = new
FacesMessage(
FacesMessage.SEVERITY_ERROR,
"密碼必須包括字元與數(shù)字",
"密碼必須是字元加數(shù)字所組成");
throw new ValidatorException(message);
}
}
}
新建一個(gè)jsp文件,其實(shí)和上面例子用的jsp差不多,只是加入了密碼驗(yàn)證。
<%@taglib
uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib
uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@page
contentType="text/html;charset=utf-8"%>
<html>
<head>
<title>JSF 自定義驗(yàn)證器</title>
</head>
<body>
<f:view>
<h:form>
<h3>請(qǐng)輸入您的名稱</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}">
加入了密碼的驗(yàn)證器。
<f:validator
validatorId="test.Password"/>
</h:inputSecret><p>
<p><h:commandButton value="送出"
action="#{user.verify}" />
</h:form>
</f:view>
</body>
</html>
上面紅色部分就是加入的密碼驗(yàn)證器,按照jsf的生命周期,它是在喚起應(yīng)用程序之前執(zhí)行的。
faces-config.xmle中配置驗(yàn)證器
<!-- 驗(yàn)證器 -->
<validator>
<validator-id>test.Password</validator-id>
<validator-class>test.PasswordValidator</validator-class>
</validator>
Tomcat啟動(dòng)后,http://localhost:8080/jsfTest/pages/jsfMyValidator.faces
就可以運(yùn)行了。當(dāng)密碼輸入小于6或者有字母的時(shí)候,就會(huì)出錯(cuò)。