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类:
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类:

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属性来指定转换器,例如:
<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来指定转换器:
<h:inputText id="userField"
     value="#{guest.user}"
     converter="#{guest.converter}"/> 

 

转载自网络

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值