知識積累(十三)——JSF+Spring+Hibernate的實例講解(一)

 
原文地址:http://www.javaworld.com/javaworld/jw-07-2004/jw-0719-jsf.html
 
內容概要
        使用JSF建立一個真實的Web應用程序不是沒有意義的任務,這篇文章介紹瞭如何將JSF與Sping Framework和Hibernate集成,並且給出了使用這些技術建立這個真實的Web應用程序的最佳實踐和設計指導
        JavaServer Faces(JSF)技術是J2EE應用程序的一個新的用戶接口框架,它非常適合基於MVC(Model-View-Controller)體系結構的應用程序。已經有大量的文章介紹JSF。然而,很多文章都是站在理論研究的層面上,沒有挑戰一個真實的企業開發。很多問題沒有解決,例如,JSF怎樣全面適合MVC體系結構?JSF如何與其他JAVA框架集成?業務邏輯應該放在JSF的backing beans裏面嗎?怎樣處理JSF裏面的安全問題?最重要的是你怎樣使用JSF建立一個真實的Web應用程序?
        這篇文章涉及所有這些問題。它向你展示如何集成其他特定的Java框架,Spring Framework和Hibernate,它示範怎樣去創建一個叫JCatalog的Web應用程序,一個在線的產品目錄系統。這篇文章使用JCatalog例子,介紹了Web應用程序設計的每一個階段,包括業務需求收集,分析,技術選擇,高層體系結構和詳細設計。這篇文章論述了JCatalog裏面好的和不好的技術,示範了應用程序設計中一些關鍵方面的方法和步驟。
        這篇文章是寫給正在從事基於J2EE Web應用程序的Java架構師,開發者,它不是對JSF、Spring Framework和Hibernate的入門教程。如果您對這些領域不熟悉,請參考文章最後的資源鏈接。
例子應用程序的功能需求
        這篇文章的例子應用程序JCatalog是一個真實的Web應用程序,例子足夠現實是爲了決定應用程序架構而進行意味深長的討論的基礎。我通過介紹JCatalog項目的需求開始。我在這裏談到後面貫穿於整個文章的內容是爲了演示技術選擇和體系結構設計。
        設計Web應用程序的第一步是收集系統的功能需求,這個例子應用程序是一個典型的電子商務應用系統。用戶能瀏覽產品目錄和查看產品細節,管理員能管理產品目錄。功能還可以增加,舉例來說,爲了開發一個成熟的電子商務系統,可以添加庫存管理和訂單處理的功能。
 
用例
用例分析被用於去訪問例子應用程序的功能需求,圖1是應用程序的用例圖。 
 
 
 
 圖1 用例圖
 
        一個用例圖確定在一個系統中的參與者以及參與者可以執行的操作。例子應用中7個用例必須被實現。參與者中的User能瀏覽產品目錄和察看產品細節。一旦用戶以Administrator身份連接到系統,他就能創建新產品,編輯存在的產品,刪除老的產品。
 
業務規則
JCatalog 必須符合下面的業務規則:
        每個產品有一個唯一的產品ID
        每個產品至少屬於一個目錄
        產品ID一旦被創建就不能改變
 
假定
對於產品的設計和實現,我們做下面的假定。
        英語是默認語言;不要求國際化
        目錄中不超過500種產品
        目錄的更新不頻繁
 
頁面流
圖2顯示了所有JCatalog的頁面和它們之間的轉換。
 
 
 
圖2 頁面流圖
 
        應用程序有兩組頁面:公共的國際互聯網和管理員的企業內部網。企業內部網只有對那些成功登陸到系統的用戶有效。產品概要頁面是公用的,它作爲產品目錄的內容包含在一個HTML框架裏面。產品列表是一個特殊的目錄,只能被管理員看見,它包含創建、編輯和刪除產品的鏈接。
        圖3是目錄頁的一個模型。理想情況下,每一個頁面所有的控制和必要的內容明細的模型應該被包含在需求文檔裏面。
 
                     
圖3 目錄頁面模型
 
高級體系結構設計
       下一步的設計是Web應用程序的高級體系結構設計,它包括將應用程序細分成功能組件以及將這些組件劃分到各自所屬的層。高級體系結構設計獨立於使用的技術。
 
多層體系結構
        一個多層體系結構將整個系統劃分成清晰的單元——客戶端、表示層、業務邏輯層、集成層和企業信息系統(EIS),這保證了清晰的責任劃分以及可維護性和可擴展性。三層或多層系統已經被證明比沒有業務邏輯層的客戶-服務器系統具有更多的可升級性和柔韌性。
 
        客戶端——是數據模型被消費和呈現的地方。對於一個Web應用程序,客戶層通常是Web瀏覽器。基於瀏覽器的瘦客戶不包含表示邏輯;它依賴於表示層。
表示層使用業務邏輯層爲用戶服務,它知道怎樣去處理一個客戶請求,怎樣去和業務邏輯層結合以及怎樣去選擇下一個試圖去顯示。
 
        業務邏輯層——包含一個應用程序的業務對象和業務服務。它從表示層接受請求,基於請求處理業務邏輯,作爲訪問EIS層資源的的中介。業務邏輯層組件使用許多系統級別的服務,例如,安全管理、事物管理和資源管理。
 
        集成層——是業務邏輯層和EIS層之間的橋樑。它封裝了與EIS層相結合的邏輯。有時,集成層和業務邏輯層的結合是作爲中間層被提到。
