JSF自定义转换器[ZT]

可以制作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}"/>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值