概述
如果需要將字段數(shù)據(jù)轉(zhuǎn)換為特定于應(yīng)用程序的值對象,則需要自定義數(shù)據(jù)轉(zhuǎn)換,如下面例子所示:
- String 轉(zhuǎn)換為 PhoneNumber 對象 (PhoneNumber.areaCode、PhoneNumber.prefix、 ...)。
- String 轉(zhuǎn)換為 Name 對象 (Name.first、Name.last)。
- String 轉(zhuǎn)換為 ProductCode 對象 (ProductCode.partNum、ProductCode.rev、 ...)。
要創(chuàng)建自定義轉(zhuǎn)換器,必須完成以步驟:
- (1)實現(xiàn)
Converter
接口(也就是javax.faxes.convert.Converter
)。
(2)也可以不實現(xiàn) Converter
接口, 不用注冊, 直接在Bean上取得轉(zhuǎn)換器的方法.
package onlyfun.caterpillar;
import javax.faces.convert.Converter;
public class GuestBean {
private User user;
private Converter converter = new UserConverter();
.........
public Converter getConverter() { return converter;
}
}
<h:inputText id="userField" value="#{guest.user}" converter="#{guest.converter}"/>
- 實現(xiàn) public Object getAsObject (FacesContext context, UIComponent component, String str) 方法: 它將接收由HTTP傳來的客戶端的字符串, 你可以將字符串轉(zhuǎn)換為你自定義的對象類型(例如,
PhoneNumber
), 并且你自定義的對象類型將自動綁定到你指定的托管Bean中, 此方法運行在驗證請求值階段.
- 實現(xiàn) public String getAsString (FacesContext context, UIComponent component, Object obj) 方法: 它將從你指定的托管Bean中得到對象, 你可以將其轉(zhuǎn)換為字符串, 由HTTP回傳給客戶端, 此方法運行在渲染響應(yīng)階段.
- 在
faces-config.xml
中注冊自定義轉(zhuǎn)換器。
<converter>
<converter-id>onlyfun.caterpillar.User</converter-id>
<converter-class>
onlyfun.caterpillar.UserConverter
</converter-class>
</converter>
- (1)用
<f:converter converterId="onlyfun.caterpillar.User"/>
標(biāo)簽在 JSP 中插入這個轉(zhuǎn)換器
(2.1)用 <h:inputText id="userField" value="#{guest.user}" converter="onlyfun.caterpillar.User"/>
(2.2)"onlyfun.caterpillar.User "也可以不實現(xiàn) Converter
接口,直接是托管Bean的方法來調(diào)用轉(zhuǎn)換.
在圖 7 中,JSF 在應(yīng)用請求值階段調(diào)用自定義轉(zhuǎn)換器的 getAsObject
方法。轉(zhuǎn)換器在這里將請求字符串轉(zhuǎn)換為所需的對象類型,然后返回這個對象,將它存儲在相應(yīng)的 JSF 組件中。如果該值被返回呈現(xiàn)在視圖中,那么 JSF 將在呈現(xiàn)響應(yīng)階段調(diào)用 getAsString
方法。這意味著轉(zhuǎn)換器還要負(fù)責(zé)將對象數(shù)據(jù)轉(zhuǎn)換回字符串表示形式。
圖 7. 自定義轉(zhuǎn)換器 getAsObject 和 getAsString 方法

*******************************************************************************************
我們將使用一個案例分析來展示 Converter
接口、getAsObject
和 getAsString
方法的實現(xiàn),同時還將展示如何在 Faces
上下文中注冊這個轉(zhuǎn)換器。
這個案例分析的目的是將一個字符串值轉(zhuǎn)換為一個 PhoneNumber
對象。我們將一步一步地完成這個轉(zhuǎn)換過程。
import javax.faces.convert.Converter; import org.apache.commons.lang.StringUtils; ... public class PhoneConverter implements Converter { ... } |
這一步將一個字符串轉(zhuǎn)換為一個 PhoneNumber
對象。
public class PhoneConverter implements Converter { ... public Object getAsObject(FacesContext context, UIComponent component, String value) { if (StringUtils.isEmpty(value)){ return null;} PhoneNumber phone = new PhoneNumber(); String [] phoneComps = StringUtils.split(value," ,()-"); String countryCode = phoneComps[0]; phone.setCountryCode(countryCode); if ("1".equals(countryCode)){ String areaCode = phoneComps[1]; String prefix = phoneComps[2]; String number = phoneComps[3]; phone.setAreaCode(areaCode); phone.setPrefix(prefix); phone.setNumber(number); }else { phone.setNumber(value); } return phone; } } |
這一步將一個 PhoneNumber
對象轉(zhuǎn)換為一個字符串。
public class PhoneConverter implements Converter { ... public String getAsString(FacesContext context,UIComponent component, Object value) { return value.toString(); } } public class PhoneNumber implements Serializable { ... public String toString(){ if (countryCode.equals("1")){ return countryCode + " " + areaCode + " " + prefix + " " + number; }else{ return number; } } } |
第 4 步:在 faces 上下文中注冊自定義轉(zhuǎn)換器
第 4 步可以以兩種方式執(zhí)行。第一種選擇使用(比如)arcmind.PhoneConverter
的 id 來注冊 PhoneConverter
類。JSP 頁中的 <f:converter/>
標(biāo)簽會使用這個 id。下面是第 4 步的選項 1 的代碼:
<converter> <converter-id>arcmind.PhoneConverter</converter-id> <converter-class>com.arcmind.converters.PhoneConverter</converter-class> </converter> |
另一種方法是注冊 PhoneConverter
類來自動處理所有 PhoneNumber
對象,如下所示。
<converter> <converter-for-class>com.arcmind.value.PhoneNumber</converter-for-class> <converter-class>com.arcmind.converters.PhoneConverter</converter-class> </converter> |
第 5 步:在 JSP 中使用轉(zhuǎn)換器標(biāo)簽?
自然,下一步的執(zhí)行取決于所選的注冊方法。如果選擇使用 arcmind.PhoneConverter
的 id 來注冊 PhoneConverter
類,那么就使用 <f:converter/>
標(biāo)簽,如下所示。
<h:inputText id="phone" value="#{UserRegistration.user.phone}"> <f:converter converterId="arcmind.PhoneConverter" /> </h:inputText> |
如果選擇注冊 PhoneConverter
類來自動 處理所有 PhoneNumber
,那么就不需要在 JSP 頁中使用 <f:converter/>
標(biāo)簽。下面是第 5 步的不帶轉(zhuǎn)換器標(biāo)簽的代碼。
<h:inputText id="phone" value="#{UserRegistration.user.phone}"> [Look mom no converter!] </h:inputText> |
這樣,我們已經(jīng)完成了這個示例應(yīng)用程序的轉(zhuǎn)換處理代碼!到目前為止完成的應(yīng)用程序如下所示。
圖 8. 帶有轉(zhuǎn)換處理的示例應(yīng)用程序
