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

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

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

    征服jsf

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      6 隨筆 :: 0 文章 :: 27 評論 :: 0 Trackbacks

    2007年10月21日 #

    UIComponent實現了StateHolder接口,StateHolder接口表示組件具有了狀態。
    StateHolder接口中常用到saveState,restoreState兩個方法,在開發自定義組件的時候,需要實現它們,具體使用上經常是把你的組件中全局變量進行狀態化,就是在Object[]中定義它們,jsf在恢復和保存兩個階段分別調用組件的這兩個方法,把頁面的狀態數據恢復在Object[],把組件的Object[]數據渲染到頁面。isTransient,setTransient方法表式,你的組件是否想狀態化。

    UIComponent組件主要api
    1.public abstract java.util.Map getAttributes()  該方法會獲得該組件的所有屬性值

    2. public abstract javax.faces.el.ValueBinding getValueBinding(java.lang.String name) 該方法會從組件的值綁定集合表中獲取對應的值綁定對象,值綁定對象(ValueBinding )的目的是使用EL表達式解析你綁定的模型值,例如頁面有個(#use.name),那么值綁定就會解析這個字符串,通過變量解析獲取User對象,再用值解析獲取name值。

    3.public abstract java.lang.String getClientId(javax.faces.context.FacesContext context) 主要是在UIViewRoot組件中生成組件在頁面的映射Id,如果你為組件定義了一個id,那么他會基于這個id生成一個具有組件層次的客戶端Id,使用':'來分隔,如果沒有為組件定義id,那么會動態生成一個id,例如會在頁面渲染結果看到'form1:input1'這樣的Id,就是告訴你一個Input組件的id是'input',它在id是'form1'的form組件中。clientId常常在jsf內部對組件用來整理,定位。

     4.public abstract java.lang.String getFamily() 告訴你這個組件屬于那個家族的,用的不多。主要是內部創建渲染類使用。

    5. public abstract java.lang.String getId() 這個Id就是頁面上你指定的組件Id,它可以讓你方便的查找組件樹上的組件,最好給你的頁面組件都設定一個id,在服務端開發有時候會用到,如果沒有設定,jsf會自動生成一個唯一的id,如果自定義id在組件中有沖突,那么jsf會拋出id沖突異常。

    6.public abstract javax.faces.component.UIComponent getParent() 得到該組件的父組件,注意:html標記不會成為一個組件。

    7. public abstract boolean isRendered() 如果該組件這個方法設定為false,那么該組件以及它的子組件都會停止解碼,驗證,值更新,渲染等操作

    8. public abstract java.lang.String getRendererType()  指定了該組件使用哪個渲染類進行渲染,這就是組件與渲染分離,并且互相可以復用的機制。

    9. public abstract boolean getRendersChildren();  如果組件的此方法設定為真,那么jsf將繼續尋找它的子組件進行渲染。否者渲染只渲染到當前組件。

    10. public abstract java.util.List getChildren(); 獲得該組件的直屬子組件列表

    11. public abstract int getChildCount() 獲得獲得該組件的直屬子組件列表數

    12.public abstract javax.faces.component.UIComponent findComponent(java.lang.String expr) 尋找該組件的子組件,通過頁面上指定的組件Id,在它的父組件的findComponent去查找這個組件,一般用于自定義組件開發上,例如:jsf消息渲染的時候就是通過findComponent方法去尋找for屬性定義的組件。

    13.public abstract java.util.Map getFacets() 得到該組件的所有facet類型的組件,facet組件主要作用:一個功能強大的組件中會有很多增強功能,這些增強功能可以定義成多個小的facet組件,這樣可以從組件的主功能中分解開,降低組件內部功能的耦合性,同時也可以做為組件的插件機制來擴展。

    14.public abstract java.util.Iterator getFacetsAndChildren() 獲取自己所以的直屬子組件和facet組件,常用在子組件查找操作上,例如jsf核心機制中,遍歷組件增加事件時就要遞歸使用此方法。

    15.    public abstract void broadcast(javax.faces.event.FacesEvent event) 對于jsf生命周期的幾個階段都會用到遞歸遍歷組件的事件,使用的就是這個方法,常用在內部機制上。標準的觀察者模式。

    16.    public abstract void decode(javax.faces.context.FacesContext context) jsf聲明周期中的解碼部分就是調用此方法,主要用在應用請求值階段,通過遞歸遍歷,每一個組件會在這個階段操作request等容器對象來實現并隱藏request請求的表現邏輯,并封裝成事件交給組件的事件列表,由后面的階段來處理。需要注意的是很可能此方法會把工作委托給渲染類的decode上,所以jsf的渲染機制不僅僅是簡單的輸出html等展現標記,還用來封裝和隱藏容器內的通信機制,讓容器內對象從我們眼前消失!

    17. 

        public abstract void encodeBegin(javax.faces.context.FacesContext context)
                throws java.io.IOException;

        public abstract void encodeChildren(javax.faces.context.FacesContext context)
                throws java.io.IOException;

        public abstract void encodeEnd(javax.faces.context.FacesContext context)
                throws java.io.IOException;

    組件渲染階段需要經歷的步驟,渲染機制是一個復雜的過程,原理上是把tag標記渲染的工作委托給了servlet之上來處理,jsf 的tag標記只作為組件,視圖之間的映射之用。這三個階段更明確了渲染成視圖標記這樣一個工作,同樣可以委托給渲染類去做。

     18.protected abstract void addFacesListener(javax.faces.event.FacesListener listener) 為組件增加監聽,標準的觀察者模式。

    19.protected abstract javax.faces.event.FacesListener[] getFacesListeners(java.lang.Class clazz) 得到組件的監聽列表,監聽器在組件的事件列表遍歷時會被調用,clazz參數是用來區分不同的監聽器,目前常用ActionListener.class,ValueChangeListener.class

    20.protected abstract void removeFacesListener(javax.faces.event.FacesListener listener);從組件的監聽列表中刪除不需要的監聽器。

    21.public abstract void queueEvent(javax.faces.event.FacesEvent event) 把新創建的事件增加到組件的事件隊列,此方法常常用在應用請求值階段,每個組件會根據條件創建自己的事件,加入到事件列表,所有事件會全局的放入UIViewRoot組件中,UIViewRoot組件是jsf各個階段對組件樹進行遞歸遍歷處理的啟動點。

    22.

       public abstract void processRestoreState(javax.faces.context.FacesContext context,
                                                 java.lang.Object state);

        public abstract void processDecodes(javax.faces.context.FacesContext context);

        public abstract void processValidators(javax.faces.context.FacesContext context);

        public abstract void processUpdates(javax.faces.context.FacesContext context);

        public abstract java.lang.Object processSaveState(javax.faces.context.FacesContext context);

        jsf生命周期中組件需要處理的五個重要階段:恢復狀態,解碼,驗證,更新,保持狀態(另外包括調用應用,渲染),開發自定義組件,需要特別關注這些方面,渲染階段由組件的編碼方法實現,調用應用階段則是actionListener監聽器集合的處理期。

    23. protected abstract javax.faces.context.FacesContext getFacesContext() 獲取jsf上下文環境,FacesContext 是一個線程安全模型,在設計上接近pojo,所以在jsf環境對FacesContext的調用得到了簡化,但是jsf整體的編程規則上更希望你能把FacesContext 作為命令參數傳遞給各個實現細節,以保證上下文的真實性,這一點在開發自定義組件上要注意!
    24. protected abstract javax.faces.render.Renderer getRenderer(javax.faces.context.FacesContext context) 獲取當前組件的渲染類。
    posted @ 2007-11-02 16:38 方順 閱讀(3024) | 評論 (0)編輯 收藏

       1.不要盲目使用jsf1.2規范的實現框架:
            目前sun,myfaces都推出了jsf1.2規范的實現,但是各種jsf1.2支持并沒有跟上,所以小心使用。
           jsf1.2的優勢主要體現在統一的EL表達式,也就是說你可以在頁面上,混合使用只要支持了統一表達式的各種tag標記,同時可以享受jsf在表現層開發上帶來的強大支持,這就又需要兩個規范的支持,一個是jsp規范,一個是jstl規范,jsp2.1規范支持統一EL,它在tomat6.0.14以后才開始支持,glassFish默認支持,這些都是基礎設施,jstl把不同的taglibs定義了一個規范,你可以選擇各種實現了jstl規范的taglibs框架,目前大多數使用的是apache 帶的標準實現,但是apache仍然沒有推出jstl1.2規范的實現,只有jstl1.2規范以后開始支持統一EL,目前可能只有glassfish有jstl1.2的默認實現,我沒有試過能不能復用在其他容器下,但是在沒有驗證之前,請斟酌使用,jsf1.2在統一EL方面的常用應用就是和jstl標記混合。如果你的項目仍然是tomcat5.5或者jboss的容器,使用jsf1.2沒有多大優勢!而且jsf1.2雖然推出了不同的實現框架,但是增強框架仍然沒有看到,myfaces基于jsf1.2的 Tomahawk 還沒有推出支持1.2規范的實現,如果僅僅使用sun的標準實現和myfaces的標準實現,在項目中你會步履維艱!

    2.如果沒有商業jsf框架選擇,請選擇myfaces的增強框架Tomahawk
      sun的標準實現和myfaces的標準實現都是針對規范該有的內容進行實現,并沒有在組件方面進行必要的增強,這也是我主要使用Tomahawk這種對組件增強框架的原因。

    3.現階段不要相信IDE工具支持
       netbeans的可視化操作使用的是自己的jsf實現,沒有myfaces框架的支持,需要等到6.0推出才能驗證它的優勢,其他包括商業工具,使用后錯誤很多,感覺就是在測試我們的接受能力,現階段我對jsf的可視化工具不抱希望,如果你有信心,可以試試工具!現階段我推薦的方式是jsf手動開發,在開發中積累經驗!

    4.不要隨意使用ajax支持的jsf組件。
      如果你是web2.0的支持者,現階段還是不要用jsf好,jsf是下一代web2.0的主導。如果你是標準的企業開發,建議使用標準方式進行頁面請求。jsf最大的貢獻不是支持ajax,而是內部實現了一個可以透明化http無狀態的機制,這種機制讓我們在開發上高度關注組件化業務,讓我們的開發能走的更遠,而使用ajax在理論上和標準方式一樣,在服務端具有統一的模型處理,但是javascript在工程開發上是高度的復雜和麻煩,jsf在處理純html上在現階段也是常常出現一些讓人接受不了的問題,有時候需要自己手動Hack,但是好在html還不復雜,如果頁面端大量javascript,你怎么辦,這還不算請求帶來的問題,ajax框架本身的質量!

    6.如果項目中決定使用jsf,請找一個能拿的住jsf的人,整個開發不僅僅會使用jsf,還有混合使用其他頁面技術,如果這個人對表現層的理解包括jsf的理解不夠,項目在很多方面的質量會有折扣,但是對于整個開發團隊使用jsf會比使用其他表現層技術更簡單,更高效,開發質量也會更高,這都要看jsf負責人的技術應變能力了!

    5.還是老調重提,在項目中最好加入seam的支持,會讓jsf的開發變的簡單!
    posted @ 2007-10-21 11:38 方順 閱讀(2046) | 評論 (7)編輯 收藏

    主站蜘蛛池模板: 无码日韩人妻av一区免费| 亚洲精品麻豆av| 最新免费jlzzjlzz在线播放| 免费无码看av的网站| 中文字幕久久亚洲一区| 久久精品国产亚洲AV嫖农村妇女| 亚洲av无码一区二区三区四区| 99在线热播精品免费99热| 成人毛片18女人毛片免费视频未| 亚洲免费黄色网址| 99久久免费国产精品热| 亚洲中文字幕在线乱码| 你懂得的在线观看免费视频| 亚洲国产一二三精品无码| 色婷婷六月亚洲综合香蕉| 日韩成人免费在线| 亚洲人成伊人成综合网久久| 成人影片麻豆国产影片免费观看| 久久久久久亚洲精品中文字幕| 男女猛烈xx00免费视频试看| 2020久久精品国产免费| 精品久久久久久亚洲| 亚洲av永久无码嘿嘿嘿| 无码精品一区二区三区免费视频 | 亚洲福利一区二区三区| 国产日韩在线视频免费播放| 免费永久在线观看黄网站| 亚洲影院天堂中文av色| 日日麻批免费40分钟日本的| 亚洲国产精品无码观看久久| 69式国产真人免费视频| 亚洲AV综合色区无码一二三区| 亚洲一区二区高清| 日韩在线观看免费| 免费一级毛片一级毛片aa| 亚洲AV日韩综合一区| 中文字幕中韩乱码亚洲大片| 中文在线免费不卡视频| 国产亚洲?V无码?V男人的天堂| 99在线在线视频免费视频观看| 亚洲成人精品久久|