在開始本文之前,建議閱讀下面的文章:
深入了解JSF
深入了解JSF(二):從JSF的Lifecycle看JSF對頁面的處理機(jī)制和流程
以了解JSF的概念等。
JSF Validator圖:
JSF Validator特點(diǎn):

輸入數(shù)據(jù)的驗(yàn)證放在服務(wù)器端進(jìn)行。

需要驗(yàn)證輸入值的組件(輸入組件)在JSP里通過JSF標(biāo)簽加以設(shè)置,方法簡單直觀。

每個(gè)輸入組件可以同時(shí)綁定多個(gè)Validator。

驗(yàn)證發(fā)生錯(cuò)誤時(shí),可以向FacesContext登錄錯(cuò)誤信息,并且可以通過JSP直接顯示。顯示風(fēng)格與位置可以自由設(shè)定。

驗(yàn)證錯(cuò)誤時(shí),JSF的生命周期控制機(jī)制自動(dòng)中止處理流程,跳轉(zhuǎn)到畫面描畫階段(Render Response Phase)。

JSF標(biāo)準(zhǔn)提供對數(shù)值(long, double)的最大最小值驗(yàn)證,文字列的最大最小長度驗(yàn)證,以及必須(required)驗(yàn)證等Validator。

支持用戶自定義Validator。用戶自定義Validator的方法有2種,一種是Method Validator,一種是實(shí)現(xiàn)javax.faces.validator.Validator接口。本文的后面將對其作詳細(xì)介紹。
JSF標(biāo)準(zhǔn)Validator
validateDoubleRange
Validator標(biāo)簽名:f:validateDoubleRange標(biāo)簽。
屬性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.DoubleRange
Validator 類:javax.faces.validator.DoubleRangeValidator
輸入值的范圍驗(yàn)證。
輸入值必須為Number(數(shù)值)類型或者可以轉(zhuǎn)換為Double類型的值
validateLongRange
Validator標(biāo)簽名:f:validateLongRange
屬性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.LongRange
Validator 類:javax.faces.validator.LongRangeValidator
輸入值的范圍驗(yàn)證。
輸入值必須為Number(數(shù)值)類型或者可以轉(zhuǎn)換為Long類型的值
validateLength
Validator標(biāo)簽名:f:validateLength
屬性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.Length
Validator 類:javax.faces.validator.LengthValidator
輸入值的長度驗(yàn)證。
輸入值必須為String(字符串)或者可以轉(zhuǎn)換為String類型的值
JSF required(必須輸入) Validator
JSF的幾個(gè)輸入組件還可以使用required屬性簡單地驗(yàn)證表單元素是否得到輸入。
<h:inputHidden required="true/false"></h:inputHidden>
<h:inputSecret required=“true/false”></h:inputSecret>
<h:inputText required=“true/false”></h:inputText>
<h:inputTextarea required=“true/false”></h:inputTextarea>
<h:selectBooleanCheckbox required=“true/false”></h:selectBooleanCheckbox>
<h:selectManyCheckbox required=“true/false”></h:selectManyCheckbox>
<h:selectManyListbox required=“true/false”></h:selectManyListbox>
<h:selectManyMenu required=“true/false”></h:selectManyMenu>
<h:selectOneListbox required=“true/false”></h:selectOneListbox>
<h:selectOneMenu required=“true/false”></h:selectOneMenu>
<h:selectOneRadio required=“true/false”></h:selectOneRadio>
JSF Validator的使用
各輸入組件使用required validator的方法上面已經(jīng)作了介紹,這里不再重復(fù)。
使用Method Validator
JSF支持Method級(jí)別的Validator,這種Validator實(shí)現(xiàn)起來比較簡單,可以在任何JSF的managed-bean里實(shí)現(xiàn)一個(gè)類似以下的方法:
- public void validateXxxx(FacesContext context,
- UIComponent component, Object value){
-
- String text = value.toString();
- if(!text.equals("xxxx")){
- throw new ValidatorException(new FacesMessage("some message"));
- }
- }
public void validateXxxx(FacesContext context,
UIComponent component, Object value){
String text = value.toString();
if(!text.equals("xxxx")){
throw new ValidatorException(new FacesMessage("some message"));
}
}
其中,context變量為JSF容器上下文環(huán)境,component為
綁定的組件,value為組件的輸入值。validateXxxx可以為任意你喜歡的方法名。與預(yù)期的輸入值不符合的話,可以通過throw一個(gè)
ValidatorException。"some message"便是想要顯示的錯(cuò)誤消息。
然后在JSP中:
- <h:inputText value="#{mybean.someValue}" validator="#{mybean.validateXxxx}"/>
便可。
錯(cuò)誤消息的顯示稍后再作介紹。
Validator標(biāo)簽的使用
Validator標(biāo)簽可以接收參數(shù),所以功能上比較強(qiáng)大,也比較靈活。同時(shí),除了使用JSF標(biāo)準(zhǔn)的Validator標(biāo)簽之外,你還可以自定義Validator標(biāo)簽。關(guān)于自定義Validator標(biāo)簽我們將在另外的文章中加以介紹。
Validator標(biāo)簽的使用例:
- <h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">
- <f:validateDoubleRange maximum="5"></f:validateDoubleRange>
- </h:inputText>
- <h:message for="xxxxValue"></h:message>
<h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">
<f:validateDoubleRange maximum="5"></f:validateDoubleRange>
</h:inputText>
<h:message for="xxxxValue"></h:message>
上
例對id為xxxxValue的輸入框組件的輸入值做double范圍驗(yàn)證,指定范圍最大值為5。超過5的情況則顯示錯(cuò)誤消息,錯(cuò)誤消息可以使
用<h:message />或者<h:messages />標(biāo)簽顯示。有關(guān)消息處理的詳細(xì)介紹請參考:
JSF全面理解之消息處理
一文
f:validator標(biāo)簽的使用與Validator ID
除了以上2種驗(yàn)證方法之外,還可以使用f:validator標(biāo)簽對輸入值加以驗(yàn)證。f:validator標(biāo)簽需要指定validatorId屬性,Validator Id需要在faces-config.xml配置文件中加以配置。
f:validator標(biāo)簽的使用例:
- <h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">
- <f:validator validatorId="Some Validator ID"></f:validator>
- </h:inputText>
<h:inputText id="xxxxValue" value="#{mybean.xxxxValue}" required="true">
<f:validator validatorId="Some Validator ID"></f:validator>
</h:inputText>
"Some Validator ID"為具體的Validator ID,我們將在自定義Validator標(biāo)簽一文中對Validator ID做詳細(xì)介紹。
JSF框架將調(diào)用指定Validator ID所對應(yīng)的Validator的
public void validate(FacesContext context, UIComponent component, Object value)
方法。
跟Method Validator一樣,不能f:validator標(biāo)簽傳入?yún)?shù)。
本文介紹了JSF Validator的機(jī)制,特點(diǎn),種類,以及使用方法等。我們將在近期其它文章中介紹怎么自定義Validator。
JSF Validator進(jìn)階篇 - 自定義JSF Validator
JSF框架提供Validator機(jī)制,對用戶輸入值的合法性進(jìn)行驗(yàn)證。若用戶輸入值無效,還提供了錯(cuò)誤消息顯示功能,以幫助用戶能正確輸入。
在
JSF Validator入門基礎(chǔ)篇 - JSF Validator的介紹與使用 一文中我們介紹了JSF Validator的機(jī)制,特點(diǎn),種類,以及使用方法等。
本文將介紹怎么自定義Validator和Validator標(biāo)簽。
自定義Validator有2種方法:一種是Method Validator,我們在
JSF Validator入門基礎(chǔ)篇 - JSF Validator的介紹與使用 一文中已作了介紹,這里不再詳述;另一種是通過實(shí)現(xiàn)Validator接口,也就是使用自定義的Validator類。
自定義Validator類與Validator標(biāo)簽有以下幾個(gè)步驟:

