rss· 投稿· 设为首页· 加入收藏· 繁體版

JSF自定义转换器

javax.faces.convert.Comverter接口自定义验证器,
  • public Object getAsObject(FacesContext context,  
  •                            UIComponent component,  
  •                            String str);  
  • public String getAsString(FacesContext context,  
  •                            UIComponent component,  
  •                            Object obj);  

  • 简单的说,第一个方法会接收从客户端经过HTTP传来的字符串信息,在第一个方法中将要转换的内容转换成自定义的组件,这个自定义组件将会自动设定给你指定的Bean组件;第二个方法就是将从你的Bean组件得到组件的转换字符串,如此才能­由HTTP传回
    给客户端。直接以一个简单的例子来说明。假设你有一个User类:
    java 代码  
  • User.java  
  • User.java  
  • package onlyfun.caterpillar;  
  •  public class User {  
  •     private String firstName;  
  •     private String lastName;  
  •     public String getFirstName() {  
  •         return firstName;  
  •     }  
  •     public void setFirstName(String firstName) {  
  •         this.firstName = firstName;  
  •     }  
  •     public String getLastName() {  
  •         return lastName;  
  •     }  
  •     public void setLastName(String lastName) {  
  •         this.lastName = lastName;  
  •     }  
  •  }  

  • 这个User类时我们转换器的目标组件,我们也有一个GuestBean类:
    java 代码  
  • GuestBean.java  
  • package onlyfun.caterpillar;  
  •  public class GuestBean {  
  •     private User user;  
  •     public void setUser(User user) {  
  •         this.user = user;  
  •     }  
  •     public User getUser() {  
  •         return user;  
  •     }  
  •  }  

  • 这个Bean上的属性直接传回或接受User类型的参数,我们作一个简单的转换器,为HTTP字符串与User组件进行转换:
    UserConverter.java 代码  
  •  package onlyfun.caterpillar;  
  •  import javax.faces.component.UIComponent;  
  •  import javax.faces.context.FacesContext;  
  •  import javax.faces.convert.Converter;  
  •  import javax.faces.convert.ConverterException;  
  •   
  •  //转换器需要实现(继承) javax.faces.convert.Converter  
  •  public class UserConverter implements Converter {  
  •     public Object getAsObject(FacesContext context,  
  •                               UIComponent component,  
  •                               String str)  
  •                                  throws ConverterException {  
  •         String[] strs = str.split(",");  
  •         User user = new User();  
  •         try {  
  •             user.setFirstName(strs[0]);  
  •             user.setLastName(strs[1]);  
  •         }  
  •         catch(Exception e) {  
  •             // 转换错误,简单的抛出异常  
  •             throw new ConverterException();  
  •         }  
  •   
  •         return user;  
  •     }  
  •   
  •     public String getAsString(FacesContext context,  
  •                               UIComponent component,  
  •                               Object obj)  
  •                                  throws ConverterException {  
  •         String firstName = ((User) obj).getFirstName();  
  •         String lastName = ((User) obj).getLastName();  
  •   
  •         return firstName + "," + lastName;  
  •     }  
  •  }  

  • 完成了转换器的制作,我们需要告诉JSF有这个事件,这是在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>  
  •     <navigation-rule>  
  •         <from-view-id>/*</from-view-id>  
  •         <navigation-case>  
  •             <from-outcome>show</from-outcome>  
  •             <to-view-id>/pages/index.jsp</to-view-id>  
  •         </navigation-case>  
  •     </navigation-rule>  
  •   
  •     <converter>  
  •         <converter-id>onlyfun.caterpillar.User</converter-id>  
  •         <converter-class>  
  •             onlyfun.caterpillar.UserConverter  
  •         </converter-class>  
  •     </converter>  
  •   
  •     <managed-bean>  
  •         <managed-bean-name>guest</managed-bean-name>  
  •         <managed-bean-class>  
  •             onlyfun.caterpillar.GuestBean  
  •         </managed-bean-class>  
  •         <managed-bean-scope>session</managed-bean-scope>  
  •     </managed-bean>  
  •  </faces-config>  
  •      
    注册转换器时,需要提供转换器识别(Converter ID)与转换器类,接下来要在JSF页面中使用转换器的话,就是指定所要使用的转换器标识,例如:
    index.jsp 代码  
  •  <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>  
  •  <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>  
  •  <%@page contentType="text/html;charset=Big5"%>  
  •   
  •  <f:view>  
  •   
  •  <html>  
  •  <head>  
  •  <title>自定义转换器</title>  
  •  </head>  
  •  <body>  
  •   
  •  Guest名称是:<b>  
  •            <h:outputText value="#{guest.user}"  
  •                    converter="onlyfun.caterpillar.User"/>  
  •            </b>  
  •     <h:form>  
  •         <h:inputText id="userField"  
  •                      value="#{guest.user}"  
  •                      converter="onlyfun.caterpillar.User"/>  
  •         <h:message for="userField" style="color:red"/>  
  •         <br>  
  •         <h:commandButton value="送出" action="show"/>  
  •     </h:form>  
  •  </body>  
  •  </html> 
  •  </f:view>

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

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

  • 之后可以直接结合JSF Expression Language来指定转换器:
    JSF 代码  
  • <h:inputText id="userField"  
  •      value="#{guest.user}"  
  •      converter="#{guest.converter}"/>  
  • 顶一下
    (0)
    踩一下
    (0)