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