隨筆-9  評論-168  文章-266  trackbacks-0

          概述

          如果需要將字段數(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. (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}"/>
          1. 實現(xiàn) public Object getAsObject (FacesContext context, UIComponent component, String str)  方法:  它將接收由HTTP傳來的客戶端的字符串,  你可以將字符串轉(zhuǎn)換為你自定義的對象類型(例如,PhoneNumber),  并且你自定義的對象類型將自動綁定到你指定的托管Bean中,  此方法運行在驗證請求值階段.

          2. 實現(xiàn) public String getAsString (FacesContext context, UIComponent component, Object obj) 方法:  它將從你指定的托管Bean中得到對象,  你可以將其轉(zhuǎn)換為字符串,  由HTTP回傳給客戶端,  此方法運行在渲染響應(yīng)階段.

          3. faces-config.xml 中注冊自定義轉(zhuǎn)換器。
                <converter>
                    <converter-id>onlyfun.caterpillar.User</converter-id>
                       <converter-class>
                           onlyfun.caterpillar.UserConverter
                       </converter-class>
                </converter>

          4. (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 方法
           

          *******************************************************************************************

          創(chuàng)建自定義轉(zhuǎn)換器

          我們將使用一個案例分析來展示 Converter 接口、getAsObjectgetAsString 方法的實現(xiàn),同時還將展示如何在 Faces 上下文中注冊這個轉(zhuǎn)換器。

          這個案例分析的目的是將一個字符串值轉(zhuǎn)換為一個 PhoneNumber 對象。我們將一步一步地完成這個轉(zhuǎn)換過程。

          第 1 步:實現(xiàn) Converter 接口

          import javax.faces.convert.Converter;
                      import org.apache.commons.lang.StringUtils;
                      ...
                      public class PhoneConverter implements Converter {
                      ...
                      }
                      

          第 2 步:實現(xiàn) getAsObject 方法

          這一步將一個字符串轉(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;
                      }
                      }
                      

          第 3 步:實現(xiàn) getAsString 方法

          這一步將一個 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)用程序
          帶有轉(zhuǎn)換處理的示例應(yīng)用程序
          posted on 2007-10-23 17:17 紫蝶∏飛揚↗ 閱讀(795) 評論(0)  編輯  收藏 所屬分類: JSF
          主站蜘蛛池模板: 安塞县| 龙陵县| 商都县| 溆浦县| 贡山| 浏阳市| 工布江达县| 浦北县| 阜宁县| 平乐县| 永靖县| 疏勒县| 海淀区| 青川县| 广元市| 开平市| 邹平县| 沂南县| 南京市| 蕉岭县| 黄陵县| 武汉市| 临高县| 林口县| 仲巴县| 安阳县| 西城区| 镇平县| 梅河口市| 丰原市| 比如县| 勃利县| 信阳市| 高陵县| 阳原县| 都江堰市| 陈巴尔虎旗| 仁寿县| 浑源县| 伊春市| 富锦市|