<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    概述

    如果需要將字段數據轉換為特定于應用程序的值對象,則需要自定義數據轉換,如下面例子所示:

    • String 轉換為 PhoneNumber 對象 (PhoneNumber.areaCode、PhoneNumber.prefix、 ...)。
    • String 轉換為 Name 對象 (Name.first、Name.last)。
    • String 轉換為 ProductCode 對象 (ProductCode.partNum、ProductCode.rev、 ...)。

    要創建自定義轉換器,必須完成以步驟:

    1. (1)實現 Converter 接口(也就是 javax.faxes.convert.Converter)。

              (2)也可以不實現 Converter 接口,  不用注冊,  直接在Bean上取得轉換器的方法.
                       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. 實現 public Object getAsObject (FacesContext context, UIComponent component, String str)  方法:  它將接收由HTTP傳來的客戶端的字符串,  你可以將字符串轉換為你自定義的對象類型(例如,PhoneNumber),  并且你自定義的對象類型將自動綁定到你指定的托管Bean中,  此方法運行在驗證請求值階段.

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

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

    4. (1)用 <f:converter converterId="onlyfun.caterpillar.User"/> 標簽在 JSP 中插入這個轉換器

              (2.1)用 <h:inputText id="userField" value="#{guest.user}" converter="onlyfun.caterpillar.User"/>
     
              (2.2)"onlyfun.caterpillar.User "也可以不實現 Converter 接口,直接是托管Bean的方法來調用轉換.

    在圖 7 中,JSF 在應用請求值階段調用自定義轉換器的 getAsObject 方法。轉換器在這里將請求字符串轉換為所需的對象類型,然后返回這個對象,將它存儲在相應的 JSF 組件中。如果該值被返回呈現在視圖中,那么 JSF 將在呈現響應階段調用 getAsString 方法。這意味著轉換器還要負責將對象數據轉換回字符串表示形式。


    圖 7. 自定義轉換器 getAsObject 和 getAsString 方法
     

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

    創建自定義轉換器

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

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

    第 1 步:實現 Converter 接口

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

    第 2 步:實現 getAsObject 方法

    這一步將一個字符串轉換為一個 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 步:實現 getAsString 方法

    這一步將一個 PhoneNumber 對象轉換為一個字符串。

    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 上下文中注冊自定義轉換器

    第 4 步可以以兩種方式執行。第一種選擇使用(比如)arcmind.PhoneConverter 的 id 來注冊 PhoneConverter 類。JSP 頁中的 <f:converter/> 標簽會使用這個 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 中使用轉換器標簽?

    自然,下一步的執行取決于所選的注冊方法。如果選擇使用 arcmind.PhoneConverter 的 id 來注冊 PhoneConverter 類,那么就使用 <f:converter/> 標簽,如下所示。

    <h:inputText id="phone" value="#{UserRegistration.user.phone}">
                <f:converter  converterId="arcmind.PhoneConverter" />
                </h:inputText>
                

    如果選擇注冊 PhoneConverter 類來自動 處理所有 PhoneNumber,那么就不需要在 JSP 頁中使用 <f:converter/> 標簽。下面是第 5 步的不帶轉換器標簽的代碼。

    <h:inputText id="phone" value="#{UserRegistration.user.phone}">
                [Look mom no converter!]
                </h:inputText>
                

    這樣,我們已經完成了這個示例應用程序的轉換處理代碼!到目前為止完成的應用程序如下所示。


    圖 8. 帶有轉換處理的示例應用程序
    帶有轉換處理的示例應用程序
    posted on 2007-10-23 17:17 紫蝶∏飛揚↗ 閱讀(790) 評論(0)  編輯  收藏 所屬分類: JSF
    主站蜘蛛池模板: 小日子的在线观看免费| 韩国免费a级作爱片无码| 精品国产sm捆绑最大网免费站| 亚洲色婷婷六月亚洲婷婷6月| 一区在线免费观看| 亚洲一区二区三区自拍公司| 国产一区二区三区免费观在线| 亚洲情XO亚洲色XO无码| 野花香高清在线观看视频播放免费| 亚洲成A∨人片在线观看不卡| 久久中文字幕免费视频| 亚洲资源在线视频| 国产精品视频永久免费播放| 亚洲人成色99999在线观看| 国产在线19禁免费观看| 一级一级毛片免费播放| 久久精品国产亚洲av麻| 99爱在线精品免费观看| 欧美激情综合亚洲一二区| 亚洲成a人片在线观看日本麻豆| 皇色在线免费视频| 亚洲免费视频在线观看| 成人免费午夜视频| 色婷婷综合缴情综免费观看| 亚洲欧洲日产国码无码网站| 成人福利免费视频| 免费无码又爽又黄又刺激网站| 亚洲午夜未满十八勿入网站2| 精品国产免费一区二区三区香蕉 | 日韩一级免费视频| 人妻仑乱A级毛片免费看| 无码专区—VA亚洲V天堂| 成人免费一区二区无码视频| 亚州**色毛片免费观看| 麻豆亚洲AV永久无码精品久久 | 三年片在线观看免费观看大全中国| 亚洲午夜国产精品无码| 最近最新MV在线观看免费高清| 污污视频网站免费观看| 亚洲精品国产福利片| 免费一级毛片免费播放|