`

JSF自定义转换器[ZT]

    博客分类:
  • Jsf
阅读更多
可以制作javax.faces.convert.Comverter接口自定义验证器,这里介绍两个制作方法:
java 代码
 
  1. public Object getAsObject(FacesContext context,  
  2.                            UIComponent component,  
  3.                            String str);  
  4. public String getAsString(FacesContext context,  
  5.                            UIComponent component,  
  6.                            Object obj);  

简单的说,第一个方法会接收从客户端经过HTTP传来的字符串信息,在第一个方法中将要转换的内容转换成自定义的组件,这个自定义组件将会自动设定给你指定的Bean组件;第二个方法就是将从你的Bean组件得到组件的转换字符串,如此才能­由HTTP传回
给客户端。

直接以一个简单的例子来说明。假设你有一个User类:
java 代码
 
  1. User.java  
  2. User.java  
  3. package onlyfun.caterpillar;  
  4.  public class User {  
  5.     private String firstName;  
  6.     private String lastName;  
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.     public void setFirstName(String firstName) {  
  11.         this.firstName = firstName;  
  12.     }  
  13.     public String getLastName() {  
  14.         return lastName;  
  15.     }  
  16.     public void setLastName(String lastName) {  
  17.         this.lastName = lastName;  
  18.     }  
  19.  }  

这个User类时我们转换器的目标组件,我们也有一个GuestBean类:
java 代码
 
  1. GuestBean.java  
  2. package onlyfun.caterpillar;  
  3.  public class GuestBean {  
  4.     private User user;  
  5.     public void setUser(User user) {  
  6.         this.user = user;  
  7.     }  
  8.     public User getUser() {  
  9.         return user;  
  10.     }  
  11.  }  

这个Bean上的属性直接传回或接受User类型的参数,我们作一个简单的转换器,为HTTP字符串与User组件进行转换:
UserConverter.java 代码
 
  1.  package onlyfun.caterpillar;  
  2.  import javax.faces.component.UIComponent;  
  3.  import javax.faces.context.FacesContext;  
  4.  import javax.faces.convert.Converter;  
  5.  import javax.faces.convert.ConverterException;  
  6.   
  7.  //转换器需要实现(继承) javax.faces.convert.Converter  
  8.  public class UserConverter implements Converter {  
  9.     public Object getAsObject(FacesContext context,  
  10.                               UIComponent component,  
  11.                               String str)  
  12.                                  throws ConverterException {  
  13.         String[] strs = str.split(",");  
  14.         User user = new User();  
  15.         try {  
  16.             user.setFirstName(strs[0]);  
  17.             user.setLastName(strs[1]);  
  18.         }  
  19.         catch(Exception e) {  
  20.             // 转换错误,简单的抛出异常  
  21.             throw new ConverterException();  
  22.         }  
  23.   
  24.         return user;  
  25.     }  
  26.   
  27.     public String getAsString(FacesContext context,  
  28.                               UIComponent component,  
  29.                               Object obj)  
  30.                                  throws ConverterException {  
  31.         String firstName = ((User) obj).getFirstName();  
  32.         String lastName = ((User) obj).getLastName();  
  33.   
  34.         return firstName + "," + lastName;  
  35.     }  
  36.  }  

完成了转换器的制作,我们需要告诉JSF有这个事件,这是在faces-config.xml中完成注册:
faces-config.xml 代码
 
  1.  <?xml version="1.0"?>  
  2.  <!DOCTYPE faces-config PUBLIC  
  3.  "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"  
  4.  "http://java.sun.com/dtd/web-facesconfig_1_0.dtd">  
  5.   
  6.  <faces-config>  
  7.     <navigation-rule>  
  8.         <from-view-id>/*</from-view-id>  
  9.         <navigation-case>  
  10.             <from-outcome>show</from-outcome>  
  11.             <to-view-id>/pages/index.jsp</to-view-id>  
  12.         </navigation-case>  
  13.     </navigation-rule>  
  14.   
  15.     <converter>  
  16.         <converter-id>onlyfun.caterpillar.User</converter-id>  
  17.         <converter-class>  
  18.             onlyfun.caterpillar.UserConverter  
  19.         </converter-class>  
  20.     </converter>  
  21.   
  22.     <managed-bean>  
  23.         <managed-bean-name>guest</managed-bean-name>  
  24.         <managed-bean-class>  
  25.             onlyfun.caterpillar.GuestBean  
  26.         </managed-bean-class>  
  27.         <managed-bean-scope>session</managed-bean-scope>  
  28.     </managed-bean>  
  29.  </faces-config>  
     
注册转换器时,需要提供转换器识别(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识,例如:
index.jsp 代码
 
  1.  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>  
  2.  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>  
  3.  <%@page contentType="text/html;charset=Big5"%>  
  4.   
  5.  <f:view>  
  6.   
  7.  <html>  
  8.  <head>  
  9.  <title>自定义转换器</title>  
  10.  </head>  
  11.  <body>  
  12.   
  13.  Guest名称是:<b>  
  14.            <h:outputText value="#{guest.user}"  
  15.                    converter="onlyfun.caterpillar.User"/>  
  16.            </b>  
  17.     <h:form>  
  18.         <h:inputText id="userField"  
  19.                      value="#{guest.user}"  
  20.                      converter="onlyfun.caterpillar.User"/>  
  21.         <h:message for="userField" style="color:red"/>  
  22.         <br>  
  23.         <h:commandButton value="送出" action="show"/>  
  24.     </h:form>  
  25.  </body>  
  26.  </html> 
  27.  </f:view>

您也可以使用<f:converter>标签并使用converterId属性来指定转换器,例如:
JSF 代码
 
  1. <h:inputText id="userField" value="#{guest.user}">  
  2.      <f:converter converterId="onlyfun.caterpillar.User"/>  
  3. </h:inputText>  

除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法,例如:
GuestBean.java 代码
 
  1.  package onlyfun.caterpillar;  
  2.  import javax.faces.convert.Converter;  
  3.  public class GuestBean {  
  4.     private User user;  
  5.     private Converter converter = new UserConverter();  
  6.     public void setUser(User user) {  
  7.         this.user = user;  
  8.     }  
  9.     public User getUser() {  
  10.         return user;  
  11.     }  
  12.     public Converter getConverter() {  
  13.         return converter;  
  14.     }  
  15.  }  

之后可以直接结合JSF Expression Language来指定转换器:
JSF 代码
 
  1. <h:inputText id="userField"  
  2.      value="#{guest.user}"  
  3.      converter="#{guest.converter}"/>  
分享到:
评论
1 楼 genius 2011-09-23  
看到你这么一讲解,我一下子了解了。真是太感谢了。

相关推荐

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

    总的来说,JSF的自定义转换器和验证器允许开发者根据项目需求定制数据处理和验证逻辑,提高了代码的可重用性和灵活性。在实际开发中,你可能会遇到更复杂的转换和验证需求,例如处理多语言、处理自定义对象等。通过...

    jsf自定义组件的实现

    5. **配置文件**:`faces-config.xml`是JSF应用的核心配置文件,用于注册自定义组件,指定其类型和渲染器等信息。 ### 创建自定义组件的步骤 #### 第一步:实现标签库描述库 创建`ticker.tld`文件,定义自定义...

    编写JSF用户自定义UI组件(之五)

    在JSF(JavaServer Faces)框架中,用户自定义UI组件是实现个性化界面和扩展功能的关键部分。这篇博文“编写JSF用户自定义UI组件(之五)”可能深入探讨了如何创建和使用自定义组件的过程,虽然描述部分为空,但我们...

    《JSF自定义组件》

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

    JSF(转换器+验证器)

    3. 自定义转换器可以通过实现`javax.faces.convert.Converter`接口或使用`@FacesConverter`注解来创建。 4. `getAsString()`方法用于将模型对象转换为字符串,而`getAsObject()`方法则将用户输入的字符串转换回模型...

    jsf自定义组件.pdf

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

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

    在JSF中,可以自定义转换器,通过实现`javax.faces.convert.Converter`接口,或者使用`@FacesConverter`注解来标记一个类为转换器。 描述中提到的"convertTest"可能是一个示例项目或测试用例,用于演示如何创建和...

    jsf 自定义组件开发

    **JSF自定义组件开发详解** JavaServer Faces (JSF) 是一个用于构建Web应用程序的Java框架,它提供了一种模型-视图-控制器(MVC)架构来简化开发过程。在JSF中,自定义组件是扩展其功能的关键部分,允许开发者根据...

    JSF 转换器视频

    在"Jsf第六章.wrf"这个视频文件中,讲师很可能会演示如何在Myeclipse中创建一个简单的JSF项目,设置好环境后,他会逐步解释转换器的概念,编写一个自定义转换器的示例,展示如何注册和使用这个转换器,最后通过实际...

    创建JSF自定义组件

    本教程将深入探讨如何在JSF环境中创建自定义组件。 ### 1. 自定义组件概述 在JSF中,组件是UI的基本构建块,可以是简单的HTML元素,如按钮或输入框,也可以是复杂的组件,如表格或下拉菜单。自定义组件允许开发者...

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

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

    JSF自定义文件上传组件

    jsf官方实现默认是不支持multipart/form-data类型的表单的,为了使jsf能够解析multipart/form-data表单的数据,我参考了myfaces1.1的方式,然后按照commons-fileupload1.2重构了部分代码(myfaces1.1使用的是commons...

    JSF2.0实战 - 4、自定义组件

    渲染器负责将组件转换为浏览器可以理解的标记。在JSF中,渲染器类需要实现`javax.faces.render.Renderer`接口。例如,一个自定义组件的渲染器可能如下: ```java public class MyCustomComponentRenderer extends...

    JSF1.2自定义验证器的实现

    在JSF 1.2版本中,为了确保数据输入的正确性和一致性,开发者可以自定义验证器来实现特定的数据验证逻辑。本文将深入探讨如何在JSF 1.2中创建和使用自定义验证器。 自定义验证器是JSF中的一个重要特性,它允许...

    jsf实例lifecycle

    本光盘是《JSF编程实战导航》一书的配书光盘,内容包括了书中所有案例的源程序。 本光盘根目录下有14个文件夹,其内容和含义说明如下: (1)14个文件夹名对应于《JSF编程实战导航》中的章节序号,各章案例的源程序...

    jsf验证器与自定义验证

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

    JSF中自定义分页呈现器(Render)的实现和应用

    ### JSF中自定义分页呈现器的实现与应用 #### 概述 JavaServer Faces(简称JSF)作为一项强大的Web应用开发框架,为Java开发者提供了构建动态Web应用程序的有效手段。JSF的一个显著特点在于它能够实现业务逻辑与...

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

    开发者可以通过实现`javax.faces.convert.Converter`接口,或者使用预定义的转换器(如`javax.faces.convert.DateTimeConverter`)来创建自定义转换器。 转换器的使用通常涉及到以下步骤: 1. **声明转换器**: 在...

    JSF创建自定义组件

    【JSF创建自定义组件】 JSF(JavaServer Faces)是一种用于构建Web应用程序的MVC框架,它允许开发者创建可重用的UI组件。在JSF中,自定义组件允许开发人员扩展框架的功能,以满足特定项目的需求。下面将详细解释...

Global site tag (gtag.js) - Google Analytics