`
foryougeljh
  • 浏览: 116482 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSF验证器和转换器

 
阅读更多
JSF定义了一系列标准的转换器(Converter),支持8种基本类型数据转换
DateTime、Number可以使用<f:convertDateTime>、<f:convertNumber>标签进行转换

自定义转换器
自定义转换器要实现javax.faces.convert.Converter接口,这个接口有两个要实现的方法:
public Object getAsObject(FacesContext context,UIComponent component,String str);
public String getAsString(FacesContext context,UIComponent component,Object obj);
实现自定义转换器后,需要在faces-config.xml中注册转换器
例如:
<converter>
<converter-id>onlyfun.caterpillar.User</converter-id>
<converter-class>
onlyfun.caterpillar.UserConverter
</converter-class>
</converter>
注册转换器时,需提供转换器标识(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识.
例如:
<h:inputText id="userField" value="#{guest.user}" converter="onlyfun.caterpillar.User"/>
也可以<f:converter>标签并使用converterId属性来指定转换器
<h:inputText id="userField" value="#{guest.user}">
<f:converter converterId="onlyfun.caterpillar.User"/>
</h:inputText>
除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法
<h:inputText id="userField" value="#{guest.user}" converter="#{guest.converter}"/>

标准验证器
JSF提供了三种标准验证器:<f:validateDoubleRange>、<f:validateLongRange>、<f:validateLength>
<h:inputText>、</h:inputSecret>中required属性为true,这表示这个栏目一定要输入值

自定义验证器,所需要的是实现javax.faces.validator.Validator接口
如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage对象,这个对象接受三个参数,分别表示信息的严重程度(INFO、WARN、ERROR、FATAL)信息概述与详细信息内容
这些信息可以使用<h:messages>或<h:message>标签显示在页面上
例如:
public void validate(FacesContext context,UIComponent component,Object obj)throws ValidatorException {
if(obj!=null){
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(acesMessage.SEVERITY_ERROR,
"密码必须包括字符与数字","密码必须是字符加数字所组成");
throw new ValidatorException(message);
}
}
}
接下来要在faces-config.xml中注册验证器的标识(Validater ID)
<validator>
<validator-id>
onlyfun.caterpillar.Password
</validator-id>
<validator-class>
onlyfun.caterpillar.PasswordValidator
</validator-class>
</validator>
要使用自定义的验证器,我们可以使用<f:validator>标签并设定validatorId属性
<h:inputSecret value="#{user.password}" required="true">
<f:validator validatorId="onlyfun.caterpillar.Password"/>
</h:inputSecret>
在自定义验证器中,使用<f:attribute>标签来设置属性
<h:inputSecret value="#{user.password}" required="true">
<f:validator validatorId="onlyfun.caterpillar.Password"/>
<f:attribute name="pattern" value=".+[0-9]+"/> <!--添加属性-->
</h:inputSecret><p>
程序中可以通过component来获取所设定的属性
public void validate(FacesContext context,UIComponent component,Object obj)
throws ValidatorException {
String pattern = (String)component.getAttributes().get("pattern");
}

采用JSF注解方式进行验证

@FacesValidator(value="com.bond.validator.EmailValidator")
public class EmailValidator implements Validator {
private String pattern="^[_a-z0-9]+@([_a-z0-9]+\\.)+[a-z0-9]{2,3}$";
@Override
public void validate(FacesContext context, UIComponent arg1, Object arg2)
throws ValidatorException {
......
}
public String getPattern() {
return pattern;
}
public void setPattern(String pattern) {
this.pattern = pattern;
}
}

页面引用

<h:inputText value="#{userBean.email}">
<f:validator validatorId="com.bond.validator.EmailValidator"/>
</h:inputText>
其中validatorId的值为@FacesValidator注解中value中的字符串这样就完成了,不需要另外的xml等配置,非常方便


您也可以让Bean自行负责验证的工作,可以在Bean上提供一个验证方法,这个方法没有传回值,并可以接收FacesContext、UIComponent、Object三个参数,
public void validate(FacesContext context,UIComponent component,Object obj)throws ValidatorException {}
接着可以在页面下如下使用验证器
<h:inputSecret value="#{user.password}" required="true" validator="#{user.validate}"/>

错误信息处理

使用<h:messages>标签,当有验证错误发生时,相关的错误信息会收集起来
使用<h:messages>标签可以一次将所有的错误信息显示出来

在使用标准转换器或验证器时,当发生错误时,会有一些预定义的错误信息,预定义的错误信息也是可以修改的.
提供一个信息资源文件.
在您提供自定义信息的时候,也可以提供{0}或{1}来设定显示相对的属性值,以提供详细正确的错误提示信息。

信息的显示有概述信息与详述信息,如果是详述信息,则在标识上加上"_detail"

例如:

javax.faces.component.UIInput.CONVERSION=Error.
javax.faces.component.UIInput.CONVERSION_detail= Detail Error.

除了在信息资源文件中提供信息, 您也可以在程序中使用FacesMessage来提供信息
最好的方法是在信息资源文件中提供信息,这么一来如果我们要修改信息,就只要修改信息资源文件的内容,而不用修改程序
onlyfun.caterpillar.message1=This is message1
onlyfun.caterpillar.message2=This is message2 with \{0} and \{1}
在程序中取得信息资源文件的内容
// 取得应用程序代表对象
Application application = context.getApplication();
// 取得信息文件主名称
String messageFileName = application.getMessageBundle();
// 取得当前 Locale 对象
Locale locale = context.getViewRoot().getLocale();
// 取得信息绑定 ResourceBundle 对象
ResourceBundle rsBundle = ResourceBundle.getBundle(messageFileName, locale);
String message = rsBundle.getString("onlyfun.caterpillar.message1");
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_FATAL, message, message);
将FacesMessage对象填入ValidatorException或ConverterException后再丢出
如果需要在信息资源文件中设定{0}、{1}等参数
String message = rsBundle.getString("onlyfun.caterpillar.message2");
Object[] params = {"param1", "param2"}
message = java.text.MessageFormat.format(message, params);
FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_FATAL, message, message);
,在显示信息时,onlyfun.caterpillar.message2的{0}与{1}的位置就会被"param1"与"param2"所取代

自定义转换, 验证标签
要开发自定义验证器标签,您可以直接继承javax.faces.webapp.ValidatorTag,覆写createValidator()方法

编写标签处理类(继承ValidatorTag,覆写createValidator()方法)
protected Validator createValidator() {
Application application = FacesContext.getCurrentInstance().getApplication();
PasswordValidator validator =
(PasswordValidator) application.createValidator("onlyfun.caterpillar.Password");
validator.setPattern(pattern);
return validator;
}
application.createValidator()方法建立验证器对象时,是根据在faces-config.xml中注册的标识(Validater ID):
<validator>
<validator-id>
onlyfun.caterpillar.Password
</validator-id>
<validator-class>
onlyfun.caterpillar.PasswordValidator
</validator-class>
</validator>

布署tld描述文件
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd" version="2.0">
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>co</short-name>
<uri>http://caterpillar.onlyfun.net</uri>

<tag>
<name>passwordValidator</name>
<tag-class>
onlyfun.caterpillar.PasswordValidatorTag
</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pattern</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>

页面导入
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="co" %>
<co:passwordValidator pattern=".+[0-9]+"/><!-- 使用自定义标签-->

自定义转换器标签方法也是类似(继承javax.faces.webapp.ConverterTag,并重新定义其createConverter()方法)

分享到:
评论

相关推荐

    第7章 JSF转换器和验证器与实例程序

    在JSF中,转换器和验证器是两个关键组件,它们确保了从用户输入到后台模型数据的准确无误的转换和验证。 转换器(Converter)在JSF中扮演着重要的角色,它们负责将用户界面显示的数据格式转化为模型所需的格式,...

    JSF自定义转换器验证器实例

    在JSF中,转换器和验证器扮演着至关重要的角色,它们允许我们对用户输入进行处理和验证,确保数据的质量和一致性。本实例将带你深入理解如何在JSF中创建自定义的转换器和验证器。 首先,我们来了解**转换器...

    JSF(转换器+验证器)

    JSF,全称为JavaServer Faces,是Java...这包括了解如何编写转换器和验证器类,如何将它们与JSF组件关联,以及如何处理验证和转换过程中的异常。这样的实践将增强你对JSF框架的理解,提高你在实际开发中的应用能力。

    jsf验证器与自定义验证

    JSF 提供了一种强大的机制来处理表单验证,包括内置的验证器和自定义验证器。这篇博客文章“jsf验证器与自定义验证”深入探讨了这些概念,并可能提供了实现细节和示例代码。 首先,JSF 内置的验证器是预定义的,...

    jsf中监听器与转换器的使用

    在JavaServer Faces (JSF)框架中,监听器和转换器是两个重要的组件,它们用于增强用户界面与后台数据处理的交互。在这个项目中,我们深入探讨了如何在JSF中有效地利用这两种机制。 首先,我们要理解JSF监听器的作用...

    JSF 转换器视频

    讲师很可能会演示如何在Myeclipse中创建一个简单的JSF项目,设置好环境后,他会逐步解释转换器的概念,编写一个自定义转换器的示例,展示如何注册和使用这个转换器,最后通过实际运行项目来验证转换器的正确性。...

    JSF 转换与验证 - 利用 JSF 的转换和验证框架来确保数据模型的完整性.rar

    验证器`Validator`接口是JSF验证的基础,开发者可以通过实现`javax.faces.validator.Validator`接口来创建自定义验证器。验证器的使用包括: 1. **注册验证器**: 在faces-config.xml文件中,使用`&lt;validator&gt;`标签...

    JSF 转换与验证 .rar

    转换器类需要覆盖`getAsString()`和`getAsObject()`方法,分别处理从组件值到字符串和从字符串到对象的转换。 2. 全局转换器:通过在faces-config.xml配置文件中注册转换器,可以将其应用于整个应用或特定的组件...

    facelets模板

    在 Facelets 中可以添加 JSF 验证器和转换器。Facelets 全面支持表达式语言 (EL) 和 JavaServer Pages Standard Tag Library (JSTL)。在 Web 应用程序中使用 Facelets 的部分好处包括模板化、重用和易于开发。

    jsf用户输入验证

    #### 一、JSF验证器概览 在JavaServer Faces (JSF) 中,用户输入验证是一项重要的功能,用于确保客户端提交的数据满足特定的要求。这不仅可以提升应用程序的安全性,还可以提高用户体验,通过及时反馈错误信息让...

    jsf介绍和例子

    3. ** faces-config.xml** - 这是JSF应用的核心配置文件,用于定义导航规则、组件、转换器和验证器等。 4. ** Managed Beans** - JSF 中的主要业务对象,用于存储和管理应用程序的业务逻辑和状态。 5. **EL...

    JSF 简介(英文)

    五、验证与转换:为了确保数据的准确性和安全性,JSF内置了验证和转换功能。当用户提交表单时,JSF会自动执行验证规则,检查数据是否符合预期格式。同时,它还提供了转换机制,用于将用户输入的数据转换为应用程序所...

    JSF开发文档

    在数据处理方面,JSF内置了标准转换器和验证器,这些转换器和验证器能够自动处理数据类型转换和输入验证,开发者也可以实现自定义转换器和验证器来满足特定的业务需求。JSF还包含了一套错误信息处理机制,能够在用户...

    shale实现jsf客户端验证例子

    Shale是一个开源的Java库,它为JSF提供了一系列强大的功能,包括验证框架,可帮助开发者轻松地创建复杂的客户端和服务器端验证规则。 首先,我们需要理解JSF中的验证机制。JSF是一种用于构建Web用户界面的MVC(模型...

    jsf例子\监听器 例子

    - **调用应用程序**:执行动作监听器和动作。 - **呈现响应**:准备响应并发送给客户端。 在这些阶段中,事件被创建并按顺序处理。监听器可以影响生命周期的进程,例如通过调用`FacesContext.renderResponse()`...

    详细的JSF的使用步骤

    4. **转换器和验证器** - 转换器(Converter)负责在浏览器与模型之间的数据类型转换,确保正确的数据类型被用于应用程序。 - 验证器(Validator)则执行语义验证,检查用户输入是否符合业务规则。JSF提供了预定义...

    JSF配置.pdf

    JSF提供了一系列标准的数据转换器,例如将字符串转换为日期或整数等。这些转换器会自动应用于UI组件和Managed Beans属性之间的数据转换。 #### 3.2 自定义转换器 当标准转换器不满足特定需求时,开发者可以创建...

    core jsf 1.2 jsf 核心

    转换器(Converter)则负责在组件值与Java对象之间进行类型转换。 ### 6. 事件处理 JSF事件模型允许在组件之间触发和监听事件。`ActionEvent`是JSF中最常见的事件类型,通常在命令组件(如按钮)被点击时触发。...

Global site tag (gtag.js) - Google Analytics