應用程序數據在EIS層被持久化,包括關係數據庫,面向對象數據庫和遺留系統。
JCatalog 的體系結構設計
 
圖4顯示了JCatalog的高級體系結構設計以及它怎樣適合多層體系結構。
 
 
 
圖4 高級體系結構圖
 
        應用程序使用了一個多層的非分佈式的體系結構,圖4顯示應用程序層和每一層技術選擇的劃分。它也用於應用程序的部署圖。對於一個可配置的體系結構,表示層、業務邏輯層和集成層被定位在同樣的Web容器。定義良好的接口隔離了每一層的職責。可配置的體系結構使應用程序簡單和可升級。
       
        對於表示層,經驗告訴我們,最好的實踐是選擇一個存在的,被驗證的Web應用框架,遠比設計開發一個定製的框架好。我們有幾個Web應用框架可供選擇,舉例來說,Struts、WebWork和JSF。對於JCatalog項目,我們使用JSF。
對於業務邏輯層,不是使用EJB(Enterprise JavaBeans)就是使用POJO(plain old Java objects)。如果應用程序是分佈式的,EJB具有遠程接口是一個較好的選擇。因爲JCatalog是一個典型的沒有遠程訪問請求的Web應用程序,POJO在Spring框架的幫助下,用於實現業務邏輯層。
         Pure JDBC(Java Database Connectivity):這是最靈活的實現方法;然而,低級的JDBC和不好的JDBC代碼工作是麻煩的,執行的不好。
        Entity beans:一個容器管理持久化(CMP,container-managed persistence)的entity bean是隔離數據訪問代碼和處理O/R(object- relational) mapping數據持久化的昂貴的方法。它是一個以應用服務器爲中心的解決辦法。一個entity bean不和特定的數據庫緊耦合,但是應用程序和EJB容器進耦合。
 
         O/R mapping framework:一個O/R影射的框架採用以對象爲中心的方法實現數據持久化。一個以對象爲中心的應用程序是容易開發和高度輕便的。在這個領域內存在幾個框架——JDO(Java Data Objects),Hibernate, Toplink。CocoBase是一個新的例子。在例子應用程序中我們使用HIbernate。
 
        現在,讓我們討論將應用程序的每一個層聯合起來設計的問題。因爲JSF相對來說是一個新技術,我強調一下它的使用。
 
表現層和JavaServer Faces(JSF)
        表現層收集用戶輸入,呈現數據,控制頁面導航,代替用戶與業務邏輯層交互。表現層也能校驗用戶輸入,維護應用程序的會話狀態。下面的章節,我討論表現層的設計考慮和模式以及我選擇JSF去實現JCatalog項目的表現層的原因。
 
MOdel-View-Controller(MVC)
        MVC是Java藍皮書(BluePrints)中推薦的交互式應用程序體系結構設計模式。MVC分別設計關注的問題,因此減少了代碼的重複,集中控制,使應用程序更具擴展性。MVC也幫助開發者使用不同的技術集合,集中他們核心的技術,通過定義清晰的接口進行合作。MVC是表現層的體系結構設計模式。
 
JavaServer Face
        JSF是一個基於Java的Web應用程序服務端的用戶接口組件框架。JSF包括表示UI組件和管理其狀態的API;處理事件,服務端校驗,數據轉換;定義頁面導航;支持國際化和可訪問性;提供所有這些特點的擴展能力。它還包括兩個爲JSP定製的標籤庫,一個用於表示JSP頁面內的UI組件,一個用於配置服務端的對象組件。
 
JSF和MVC
        JSF很適合基於MVC的表現層體系結構。它提供動作和表現之間清楚地劃分。它影響了UI組件和Web層概念,不限定你去使用特定的腳本技術或者標記語言。
 
        JSF backing beans 是model層(後面的章節有關於backing beans 的更多內容)。它們也包含動作,這是控制層的擴展,代理用戶對業務邏輯層的請求。請注意,從整體應用程序的體系結構來看,業務邏輯層也能被作爲Model層提到。使用JSF定製標籤的JSP頁面是視圖層。Faces Servlet提供控制者的功能。
 
爲什麼用JSF
JSF不僅僅只是另一個Web框架,下面是JSF與其他Web框架不同的特點:
 
象Swing一樣面向對象的Web應用程序開發:服務端有狀態的UI組件模型,具有事件監聽和操作者,開始了面向對象Web應用程序開發。
 
Backing-bean管理:Backing beans是頁面中JavaBeans組件和UI組件的聯合。Backing-bean管理UI組件對象定義和對象執行應用程序特殊過程以及控制數據的分離。JSF在正確的範圍內執行存儲和管理這些backing-bean實例。
 
可擴展的UI組件模型:JSF UI組件是組成JSF應用程序用戶接口可配置、可複用的元素。你能擴展標準的UI組件和開發更多的複雜組件。舉例來說,菜單條和樹型構件。
 
靈活的表現模型:一個renderer分隔一個UI組件的功能和視圖。多個renderer能被創建,用於定義相同或不同客戶端上同樣組件的不同外觀。
可擴展的轉化和校驗模型:基於標準的轉換者和校驗者,你能開發定製的轉換者和校驗者,它們提供最好的模型保護。
 
        儘管JSF很強大,但是現在還不成熟。組件、轉換者和校驗者是JSF基本的。每一個校驗模型不能處理組件和校驗者之間多對多的校驗。另外,JSF定製標籤不能和JSTL(JSP Standard Tag Library)無縫結合。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章