<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 紫蝶∏飛揚↗ 閱讀(792) 評論(0)  編輯  收藏 所屬分類: JSF
    主站蜘蛛池模板: 成人免费视频软件网站| eeuss影院免费92242部| 免费99精品国产自在现线| 91大神亚洲影视在线| 人妻无码一区二区三区免费| 亚洲AV无码乱码在线观看裸奔| 中文字幕免费人成乱码中国| 亚洲午夜无码久久久久| 男女一进一出抽搐免费视频| 亚洲香蕉成人AV网站在线观看| a级在线免费观看| 亚洲avav天堂av在线不卡| 91香蕉在线观看免费高清| 亚洲狠狠狠一区二区三区| 国产v精品成人免费视频400条| 国产精品亚洲四区在线观看| 日韩免费视频一区| 免费手机在线看片| 国产精品亚洲美女久久久| 国产一级婬片A视频免费观看| 久久精品国产亚洲av四虎| 亚洲视频在线观看免费视频| 亚洲精品一二三区| 日产国产精品亚洲系列| 免费无码av片在线观看| 亚洲精品在线视频观看| 日韩中文字幕在线免费观看 | 亚洲伊人久久成综合人影院| 精品免费久久久久国产一区| 亚洲AV无码久久精品狠狠爱浪潮 | 久久久久亚洲av无码尤物| 无码国产精品一区二区免费式直播| 亚洲中文无码永久免费| 免费大黄网站在线观看| 无码国产精品一区二区免费vr| 精品国产成人亚洲午夜福利| 国产日产亚洲系列最新| 国产在线a免费观看| eeuss草民免费| 亚洲校园春色另类激情| 在线精品亚洲一区二区小说|