JSFの覚書

|JSFの覚書メニューへ|


コンバータ

1.標準コンバータ

javax.faces.convert パッケージに存在するのが標準コンバータである。
基本的な型に対しては自動的に使用される。
DateTimeConverterとNumberConverterは専用のタグが提供されている。

1.1 DateTimeConverter

<f:convertDateTime>タグ

Myfacesを使用している場合はmyfaces-imple-1.2.x.jarのjavax/faces/Messages_ja.propertiesファイル javax.faces.component.UIInput.CONVERSIONのメッセージが表示される。

2.カスタムコンバータ

2.1 コンバータクラスの作成

1) javax.faces.convert.Converterインターフェースを実装したクラスを作成する。

例)SampleConverter.java

package myPackage.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;

/**
 * SAMPLEコンバータ
 *
 */
public class SampleConverter implements Converter{
    /**
     * 入力をMyClassに変換
     */
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        MyClass myClass = valueをMyClassへ変換する処理を記述
        
        return myClass;
    }

    /**
     * MyClassをStringに変換
     */
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null) return null;

        MyClass myClass = (MyClass)value;

        return myClassをStringへ変換する処理を記述
    }

}

2) faces-config.xmlに登録

    <converter>
        <converter-id>sampleConverter</converter-id>

        <converter-class>myPackage.converter.SampleConverter</converter-class>
    </converter>

3) 使用例

myBeanの属性sampleValueの型はMyClassとする。

<h:inputText value="#{myBean.sampleValue}" converter="sampleConverter" />

または

<h:inputText value="#{myBean.sampleValue}">
    <f:converter converterId="sampleConverter"/>
</h:inputText>

2.2 パラメータ指定

2.2.1 f:attributeタグ使用してパラメータを指定する方法

param1という名前で"パラメータの値"という値を渡す場合。

<h:inputText value="#{bean1.value1}">

    <f:converter converterId="sampleConverter"/>
    <f:attribute name="param1" value="パラメータの値"/>
</h:inputText>

コンバータで以下のようにパラメータを取り出す。

Map attrMap = component.getAttributes();
param = attrMap.get("param1");

2.2.2 カスタムコンバータタグを作成し、パラメータを指定する方法

1) コンバータクラスにパラメータを受け取るためのプロパティとセッターメソッドを追加する。

パラメータはコンバート実行時にはプロパティparam1にセットされている。

private String param1;
public String setParam1(String param1) {
    this.param1 = param1;
}
2) コンバータクラスにjavax.faces.component.StateHolderの実装を追加する。
public class SampleConverter implements Converter, StateHolder{

    public Object saveState(FacesContext context) {
        // パラメータをシリアライズ可能なクラスに格納して返す。
        // この場合はそのまま返せるので、そのまま返す。
        return param1;
    }

    public void restoreState(FacesContext context, Object state) {
        // saveStateメソッドの逆の処理
        param1 = (String)state;
    }

    private boolean transientFlg;
    public boolean isTransient() {
        return transientFlg;
    }
    public void setTransient(boolean newTransientValue) {
        transientFlg = newTransientValue;
    }
3) カスタムタグクラスを作成する。
public class SampleConverterTag extends ConverterELTag{
    // パラメータ受け取り用
    private String param1;
    public void setParam1(String param1) {
        this.param1 = param1;
    }
    // オーバーライドする。
    protected Converter createConverter() throws JspException {
        // コンバータ生成
        SampleConverter converter = (SampleConverter)FacesContext.getCurrentInstance().getApplication()
                     .createConverter("sampleConverter");
        // パラメータ設定
        converter.setParam1(param1);
        return converter;
    }
}
4) TLDファイルを作成する。

Sample.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

  <tlib-version>1.0</tlib-version>
  <short-name>sample</short-name>
  <uri>/WEB-INF/tlds/Sample</uri>

   <tag>
       <name>sampleConverter</name>
       <tag-class>com.ziqoo.faces.converter.SampleConverterTag</tag-class>
       <attribute>
           <name>param1</name>

           <required>false</required>
       </attribute>
   </tag>
</taglib>
5) web.xmlファイルにTLDファイルの設定を追加する。

WEB-INF/tlds/フォルダにSample.tldファイルを配置した場合。

    <taglib>
        <taglib-uri>/WEB-INF/tlds/Sample</taglib-uri>
        <taglib-location>/WEB-INF/tlds/Sample.tld</taglib-location>
    </taglib>

6) 使用例
<%@taglib prefix="s"  uri="/WEB-INF/tlds/Sample" %>

    <h:inputText value="#{bean1.value1}">
        <s:sampleConverter param1="わお" />
    </h:inputText>