自定義Validator類的實(shí)現(xiàn)

faces-config.xml登錄

自定義Validator標(biāo)簽類

設(shè)置TLD文件
自定義Validator類的實(shí)現(xiàn)
定義一個(gè)類,該類實(shí)現(xiàn)javax.faces.validator.Validaotr接口:

MyValidator.java
- package com.mypackages;
-
- import javax.faces.validator.Validaotr;
-
- public class MyValidator implements Validator {
- public void validate(FacesContext context, UIComponent component, Object value)
- throws ValidatorException {
-
- String text = value.toString();
- if(!text.equals("xxxx")){
- throw new ValidatorException(new FacesMessage("some message"));
- }
- }
-
- ... //其它參數(shù)設(shè)置,方法等(略)
- }
package com.mypackages;
import javax.faces.validator.Validaotr;
public class MyValidator implements Validator {
public void validate(FacesContext context, UIComponent component, Object value)
throws ValidatorException {
String text = value.toString();
if(!text.equals("xxxx")){
throw new ValidatorException(new FacesMessage("some message"));
}
}
... //其它參數(shù)設(shè)置,方法等(略)
}
faces-config.xml登錄
自定義Validator類之后,還得向faces-config.xml登錄之后才能使用。

faces-config.xml
- <?xml version="1.0"?>
- <!DOCTYPE faces-config PUBLIC
- "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
- "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
-
-
- <faces-config xmlns="http://java.sun.com/JSF/Configuration">
- <validator>
- <validator-id>MyValidator</validator-id>
- <validator-class>com.mypackages.MyValidator</validator-class>
- </validator>
- </faces-config>
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config xmlns="http://java.sun.com/JSF/Configuration">
<validator>
<validator-id>MyValidator</validator-id>
<validator-class>com.mypackages.MyValidator</validator-class>
</validator>
</faces-config>
經(jīng)過上面2個(gè)步驟,就可以使用MyValidator了。
例:
<h:inputText id="xxxxValue" value="#{mybean.xxxxValue}">
<f:validator validatorId="MyValidator"></f:validator>
</h:inputText>
自定義Validator標(biāo)簽類
上面的MyValidator雖然可以通過f:validator標(biāo)簽加以利用, 但不能向其傳入?yún)?shù),若要向其傳入?yún)?shù),則需要定義自定義Validator標(biāo)簽類。

