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

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

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

    隨筆-94  評論-56  文章-3  trackbacks-0
    Anand Prakash Joshi , 軟件工程師, IBM

    2006 年 1 月 04 日

    本文中,作者 Anand Joshi 使用 JSF 框架中的設計模式闡釋了 JavaServer? Faces (JSF) 體系結(jié)構(gòu)。他討論了 JSF 體系結(jié)構(gòu)中使用的 GoF 設計模式,以及這些模式在 JSF 框架 中的作用。任何對設計模式和 JSF 體系結(jié)構(gòu)有一定了解的人都能從 Anand 詳細的介紹中有所收獲。*讀者應該對 GoF 設計模式和 JSF 技術(shù)有 很好的了解。

    設計模式可以幫助用戶在更高層次上抽象細節(jié),更好地理解體系結(jié)構(gòu)。如果比較熟悉 GoF 設計模式和 JavaServer Faces (JSF) 框架,本文可以幫助您洞察 JSF 框架中使用的設計模式,深入理解其工作原理。

    本文探討了 JSF 框架中使 用的設計模式。詳細討論的設計模式包括 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy 、Template Method 和 Observer 模式。

    設計模式和 JavaServer Faces (JSF) 技術(shù)

    首先簡要地介紹一下模式和 JSF 框架。

    • 模式。設計模式是對問題和解決方案進行抽象的普遍適用的 方法。因為模式是所有開發(fā)人員和架構(gòu)師公認的,所以模式可以節(jié)約時間和資源。用外行話來說,模式就是關(guān)于某個人所共知的問題的經(jīng)過驗 證的解決方案。模式可以重用,重用使得解決方案更健壯。
    • Java Server Faces。 JSF 體系結(jié)構(gòu)是一種 Web 應用程序框架。 它是 Java Community Process (JCP) 推動的,有望成為 Web 應用程序開發(fā)的標準框架。目前用于開發(fā) Web 應用程序的框架有 50 多個,這 說明迫切需要實現(xiàn)框架的標準化,這正是 JSF 框架的目標!




    深入剖析 JSF 模式

    現(xiàn)在我們來討論 JSF 體系結(jié)構(gòu)中的各種設計模式。本文將詳細討論 Singleton、Model-View-Controller、 Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 設計模式。我將分析每種模式的用途及其在 JSF 框架中的作用。





    Singleton 模式

    Singleton 模式的目的是保證類只有一個實例被加載,該實例提 供一個全局訪問點。當啟動具有 JSF 支持的 Web 應用程序時,Web 容器初始化一個 FacesServlet 實例。在這個階段,F(xiàn)acesServlet 對每個 Web 應用程序?qū)嵗?Application 和 LifeCycle 實例一次。這些實例就采用眾所周知的 Singleton 模式,通常只需要該類型的一個實例。

    使用 JSF 的 Web 應用程序只需要 Application 和 LifeCycle 類的一個實例。LifeCycle 管理多個 JSF 請求的整個生命期。因為其 狀態(tài)和行為在所有請求之間共享,這些對象采用 Singleton 模式合情合理。LifeCycle 維護的 PhaseListeners 也是 Singleton 模式的。 PhaseListeners 由所有 JSF 請求共享。在 JSF 框架中可以廣泛使用 Singleton 模式,以減少內(nèi)存占用和提供對象的全局訪問。 NavigationHandler(用于確定請求的邏輯結(jié)果)和 ViewHandler(用于創(chuàng)建視圖)也是使用 Singleton 模式的例子。





    Model-View-Controller (MVC)

    MVC 模式的目的是從數(shù)據(jù)表示(View)中將數(shù)據(jù)( 即 Model)分離出來。如果應用程序有多種表示,可以僅替換視圖層而重用控制器和模型代碼。類似的,如果需要改變模型,可以在很大程度 上不改變視圖層。控制器處理用戶動作,用戶動作可能造成模型改變和視圖更新。當用戶請求一個 JSF 頁面時,請求發(fā)送到 FacesServlet。 FacesServlet 是 JSF 使用的前端控制器 servlet。和其他很多 Web 應用程序框架一樣,JSF 使用 MVS 模式消除視圖和模型之間的耦合。為 了集中處理用戶請求,控制器 servlet 改變模型并將用戶導航到視圖。

    FacesServlet 是 JSF 框架中所有用戶請求都要經(jīng)過的控制器 元素。FacesServlet 分析用戶請求,使用托管 bean 對模型調(diào)用各種動作。后臺(backing)或托管(managed)bean 就是該模型的例子。JSF 用戶界面(UI)組件是視圖層的例子。MVC 模式把任務分解給具有不同技能的開發(fā)人員,使這些任務能夠同時進行,這樣 GUI 設計人員就可以 使用豐富的 UI 組件創(chuàng)建 JSF 頁面,同時后端開發(fā)人員可以創(chuàng)建托管 bean 來編寫專門的業(yè)務邏輯代碼。





    Factory Method 模式

    Factory Method 模式的目的是定義一個用于創(chuàng)建對象的接口,但是把對象實例化推遲到子類中。在 JSF 體系 結(jié)構(gòu)中,F(xiàn)actory Method 模式被用于創(chuàng)建對象。LifeCycleFactory 是一個創(chuàng)建和返回 LifeCycle 實例的工廠對象。LifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法采用 Factory Method 模式,根據(jù) LifeCycleId 創(chuàng)建(如果需要)并返回 LifeCycle 實例。自定 義的 JSF 實現(xiàn)可以重新定義 getLifeCycle 抽象方法來創(chuàng)建自定義的 LifeCycle 實例。默認的 JSF 實現(xiàn)提供默認的 LifeCycle 實例。此外 ,對于每個 JSF 請求,F(xiàn)acesServlet 都從 FacesContextFactory 得到 FacesContext。FacesContextFactory 是一個抽象類,公開了 getFacesContext API,JSF 實現(xiàn)提供了 FacesContextFactory 和 getFacesContext API 的具體實現(xiàn)。這是另外一個使用 Factory Method 模 式的例子,具體的 FacesContextFactory 實現(xiàn)創(chuàng)建 FacesContext 對象。





    State 模式

    State 模式的目的是在表示狀態(tài)的不同類之間分配與狀態(tài)有關(guān)的邏輯。FacesServlet 對 LifCycle 實例調(diào)用 execute 和 render 方法。LifeCycle 協(xié)調(diào)不同的 Phrase 以便執(zhí)行 JSF 請求。在這里 JSF 實現(xiàn)就遵循了 State 模式。如果沒有使用這種模式, LifeCycle 實現(xiàn)就會被大量的條件(即 “if” 語句)攪得一塌糊涂。JSF 實現(xiàn)為每個狀態(tài)(或階段)創(chuàng)建單獨的類并調(diào)用 step。phase 是一 個抽象類,定了每個 step 的公共接口。在 JSF 框架中定義了六個 phrase(即 step):RestoreViewPhase、ApplyRequestValues、 ProcessValidationsPhase、UpdateModelValuesPhase、InvokeApplicationPhase 和 RenderResponsePhase。

    在 State 模式中, LifeCycle 把 FacesContext 對象傳遞給 phase。每個階段或狀態(tài)改變傳遞給它的上下文信息,然后設置 FacesContext 本身中的標志表明下 一個可能的步驟。JSF 實現(xiàn)在每個步驟中改變其行為。每個階段都可以作為下一個階段的起因。FacesContext 有兩種標志 renderResponse 和 responseComplete 可以改變執(zhí)行的順序。每個步驟執(zhí)行完成后,LifeCycle 檢查上一階段是否設置了這些標志。如果設置了 responseComplete,LifeCycle 則完全放棄請求的執(zhí)行。如果經(jīng)過某個階段后設置了 renderResponse 標志,JSF 就會跳過剩下的階段而直接 進入 Render Response 階段。如果這兩個標志都沒有設置,LifeCycle 就會按順序繼續(xù)執(zhí)行下一步。





    Composite 模式

    Composite 模式讓客戶代碼能夠統(tǒng)一處理復合對象和基本對象。復合對象是基本對象的容器。在第一階段(Restore View 階段)和最后一個階段(Render Response 階段),使用 JSF UI 組件構(gòu)造 UI View。UIComponentBase 就是 Composite 模式中 Component 抽象類的一個例子。UIViewRoot 是 Composite 類,而 UIOutput(比方說)就是葉子(或者基本類)。UIComponentBase 類定義了 葉子和復合對象的公共方法,如編碼/解碼值和子節(jié)點管理函數(shù)。子節(jié)點管理函數(shù),如 getChildren,對于葉子節(jié)點返回空列表,對于復合節(jié)點 則返回其子節(jié)點。





    Decorator 模式

    Decorator 模式的目的是不通過子類化動態(tài)擴展對象的行為。JSF 框架有很多擴展點(即可插入機制)。JSF 實現(xiàn)可使用 Decorator 模式替換默認的 PropertyResolver、VariableResolver、ActionListener 、NavigationHandler、ViewHandler 或 StateManager。通常自定義實現(xiàn)接受通過構(gòu)造函數(shù)傳遞給它的默認實現(xiàn)的引用。自定義實現(xiàn)僅僅改寫 功能的一個子集,而將其他功能委托給默認實現(xiàn)。如果希望實現(xiàn)自定義的 ViewHandler,改寫默認 ViewHandler 實現(xiàn)的 calculateLocale 方 法,可以像 清單 1 那樣編寫 CustomViewHandler 類:
    清單 1. CustomViewHandler 片段

    
    public class CustomViewHandler extends ViewHandler {
     public CustomViewHandler(ViewHandler handler) {
    		 super();
    		 oldViewHandler = handler;
     }
    private ViewHandler oldViewHandler  = null;
    public void renderView (facesContext context, UIViewRoot view) {
                //delegate method to oldViewHandler
    		 oldViewHandler.renderView(context, view);
    }
    //custom implementation of calculateLocale
    public Locale calculateLocale(FacesContext context) {
    }
    }
    





    Strategy 模式

    Strategy 模式的目的是封裝不同的概念。JSF 框 架采用 Strategy 模式使用委托實現(xiàn)模型呈現(xiàn) UI 組件。JSF 技術(shù)支持兩種呈現(xiàn)模型。在直接實現(xiàn)模型中,UI 組件對收到的請求中的數(shù)據(jù)進行 解碼,然后編碼這些數(shù)據(jù)進行顯示。在委托實現(xiàn)模型中,解碼和編碼操作委托給和組建關(guān)聯(lián)的專門呈現(xiàn)器。后一種模型利用了 Strategy 設計 模式,比直接實現(xiàn)更靈活。在 Strategy 模式中,將不同的算法封裝在單獨的對象中,從而可以動態(tài)地改變算法。JSF 實現(xiàn)可以用已有的 renderkit 實例注冊另外的呈現(xiàn)器,當應用程序啟動的時候,JSF 實現(xiàn)讀取配置文件將這些呈現(xiàn)器和 UI 組件聯(lián)系在一起。





    Template Method 模式

    Template Method 模式的目的是將變化的步驟推遲到子類 中,而在父類中定義那些固定的算法步驟。JSF 框架通過 PhraseListeners 展現(xiàn)了 Template Method 模式提供的功能。采用 Template Method(或者 “hook”)使得 Web 作者可以為不同階段之間的可選步驟提供實現(xiàn),而主要階段仍然和 JSF 框架的定義一致。JSF 框架提供了 PhaseListeners,概念上類似于 Template Method 模式中的可變步驟。JSF 框架有六個預定義的階段,在每個階段之間,Web 作者可以實現(xiàn) PhaseListeners 來提供類似于 Template Method hook 的 hook。事實上,這種結(jié)構(gòu)比 Template Method 模式更具有擴展性。可以通過注冊 PhraseId 為 ANY_PHRASE 的 PhaseListener 在每個階段后提供 hook。如果 PhaseId 是 ANY_PHASE,JSF 實現(xiàn)就會在每個階段之前和之后調(diào) 用該 PhaseListener。JSF 框架中的實現(xiàn)略有不同,因為可以根本沒有 PhaseListener,但是在 Template Method 模式中,子類通常重新定義 父類中抽象的可變步驟。





    Observer 模式

    Observer 模式的目的是當目標對象的狀態(tài)改變時自動通知所有依 賴的對象(即觀察器)。JSF 在 UI 組件中實現(xiàn)了 Observer 模式。JSF 有兩類內(nèi)建事件:ActionEvent 和 ValueChangedEvent。ActionEvent 用于確定用戶界面組件(如按鈕)的激活。當用戶單擊按鈕時,JSF 實現(xiàn)通知添加到該按鈕上的一個或多個動作監(jiān)聽程序。于是該按鈕被激活 ,或者說按鈕(主體)的狀態(tài)改變了。添加到按鈕上的所有監(jiān)聽程序(即觀察器)都收到通知該主體狀態(tài)已經(jīng)改變。類似的,當輸入 UI 組件 中的值改變時,JSF 實現(xiàn)通知 ValueChangeListener。





    結(jié)束語

    JSF 框架利用了 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、 Template Method 和 Observer 設計模式。因為它的體系結(jié)構(gòu)建立在已經(jīng)驗證的設計模式的基礎上,這是一個健壯的框架,模式在 JSF 框架中 得到了很好的利用。





    參考資料

    學習


    獲得產(chǎn)品和技術(shù)


    討論





    關(guān)于作者

    Anand Joshi 的照片

    Anand 是一位 Sun 認證的企業(yè)架構(gòu)師,幾年來一直研究 Web 技術(shù)。他對 WebSphere 管理控制 臺應用程序的設計和開發(fā)做了多方面的貢獻。Anand 曾經(jīng)在 IBM 美國工作過幾年,目前在 IBM 印度工作。

    posted on 2006-06-28 18:21 小言身寸 閱讀(414) 評論(0)  編輯  收藏 所屬分類: JAVA相關(guān)技術(shù)
    主站蜘蛛池模板: 国产午夜成人免费看片无遮挡| 黄色a三级免费看| 国产成人一区二区三区视频免费| 红杏亚洲影院一区二区三区| eeuss在线兵区免费观看| 久久亚洲国产成人精品无码区| 午夜不卡AV免费| 国产AV无码专区亚洲AWWW| 中国毛片免费观看| 亚洲成AV人片在| 亚欧在线精品免费观看一区| 亚洲依依成人精品| 国产婷婷高清在线观看免费 | 真人做A免费观看| 亚洲精品二三区伊人久久| 岛国大片免费在线观看| 色偷偷噜噜噜亚洲男人| 亚洲一级片内射网站在线观看| 一区在线免费观看| 中文字幕亚洲综合久久2| 免费观看成人毛片a片2008| 豆国产96在线|亚洲| 亚洲中文字幕在线乱码| 24小时日本韩国高清免费| 亚洲videosbestsex日本| 四虎影院永久免费观看| 中出五十路免费视频| 91在线精品亚洲一区二区| 成人免费看黄20分钟| 无码日韩人妻AV一区免费l| 亚洲福利在线视频| 嫩草影院免费观看| 国产在线观看xxxx免费| 亚洲伊人久久精品| 亚洲国产成人a精品不卡在线| 午夜视频在线免费观看| 国产精品亚洲一区二区在线观看 | 亚洲视频在线免费看| 日本人的色道www免费一区| 久久精品免费观看| 亚洲人成色4444在线观看|