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>