使用 JSF 架構進行設計

來源:互聯網
上載者:User
使用 JSF 架構進行設計

探索 JavaServer Faces 架構中使用的設計模式

檔案選項


<tr valign="top"><td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"/></td><td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"/></td><td class="small" width="122"><p><span class="ast">需要JavaScript的檔案選項無法顯示</span></p></td></tr>



友善列印

轉寄本文


級別: 中級

Anand Prakash Joshi, 軟體工程師, IBM

2006 年 1 月 04 日

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

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

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

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

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

  • 模式。設計模式是對問題和解決方案進行抽象的普遍適用的方法。因為模式是所有開發人員和架構師公認的,所以模式可以節約時間和資源。用外行話來說,模式就是關於某個人所共知的問題的經過驗證的解決方案。模式可以重用,重用使得解決方案更強健。
  • Java Server Faces。 JSF 架構是一種 Web 應用程式架構。它是 Java Community Process (JCP) 推動的,有望成為 Web 應用程式開發的標準架構。目前用於開發 Web 應用程式的架構有 50 多個,這說明迫切需要執行架構的標準化,這正是 JSF 架構的目標!

回到頂端

深入剖析 JSF 模式

現在我們來討論 JSF 架構中的各種設計模式。本文將詳細討論 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 設計模式。我將分析每種模式的用途及其在 JSF 架構中的作用。

回到頂端

Singleton 模式

Singleton 模式的目的是保證類型只有一個實例被載入,該實例提供一個全域存取點。當啟動具有 JSF 支援的 Web 應用程式時,Web 容器初始化一個 FacesServlet 實例。在這個階段,FacesServlet 對每個 Web 應用程式實例化 Application 和 LifeCycle 實例一次。這些實例就採用眾所周知的 Singleton 模式,通常只需要該類型的一個實例。

使用 JSF 的 Web 應用程式只需要 Application 和 LifeCycle 類型的一個實例。LifeCycle 管理多個 JSF 請求的整個生命期。因為其狀態和行為在所有請求之間共用,這些物件採用 Singleton 模式合情合理。LifeCycle 維護的 PhaseListeners 也是 Singleton 模式的。PhaseListeners 由所有 JSF 請求共用。在 JSF 架構中可以廣泛使用 Singleton 模式,以減少記憶體佔用和提供物件的全域存取。NavigationHandler(用於確定請求的邏輯結果)和 ViewHandler(用於建立視界)也是使用 Singleton 模式的例子。

回到頂端

Model-View-Controller (MVC)

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

FacesServlet 是 JSF 架構中所有用戶請求都要經過的控制器元素。FacesServlet 分析用戶請求,使用託管 bean 對模型調用各種動作。後臺(backing)或託管(managed)bean 就是該模型的例子。JSF 使用者介面(UI)元件是視界層的例子。MVC 模式把任務分解給具有不同技術的開發人員,使這些任務能夠同時進行,這樣 GUI 設計人員就可以使用豐富的 UI 元件建立 JSF 頁面,同時後端開發人員可以建立託管 bean 來編寫專門的業務邏輯程式碼。

回到頂端

Factory Method 模式

Factory Method 模式的目的是定義一個用於建立物件的介面,但是把物件實例化推遲到子類型中。在 JSF 架構中,Factory Method 模式被用於建立物件。LifeCycleFactory 是一個建立和返回 LifeCycle 實例的工廠物件。LifeCycleFactory 的 getLifeCycle (String LifeCycleId) 方法採用 Factory Method 模式,根據 LifeCycleId 建立(如果需要)並返回 LifeCycle 實例。自定義的 JSF 實現可以重新定義 getLifeCycle 抽象方法來建立自行定義的 LifeCycle 實例。內建的 JSF 執行提供內建的 LifeCycle 實例。此外,對於每個 JSF 請求,FacesServlet 都從 FacesContextFactory 得到 FacesContext。FacesContextFactory 是一個抽象類型,公開了 getFacesContext API,JSF 執行提供了 FacesContextFactory 和 getFacesContext API 的具體實現。這是另外一個使用 Factory Method 模式的例子,具體的 FacesContextFactory 施行建立 FacesContext 物件。

回到頂端

State 模式

State 模式的目的是在表示狀態的不同類型之間分配與狀態有關的邏輯。FacesServlet 對 LifCycle 實例引用 execute 和 render 方法。LifeCycle 協調不同的 Phrase 以便執行 JSF 請求。在這裏 JSF 執行就遵循了 State 模式。如果沒有使用這種模式,LifeCycle 執行就會被大量的條件(即 “if” 語句)攪得一塌糊塗。JSF 執行為每個狀態(或階段)建立單獨的類並引用 step。phase 是一個抽象類型,制定了每個 step 的公用介面。在 JSF 架構中定義了六個 phrase(即 step):RestoreViewPhase、ApplyRequestValues、ProcessValidationsPhase、 UpdateModelValuesPhase、InvokeApplicationPhase 和 RenderResponsePhase。

