JSF入门十(自定义转换器)

本文参考

http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2630

 

除了使用标准的转换器之外,您还可以自行定制您的转换器,您可以实现javax.faces.convert.Converter接口,这个接口有两个要实现的方法:

Java代码   收藏代码
  1. public Object getAsObject(FacesContext context,UIComponent component,String str);  
  2. public String getAsString(FacesContext context,UIComponent component,Object obj);  

简单的说,第一个方法会接收从客户端经由HTTP传来的字符串数据,您在第一个方法中将之转换为您的自定义对象,这个自定义对象将会自动设定给您指定的Bean对象;第二个方法就是将从您的Bean对象得到的对象转换为字符串,如此才能藉由HTTP传回给客户端。
直接以一个简单的例子来作说明,假设您有一个User类:

Java代码   收藏代码
  1. package bruce.zhao.model;  
  2.   
  3. public class User {  
  4.     private String firstName;  
  5.     private String lastName;  
  6.   
  7.     public String getFirstName() {  
  8.         return firstName;  
  9.     }  
  10.   
  11.     public void setFirstName(String firstName) {  
  12.         this.firstName = firstName;  
  13.     }  
  14.   
  15.     public String getLastName() {  
  16.         return lastName;  
  17.     }  
  18.   
  19.     public void setLastName(String lastName) {  
  20.         this.lastName = lastName;  
  21.     }  
  22. }  

 这个User类是我们转换器的目标对象,而您有一个GuestBean类:

Java代码   收藏代码
  1. package bruce.zhao.model;  
  2.   
  3. public class GuestBean {  
  4.     private User user;  
  5.   
  6.     public void setUser(User user) {  
  7.         this.user = user;  
  8.     }  
  9.   
  10.     public User getUser() {  
  11.         return user;  
  12.     }  
  13. }  

 这个Bean上的属性直接传回或接受User类型的参数,我们来实现一个简单的转换器,为HTTP字符串与User对象进行转换:

Java代码   收藏代码
  1. package bruce.zhao.model;  
  2.   
  3. import javax.faces.component.UIComponent;  
  4. import javax.faces.context.FacesContext;  
  5. import javax.faces.convert.Converter;  
  6. import javax.faces.convert.ConverterException;  
  7.   
  8. public class UserConverter implements Converter {  
  9.     public Object getAsObject(FacesContext context, UIComponent component,  
  10.             String str) throws ConverterException {  
  11.         String[] strs = str.split(",");  
  12.         User user = new User();  
  13.         try {  
  14.             user.setFirstName(strs[0]);  
  15.             user.setLastName(strs[1]);  
  16.         } catch (Exception e) {  
  17.             // 转换错误,简单的丢出例外  
  18.             throw new ConverterException();  
  19.         }  
  20.         return user;  
  21.     }  
  22.   
  23.     public String getAsString(FacesContext context, UIComponent component,  
  24.             Object obj) throws ConverterException {  
  25.         String firstName = ((User) obj).getFirstName();  
  26.         String lastName = ((User) obj).getLastName();  
  27.         return firstName + "," + lastName;  
  28.     }  
  29. }  

 实现完成这个转换器,我们要告诉JSF这件事,这是在faces-config.xml中完成注册:

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  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. <faces-config>  
  6.     <navigation-rule>  
  7.         <from-view-id>/*</from-view-id>  
  8.         <navigation-case>  
  9.             <from-outcome>show</from-outcome>  
  10.             <to-view-id>/pages/index.jsp</to-view-id>  
  11.         </navigation-case>  
  12.     </navigation-rule>  
  13.     <converter>  
  14.         <converter-id>bruce.zhao.model.User</converter-id>  
  15.         <converter-class>  
  16.             bruce.zhao.model.UserConverter  
  17.     </converter-class>  
  18.     </converter>  
  19.     <managed-bean>  
  20.         <managed-bean-name>guest</managed-bean-name>  
  21.         <managed-bean-class>  
  22.             bruce.zhao.model.GuestBean  
  23.     </managed-bean-class>  
  24.         <managed-bean-scope>session</managed-bean-scope>  
  25.     </managed-bean>  
  26. </faces-config>  

 注册转换器时,需提供转换器标识(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识,例如:

Html代码   收藏代码
  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=GB2312"%>  
  4. <f:view>  
  5.     <html>  
  6.     <head>  
  7.     <title>自定义转换器</title>  
  8.     </head>  
  9.     <body>  
  10.     Guest名称是:  
  11.     <b> <h:outputText value="#{guest.user}"  
  12.         converter="bruce.zhao.model.User" /> </b>  
  13.     <h:form>  
  14.         <h:inputText id="userField" value="#{guest.user}"  
  15.             converter="bruce.zhao.model.User" />  
  16.         <h:message for="userField" style="color:red" />  
  17.         <br>  
  18.         <h:commandButton value="送出" action="show" />  
  19.     </h:form>  
  20.     </body>  
  21.     </html>  
  22. </f:view>  

 您也可以<f:converter>标签并使用converterId属性来指定转换器,例如:

Html代码   收藏代码
  1. <h:inputText id="userField" value="#{guest.user}">  
  2. <f:converter converterId="bruce.zhao.model.User"/>  
  3. </h:inputText>  

 除了向JSF注册转换器之外,还有一个方式可以不用注册,就是直接在Bean上提供一个取得转换器的方法,例如:

Java代码   收藏代码
  1. public class GuestBean {  
  2. private User user;  
  3. private Converter converter = new UserConverter();  
  4. public void setUser(User user) {  
  5. this.user = user;  
  6. }  
  7. public User getUser() {  
  8. return user;  
  9. }  
  10. public Converter getConverter() {  
  11. return converter;  
  12. }  
  13. }  

 之后可以直接结合 JSF Expression Language 来指定转换器:

Html代码   收藏代码
  1. <h:inputText id="userField" value="#{guest.user}" converter="#{guest.converter}"/> 

你可能感兴趣的:(JSF)