javax.faces.convert パッケージに存在するのが標準コンバータである。
基本的な型に対しては自動的に使用される。
DateTimeConverterとNumberConverterは専用のタグが提供されている。
<f:convertDateTime>タグ
<h:inputText id="date1" value="#{data1Bean.date1 }">
<f:convertDateTime pattern="yyyy-MM-dd"/>
</h:inputText><br/>
<h:message for="date1" styleClass="RED" showSummary="true" showDetail="false"/>
Myfacesを使用している場合はmyfaces-imple-1.2.x.jarのjavax/faces/Messages_ja.propertiesファイル javax.faces.component.UIInput.CONVERSIONのメッセージが表示される。
例)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へ変換する処理を記述
}
}
<converter>
<converter-id>sampleConverter</converter-id>
<converter-class>myPackage.converter.SampleConverter</converter-class>
</converter>
myBeanの属性sampleValueの型はMyClassとする。
<h:inputText value="#{myBean.sampleValue}" converter="sampleConverter" />
または
<h:inputText value="#{myBean.sampleValue}">
<f:converter converterId="sampleConverter"/>
</h:inputText>
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");
パラメータはコンバート実行時にはプロパティparam1にセットされている。
private String param1;
public String setParam1(String param1) {
this.param1 = param1;
}
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;
}
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;
}
}
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>
WEB-INF/tlds/フォルダにSample.tldファイルを配置した場合。
<taglib>
<taglib-uri>/WEB-INF/tlds/Sample</taglib-uri>
<taglib-location>/WEB-INF/tlds/Sample.tld</taglib-location>
</taglib>
<%@taglib prefix="s" uri="/WEB-INF/tlds/Sample" %>
<h:inputText value="#{bean1.value1}">
<s:sampleConverter param1="わお" />
</h:inputText>