在开始本文之前,建议阅读下面的文章:
深入了解JSF
深入了解JSF(二):从JSF的Lifecycle看JSF对页面的处理机制和流程
以了解JSF的概念等。
JSF Validator图:
JSF Validator特点:
输入数据的验证放在服务器端进行。
需要验证输入值的组件(输入组件)在JSP里通过JSF标签加以设置,方法简单直观。
每个输入组件可以同时绑定多个Validator。
验证发生错误时,可以向FacesContext登录错误信息,并且可以通过JSP直接显示。显示风格与位置可以自由设定。
验证错误时,JSF的生命周期控制机制自动中止处理流程,跳转到画面描画阶段(Render Response Phase)。
JSF标准提供对数值(long, double)的最大最小值验证,文字列的最大最小长度验证,以及必须(required)验证等Validator。
支持用户自定义Validator。用户自定义Validator的方法有2种,一种是Method Validator,一种是实现javax.faces.validator.Validator接口。本文的后面将对其作详细介绍。
JSF标准Validator
validateDoubleRange
Validator标签名:f:validateDoubleRange标签。
属性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.DoubleRange
Validator 类:javax.faces.validator.DoubleRangeValidator
输入值的范围验证。
输入值必须为Number(数值)类型或者可以转换为Double类型的值
validateLongRange
Validator标签名:f:validateLongRange
属性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.LongRange
Validator 类:javax.faces.validator.LongRangeValidator
输入值的范围验证。
输入值必须为Number(数值)类型或者可以转换为Long类型的值
validateLength
Validator标签名:f:validateLength
属性名:
maximum="最大值"
minimum="最小值"
Validator ID:javax.faces.Length
Validator 类:javax.faces.validator.LengthValidator
输入值的长度验证。
输入值必须为String(字符串)或者可以转换为String类型的值
JSF required(必须输入) Validator
JSF的几个输入组件还可以使用required属性简单地验证表单元素是否得到输入。
<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的方法上面已经作了介绍,这里不再重复。
使用Method Validator
JSF支持Method级别的Validator,这种Validator实现起来比较简单,可以在任何JSF的managed-bean里实现一个类似以下的方法:
- 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容器上下文环境,component为
绑定的组件,value为组件的输入值。validateXxxx可以为任意你喜欢的方法名。与预期的输入值不符合的话,可以通过throw一个
ValidatorException。"some message"便是想要显示的错误消息。
然后在JSP中:
- <h:inputText value="#{mybean.someValue}" validator="#{mybean.validateXxxx}"/>
便可。
错误消息的显示稍后再作介绍。
Validator标签的使用
Validator标签可以接收参数,所以功能上比较强大,也比较灵活。同时,除了使用JSF标准的Validator标签之外,你还可以自定义Validator标签。关于自定义Validator标签我们将在另外的文章中加以介绍。
Validator标签的使用例:
- <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范围验证,指定范围最大值为5。超过5的情况则显示错误消息,错误消息可以使
用<h:message />或者<h:messages />标签显示。有关消息处理的详细介绍请参考:
JSF全面理解之消息处理
一文
f:validator标签的使用与Validator ID
除了以上2种验证方法之外,还可以使用f:validator标签对输入值加以验证。f:validator标签需要指定validatorId属性,Validator Id需要在faces-config.xml配置文件中加以配置。
f:validator标签的使用例:
- <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标签一文中对Validator ID做详细介绍。
JSF框架将调用指定Validator ID所对应的Validator的
public void validate(FacesContext context, UIComponent component, Object value)
方法。
跟Method Validator一样,不能f:validator标签传入参数。
本文介绍了JSF Validator的机制,特点,种类,以及使用方法等。我们将在近期其它文章中介绍怎么自定义Validator。
JSF Validator进阶篇 - 自定义JSF Validator
JSF框架提供Validator机制,对用户输入值的合法性进行验证。若用户输入值无效,还提供了错误消息显示功能,以帮助用户能正确输入。
在
JSF Validator入门基础篇 - JSF Validator的介绍与使用 一文中我们介绍了JSF Validator的机制,特点,种类,以及使用方法等。
本文将介绍怎么自定义Validator和Validator标签。
自定义Validator有2种方法:一种是Method Validator,我们在
JSF Validator入门基础篇 - JSF Validator的介绍与使用 一文中已作了介绍,这里不再详述;另一种是通过实现Validator接口,也就是使用自定义的Validator类。
自定义Validator类与Validator标签有以下几个步骤:
自定义Validator类的实现
faces-config.xml登录
自定义Validator标签类
设置TLD文件
自定义Validator类的实现
定义一个类,该类实现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"));
- }
- }
-
- ... //其它参数设置,方法等(略)
- }
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"));
}
}
... //其它参数设置,方法等(略)
}
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>
经过上面2个步骤,就可以使用MyValidator了。
例:
<h:inputText id="xxxxValue" value="#{mybean.xxxxValue}">
<f:validator validatorId="MyValidator"></f:validator>
</h:inputText>
自定义Validator标签类
上面的MyValidator虽然可以通过f:validator标签加以利用, 但不能向其传入参数,若要向其传入参数,则需要定义自定义Validator标签类。
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加入相应参数及方法实现。
TLD文件
定义好Validator标签类之后,还需要在TLD文件设置,有关TLD这里就不介绍了。请大家参考相关资料。
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标签的使用
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>