`

jsf-自定义验证器转换器标签

阅读更多
在自定义验证器中,我们的验证器只能验证一种pattern(.+[0-9]+),我们希望可以在JSF页面上自定义匹配的pattern,然而由于我们使用<f: validator>这个通用的验证器标签,为了要能提供pattern属性,我们可以使用<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>
....

使用<f:attribute>标签来设定属性,接着我们可以如下取得所设定的属性:
....
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
....
String pattern = (String)
component.getAttributes().get("pattern");
....
}
....

您也可以开发自己的一组验证标签,并提供相关属性设定,这需要了解JSP Tag Library的编写,所以请您先参考 JSP/Servlet 中有关于JSP Tag Library的介绍。
要开发验证器转用标签,您可以直接继承javax.faces.webapp.ValidatorTag,这个类可以帮您处理大部份的细节,您所需要的,就是重新定义它的createValidator()方法,我们以改写自定义验证器 中的PasswordValidator为例:
• PasswordValidator.java
package onlyfun.caterpillar;
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 {
private String pattern;
public void setPattern(String pattern) {
this.pattern = pattern;
}
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(pattern != null && !password.matches(pattern)) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"密码必须包括字符与数字",
"密码必须是字符加数字所组成");
throw new ValidatorException(message);
}
}
}
主要的差别是我们提供了pattern属性,在validate()方法中进行验证时,是根据我们所设定的pattern属性,接着我们继承javax.faces.webapp.ValidatorTag来编写自己的验证标签:
• PasswordValidatorTag.java
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorTag;
public class PasswordValidatorTag extends ValidatorTag {
private String pattern;
public void setPattern(String pattern) {
this.pattern = pattern;
}
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):
• 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>
....
<validator>
<validator-id>
onlyfun.caterpillar.Password
</validator-id>
<validator-class>
onlyfun.caterpillar.PasswordValidator
</validator-class>
</validator>
....
</faces-config>
剩下来的工作,就是布署tld描述文件了,我们简单的定义一下:
• taglib.tld
<?xml version="1.0" encoding="UTF-8" ?>
<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">
<description>PasswordValidator Tag</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>co</short-name>
<uri>http://caterpillar.onlyfun.net</uri>
<tag>
<description>PasswordValidator</description>
<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>
而我们的index.jsp改写如下:
• index.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="co" %>
<%@page contentType="text/html;charset=GB2312"%>
<html>
<head>
<title>验证器示范</title>
</head>
<body>
<f:view>
<h:messages layout="table" style="color:red"/>
<h:form>
<h3>请输入您的名称</h3>
<h:outputText value="#{user.errMessage}"/><p>
名称: <h:inputText value="#{user.name}"
required="true"/><p>
密码: <h:inputSecret value="#{user.password}"
required="true">
<co:passwordValidator pattern=".+[0-9]+"/>
</h:inputSecret> <p>
<h:commandButton value="送出"
action="#{user.verify}"/>
</h:form>
</f:view>
</body>
</html>
主要的差别是,我们使用了自己的验证器标签:
<co:passwordValidator pattern=".+[0-9]+"/>
如果要自定义转换器标签,方法也是类似,您要作的是继承javax.faces.webapp.ConverterTag,并重新定义其createConverter()方法。
分享到:
评论

相关推荐

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

    在这个例子中,`customIntegerConverter`是自定义转换器的ID,`ageValidator`是自定义验证器的ID。你需要在你的应用上下文中注册这些ID对应的类。 总的来说,JSF的自定义转换器和验证器允许开发者根据项目需求定制...

    jsf-api-2.0.3.jar.zip_jsf api_jsf jar包_jsf-api-2.0.3.jar_jsf-api

    开发者可以引用这些接口来创建自定义组件,实现事件监听器,以及进行数据绑定和验证。 在实际开发中,为了确保项目顺利运行,开发者需要将`jsf-api-2.0.3.jar` 和其他必要的JSF库添加到项目的`WEB-INF/lib`目录下,...

    jsf相关jar包 jsf-api.jar jsf-impl.jar

    这些接口定义了JSF的组件、事件、转换器、验证器等核心功能。通过这个API,开发者可以创建自定义的JSF组件,处理用户事件,以及实现数据的转换和验证。此外,它还包含JSF生命周期和渲染树的概念,使得开发者能理解...

    jsf验证器与自定义验证

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

    JSF-Java-jar包

    - 一些内建的转换器和验证器,用于数据验证和格式化。 - `Lifecycle`接口的实现,定义了JSF的六阶段生命周期:恢复视图、应用请求值、处理验证、更新模型值、调用应用事件和渲染响应。 3. **JSF工作原理**: 当...

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

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

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

    1. **声明转换器**: 在JSF的XML配置文件(如faces-config.xml)中,通过`&lt;converter&gt;`标签声明转换器,或在组件上使用`converter`属性指定转换器ID。 2. **应用转换器**: 使用` converterID`属性将转换器关联到特定...

    JSF(转换器+验证器)

    2. 自定义验证器需要实现`javax.faces.validator.Validator`接口,或者使用`@FacesValidator`注解进行声明。 3. `validate()`方法是验证器的核心,它接收三个参数:需要验证的组件、组件的值和验证上下文,通过这个...

    jsf-api-src.zip

    JavaScript Server Faces(JSF)是Java平台上用于构建用户界面的模型-视图-控制器(MVC)框架。JSF API提供了丰富的组件库和事件处理机制,使得开发人员能够轻松创建Web应用程序。`jsf-api-src.zip`是一个压缩包,...

    ajax4jsf-demo

    JSF应用程序通常由UI组件、事件、转换和验证以及 backing beans 组成。 **3. Ajax4JSF 库** Ajax4JSF 是针对JSF的扩展,它提供了一套方便的Ajax行为和组件,使得开发者能够在JSF页面上添加Ajax功能。这些组件和行为...

    jsf-demo练兵

    **JSF(JavaServer Faces)** 是一个Java平台...同时,也可以深入了解JSF的事件处理、验证和转换机制,以及与后端数据库的交互方式。这个练习项目对于初学者来说是一个很好的起点,可以加深对JSF框架的理解和应用能力。

    JSF-2-Hello-World-Example.zip

    8. **Conversion and Validation**:JSF提供了一套内置的转换器和验证器,用于确保输入数据的正确性。 9. **Composite Components**:允许开发者创建自定义组件,复用和组合现有的JSF组件。 在这个"JSF-2-Hello-...

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

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

    JSF-Demo.rar_DEMO_jsf demo down load

    5. **转换和验证**:JSF支持自定义数据验证,如通过`@Validator`注解创建验证器类,或者在UI组件上使用`required`属性、`javax.faces.validator.LengthValidator`等内置验证器。 6. **事件处理**:JSF中的事件处理...

    jsf自定义组件.pdf

    ### JSF自定义组件知识点详解 #### 一、JSF生命周期与组件概述 **1.1 JSF生命周期** JavaServer Faces (JSF) 是一种基于Java的Web应用框架,主要用于构建用户界面。为了更好地理解如何自定义JSF组件,首先需要...

    jsf-tutorial.rar_jsf PPT

    开发者可以通过自定义验证器或者使用预定义的验证器(如`javax.faces.validator.LengthValidator`)来实现。 5. **转换和国际化**:JSF支持数据类型的转换,允许将客户端的输入值转换为服务器端期望的类型。此外,...

    JSF 转换与验证 .rar

    2. 自定义验证器:通过实现`javax.faces.validator.Validator`接口,开发者可以创建自己的验证器。验证器需要覆盖`validate()`方法,此方法会在提交请求时调用,以检查组件值的有效性。 3. 验证错误处理:当验证...

    jsf用户输入验证

    在这个示例中,我们创建了一个名为 `EmailValidator` 的自定义验证器,它实现了 `Validator` 接口。该验证器检查电子邮件地址是否有效,并抛出异常以阻止无效输入的保存。 ##### 使用自定义验证器: ```xml ``...

    jsf2.0 自定义组件

    JSF(JavaServer Faces)是Java平台上用于构建Web应用程序的MVC(模型-视图-控制器)框架。在JSF 2.0版本中,它引入了许多改进和新特性,其中包括对自定义组件的强大支持。自定义组件允许开发人员根据特定需求创建...

Global site tag (gtag.js) - Google Analytics