MyValidatorTag.java
- package com.mypackages;
-
- import javax.faces.webapp.ValidatorTag;
-
- public class MyValidatorTag extends ValidatorTag{
-
- private String xxxParam;
-
- public MyValidatorTag(){
- setValidatorId("MyValidator");
- }
-
- protected Validator createValidator() throws JspException {
- MyValidator validator = (MyValidator)super.createValidator();
- validator.setXxxParam(xxxParam);
- return validator;
- }
-
- public String getXxxParam() {
- return xxxParam;
- }
-
- public void setXxxParam(String xxxParam) {
- this.xxxParam = xxxParam;
- }
- }
package com.mypackages;
import javax.faces.webapp.ValidatorTag;
public class MyValidatorTag extends ValidatorTag{
private String xxxParam;
public MyValidatorTag(){
setValidatorId("MyValidator");
}
protected Validator createValidator() throws JspException {
MyValidator validator = (MyValidator)super.createValidator();
validator.setXxxParam(xxxParam);
return validator;
}
public String getXxxParam() {
return xxxParam;
}
public void setXxxParam(String xxxParam) {
this.xxxParam = xxxParam;
}
}
另外,為MyValidator.java加入相應(yīng)參數(shù)及方法實(shí)現(xiàn)。
TLD文件
定義好Validator標(biāo)簽類之后,還需要在TLD文件設(shè)置,有關(guān)TLD這里就不介紹了。請大家參考相關(guān)資料。

MyValidator.tld
- <?xml version="1.0" encoding="ISO-8859-1" ?>
- <!DOCTYPE taglib
- PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
- "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
- <tlib-version>1.0</tlib-version>
- <jsp-version>1.2</jsp-version>
- <short-name>myv</short-name>
- <uri>my validator tag</uri>
- <display-name>my validator tag</display-name>
-
- <tag>
- <name>validateMyData</name>
- <tag-class>com.mypackages.MyValidatorTag</tag-class>
- <attribute>
- <name>xxxParam</name>
- <required>false</required>
- </attribute>
- </tag>
- </taglib>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>myv</short-name>
<uri>my validator tag</uri>
<display-name>my validator tag</display-name>
<tag>
<name>validateMyData</name>
<tag-class>com.mypackages.MyValidatorTag</tag-class>
<attribute>
<name>xxxParam</name>
<required>false</required>
</attribute>
</tag>
</taglib>
自定義Validator標(biāo)簽的使用

web.xml
- <taglib>
- <taglib-uri>/WEB-INF/MyValidator.tld</taglib-uri>
- <taglib-location>/WEB-INF/MyValidator.tld</taglib-location>
- </taglib>
<taglib>
<taglib-uri>/WEB-INF/MyValidator.tld</taglib-uri>
<taglib-location>/WEB-INF/MyValidator.tld</taglib-location>
</taglib>
JSP
- <%@ taglib uri="WEB-INF/MyValidator.tld" prefix="myv" %>
-
- ...
-
- <h:inputText value="#{mybean.xxxxValue}">
- <myv:validateMyData xxxParam="Some Parameter"/>
- </h:inputText>
<%@ taglib uri="WEB-INF/MyValidator.tld" prefix="myv" %>
...
<h:inputText value="#{mybean.xxxxValue}">
<myv:validateMyData xxxParam="Some Parameter"/>
</h:inputText>