<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
    主站蜘蛛池模板: 亚洲AV成人精品一区二区三区| 青草久久精品亚洲综合专区| 国产免费AV片在线观看播放| 国产在线98福利播放视频免费| 亚洲国产成人久久综合| 国产精品视频永久免费播放| 国产成人精品日本亚洲专| 日韩精品福利片午夜免费观着| 中文字幕在线日亚洲9| 成人免费看吃奶视频网站| 亚洲乱妇老熟女爽到高潮的片| 巨胸喷奶水视频www免费视频| 亚洲天堂中文字幕在线| 日本亚洲免费无线码| 在线精品免费视频无码的| 国产精品亚洲av色欲三区| 免费v片在线观看无遮挡| 国产精品成人免费观看| 久久精品国产亚洲av成人| 午夜免费国产体验区免费的| 亚洲视频一区二区| 91av在线免费视频| 在线观看亚洲AV日韩AV| 免费国产在线观看老王影院| 国产综合免费精品久久久| 亚洲欧洲在线播放| 最好免费观看韩国+日本| 国产亚洲精品a在线观看app| 男人的天堂网免费网站| 亚洲色大成网站WWW久久九九| 99久久人妻精品免费二区| 亚洲乱码国产乱码精华| 在线a亚洲v天堂网2019无码| 亚洲一区二区三区免费在线观看| 亚洲第一第二第三第四第五第六| 久久精品国产精品亚洲艾草网美妙| 免费国产黄网站在线观看可以下载| 亚洲中文字幕久久精品无码A| 国产AⅤ无码专区亚洲AV| 无码人妻精品中文字幕免费东京热| 亚洲AV日韩AV无码污污网站|