JSF转换2

一、       电话号码类

客户所输入的一串数字,由于采用”-“进行连接,因此只能存为一串string,此时可以采用自己定义的转换器进行格式转换(当然,读者也许能找到现成的转换器,但本例在于说明如何自定义转换器)。

先定义电话号码类:PhoneNumber.java

package com.sterning.converters;

import java.io.Serializable;

public class PhoneNumber implements Serializable
{
    private int countryCode;
    private int areaCode;
    private long number;       

    public PhoneNumber()
    {   
    }

    public PhoneNumber(int countryCode, int areaCode, long number)
    {
        this.setCountryCode(countryCode);
        this.setAreaCode(areaCode);
        this.setNumber(number);               
    }

    public int getCountryCode()
    {
        return countryCode;
    }

    public void setCountryCode(int countryCode)
    {
        this.countryCode = countryCode;
    }

    public int getAreaCode()
    {
        return areaCode;
    }

    public void setAreaCode(int areaCode)
    {
        this.areaCode = areaCode;
    }

    public long getNumber()
    {
        return number;
    }

    public void setNumber(long number)
    {
        this.number = number;
    }
}

 
二、       定义转换器

所有的转换器必须实现接口Converter,同时必须重写getAsObject()和 getAsString()方法。getAsObject()方法在用户输入了合法的数据,并按下提交按钮后触发。getAsString()在渲染阶段触发,主要用于向客户展示数据。

package com.sterning.converters;

import java.util.StringTokenizer;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;

public class PhoneNumberConverter implements Converter
{

    public PhoneNumberConverter()
    {
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {

        if (value == null || (value.trim().length() == 0))
        {
            return value;
        }

        PhoneNumber phoneNumber = new PhoneNumber();
        boolean conversionError = false;

        int hyphenCount = 0;
        StringTokenizer hyphenTokenizer = new StringTokenizer(value, "-");
        while (hyphenTokenizer.hasMoreTokens())
        {
            String token = hyphenTokenizer.nextToken();
            try
            {
                if (hyphenCount == 0)
                {  
                    phoneNumber.setCountryCode(Integer.parseInt(token));
                }

                if (hyphenCount == 1)
                {
                    phoneNumber.setAreaCode(Integer.parseInt(token));
                }

                if (hyphenCount == 2)
                {
                    phoneNumber.setNumber(Long.parseLong(token));
                }
                hyphenCount ++;      
            }
            catch (Exception exception)
            {
                conversionError = true;
            }
        }

        if (conversionError || (hyphenCount != 3))
        {
            throw new ConverterException();
        }

        return phoneNumber;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        PhoneNumber phoneNumber = null;

        if (value instanceof PhoneNumber)
        {
            phoneNumber = (PhoneNumber)value;

            StringBuilder phoneNumberAsString = new StringBuilder();
            phoneNumberAsString.append(phoneNumber.getCountryCode() + "-");
            phoneNumberAsString.append(phoneNumber.getAreaCode() + "-");
            phoneNumberAsString.append(phoneNumber.getNumber());
            return phoneNumberAsString.toString();
        }
        return "";
    }
}

 

 
三、       Bean类

 这里做的事情比较简单,将用户输入的非格式的电话号码,按一定的格式在客户端展示出来。

package com.sterning.converters;

import java.util.*;
import javax.faces.application.*;
import javax.faces.component.*;
import javax.faces.component.html.*;
import javax.faces.context.*;
import javax.faces.event.*;

import com.sterning.converters.PhoneNumber;

public class PhoneNumberBean
{
  private HtmlPanelGrid controlPanel;
  private PhoneNumber phoneNumber;

  public HtmlPanelGrid getControlPanel()
  {
    return controlPanel;
  }

  public void setControlPanel(HtmlPanelGrid controlPanel)
  {
    this.controlPanel = controlPanel;
  }

  public void addControls(ActionEvent actionEvent)
  {
    UIViewRoot view = FacesContext.getCurrentInstance().getViewRoot();
    Application application = FacesContext.getCurrentInstance().getApplication();
    List children = controlPanel.getChildren();
    children.clear();

    HtmlOutputText out1=(HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    out1.setValue(" " + phoneNumber.getCountryCode() + " ");
    out1.setStyle("color: blue");
    children.add(out1);
   
    HtmlOutputText out4=(HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    out4.setValue(" - ");
    out4.setStyle("color: blue");
    children.add(out4);
   
    HtmlOutputText out2=(HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    out2.setValue(" " + phoneNumber.getAreaCode() + " ");
    out2.setStyle("color: blue");
    children.add(out2);
   
    HtmlOutputText out5=(HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    out5.setValue(" - ");
    out5.setStyle("color: blue");
    children.add(out5);
   
    HtmlOutputText out3=(HtmlOutputText)application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    out3.setValue(" " + phoneNumber.getNumber() + " ");
    out3.setStyle("color: blue");
    children.add(out3);

  }

public PhoneNumber getPhoneNumber() {
    return phoneNumber;
}

public void setPhoneNumber(PhoneNumber phoneNumber) {
    this.phoneNumber = phoneNumber;
}
}

 
四、       注册转换器

在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>
   
    <converter>
        <description>A Converter for phone number</description>
        <converter-id>PhoneNumberConverter</converter-id>
        <converter-class>
            com.sterning.converters.PhoneNumberConverter
        </converter-class>
    </converter>


  <managed-bean>
    <description>The one and only phoneNumberBean.</description>
    <managed-bean-name>phoneNumberBean</managed-bean-name>
    <managed-bean-class>com.sterning.converters.PhoneNumberBean
    </managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
 

</faces-config>

 
同时,别忘了配置web.xml哦

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <display-name>JSF</display-name>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>faces/index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

五、       编写页面

 

Index.jsp页面比较简单:如下

<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>

<f:view>
    <html>
        <head>
            <title>JSF自定义转换器示例</title>
        </head>
        <body>
            <h:form id="welcomeForm">
                <h:outputText id="welcomeOutput" value="JSF自定义转换器示例!"
                    style="font-family: Arial, sans-serif; font-size: 24; color: green;" />
                <p>
                    <h:message id="errors" for="helloInput" style="color: red" />
                </p>
                <p>
                    <h:outputLabel for="helloInput">
                        <h:outputText id="helloInputLabel"
                            value="请输入一个完整的电话,(国家代码-区号-号码):" />
                    </h:outputLabel>
                    <h:inputText id="phoneNumberInput"
                        value="#{phoneNumberBean.phoneNumber}" required="true">
                        <f:converter converterId="PhoneNumberConverter"></f:converter>
                    </h:inputText>

                    <h:commandButton id="redisplayCommand" type="submit" value="提交"
                        actionListener="#{phoneNumberBean.addControls}" />
                </p>
                <p>
                    <h:panelGrid id="controlPanel"
                        binding="#{phoneNumberBean.controlPanel}" columns="20" border="1"
                        cellspacing="0" />
                </p>


            </h:form>
        </body>
    </html>
</f:view>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值