在 State 模式中,LifeCycle 把 FacesContext 物件傳遞給 phase。每個階段或狀態改變傳遞給它的上下文資訊,然後設置 FacesContext 本身中的標誌表明下一個可能的步驟。JSF 執行在每個步驟中改變其行為。每個階段都可以作為下一個階段的起因。FacesContext 有兩種標誌 renderResponse 和 responseComplete 可以改變執行的順序。每個步驟執行完成後,LifeCycle 檢查上一階段是否設置了這些標誌。如果設置了 responseComplete,LifeCycle 則完全放棄請求的執行。如果經過某個階段後設置了 renderResponse 標誌,JSF 就會跳過剩下的階段而直接進入 Render Response 階段。如果這兩個標誌都沒有設置,LifeCycle 就會按順序繼續執行下一步。

回到頂端

Composite 模式

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

回到頂端

Decorator 模式

Decorator 模式的目的是不透過子類型化動態擴展物件的行為。JSF 架構有很多擴展點(即可內置機制)。JSF 執行可使用 Decorator 模式替換內建的 PropertyResolver、VariableResolver、ActionListener、NavigationHandler、 ViewHandler 或 StateManager。通常自行定義執行接受透過構造函數傳遞給它的內建執行的引用。自行定義執行僅僅改寫功能的一個子集,而將其他功能委託給內建執 行。如果希望執行自行定義的 ViewHandler,改寫內建 ViewHandler 施行的 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 模式使用委託執行模型呈現 UI 元件。JSF 技術支援兩種呈現模型。在直接執行模型中,UI 元件對收到的請求中的資料進行解碼,然後編碼這些資料進行顯示。在委託執行模型中,解碼和編碼操作委託給和組建關聯的專門呈現器。後一種模型利用了 Strategy 設計模式,比直接執行更靈活。在 Strategy 模式中,將不同的演算法封裝在單獨的物件中,從而可以動態地改變演算法。JSF 執行可以用已有的 renderkit 實例註冊另外的呈現器,當應用程式啟動的時候,JSF 執行讀取配置檔將這些呈現器和 UI 組件聯繫在一起。

回到頂端

Template Method 模式

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

回到頂端

Observer 模式

Observer 模式的目的是當目標物件的狀態改變時自動通知所有依存的物件(即觀察器)。JSF 在 UI 元件中執行了 Observer 模式。JSF 有兩類內建事件:ActionEvent 和 ValueChangedEvent。ActionEvent 用於確定用戶介面元件(如按鈕)的啟動。當用戶單擊按鈕時,JSF 執行通知添加到該按鈕上的一個或多個動作監聽程式。於是該按鈕被啟動,或者說按鈕(主體)的狀態改變了。添加到按鈕上的所有監聽程式(即觀察器)都收到通 知該主體狀態已經改變。類似的,當輸入 UI 元件中的值改變時,JSF 執行通知 ValueChangeListener。

回到頂端

結束語

JSF 架構利用了 Singleton、Model-View-Controller、Factory Method、State、Composite、Decorator、Strategy、Template Method 和 Observer 設計模式。因為它的架構建立在已經驗證的設計模式的基礎上,這是一個強健的架構,模式在 JSF 架構中得到了很好的利用。

回到頂端

參考資料

學習

  • 請瀏覽 Gang of Four Design Patterns 進一步瞭解這些設計模式。

  • 請閱讀 “JSF 應用程式的生命週期” 進一步瞭解 JavaServer Faces 架構(developerWorks,2005 年 3 月)。
  • 請瀏覽 developerWorks Java 技術專區。這裏專門發表各種架構在 Web 和 Java 的解決方案的文章和課程。

取得產品及技術資料

  • 從 Sun Developer Network 免費 下載 JSF。

  • 下載 IBM Rational Software Architect 的免費試用版。

討論

  • 參與 developerWorks blogs 並加入 developerWorks 社群。

  • 參與 Sun Developer Network 上的 Java 論壇 —— JavaServer Faces Technology。

回到頂端

關於作者

Anand 是一位 Sun 認證的企業架構師,幾年來一直研究 Web 技術。他對 WebSphere 管理控制臺應用程式的設計和開發做了多方面的貢獻。Anand 曾經在 IBM 美國工作過幾年,目前在 IBM 印度工作。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.