歡迎您光臨本站 註冊首頁

J2EE模型及J2EE設計模式

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
目前大多數企業採用J2EE技術的結構設計與解決方案.對於我們學習和研究J2EE體系結構來說,了解與掌握J2EE體系結構的設計方法及一些常用模式是必須的;模型-視圖-控制(model-view-control,簡稱MVC)結構是目前最常見的J2EE應用所基於的體系結構,MVC主要適用於互動式的Web應用,尤其是存在大量頁面及多次客戶訪問及數據顯示;相比較而言,一個工作流體系結構更多應用於過程式控制制和較少交互的情況下;除了體系結構外,J2EE的設計模式對我們解決應用系統的設計也有很大的幫助.
一、J2EE的模型-視圖-控制(MVC)體系結構
模型-視圖-控制結構是互動式應用程序廣泛使用的一種體系結構.它有效地在存儲和展示數據的對象中區分功能模塊以降低它們之間的連接度,這種體系結構將傳統的輸入、處理和輸入模型轉化為圖形顯示的用戶交互模型,或者換一種說法,是多層次的Web商業應用;MVC體系結構具有三個層面:模型(Model)、視圖(View)和控制(Controller),每個層面有其各自的功能作用,MVC體系結構如下:


圖1 MVC 體系結構
模型層負責表達和訪問商業數據,執行商業邏輯和操作.也就是說,這一層就是現實生活中功能的軟體模擬;在模型層變化的時候,它將通知視圖層並提供後者訪問自身狀態的能力,同時控制層也可以訪問其功能函數以完成相關的任務.
視圖層負責顯示模型層的內容.它從模型層取得數據並指定這些數據如何被顯示出來.在模型層變化的時候,它將自動更新.另外視圖層也會將用戶的輸入傳送給控制器.
控制層負責定義應用程序的行為.它可以分派用戶的請求並選擇恰當的視圖以用於顯示,同時它也可以解釋用戶的輸入並將它們映射為模型層可執行的操作;在一個圖形界面中,常見的用戶輸入包括點擊按鈕和菜單選擇.在Web應用中,它包括對Web層的HTTP GET和POST的請求;控制層可以基於用戶的交互和模型層的操作結果來選擇下一個可以顯示的視圖,一個應用程序通常會基於一組相關功能設定一個控制層的模塊,甚至一些應用程序會根據不同的用戶類型具有不同的控制層設定,這主要是由於不同用戶的視圖交互和選擇也是不同的.
在模型層、視圖層和控制層之間劃分責任可以減少代碼的重複度,並使應用程序維護起來更簡單.同時由於數據和商務邏輯的分開,在新的數據源加入和數據顯示變化的時候,數據處理也會變得更簡單.


二、J2EE設計模式
一個設計模式描述了對於特定設計問題被驗證的解決方案,它綜合了所有開發者對這個問題所在領域的知識和見解;同時也是對於常見問題的可重用方案,它們一般適用於單個問題,但是組織在一起就可以提供整個企業系統的解決方案.下面我們列舉八種常用於J2EE平台的設計模式,並對每種模式作簡單的介紹,便於大家學習、理解與靈活應用.
1、前控制器
前控制器(front controller)主要提供一種可以集中式管理請求的控制器,一個前控制器可以接受所有的客戶請求,將每個請求遞交給相應的請求句柄,並適當地響應用戶.
前控制器也是表示層的設計模式,它的出現主要是由於表示層通常需要控制和協調來自不同用戶的多個請求,而這種控制機制又根據不同的需要,可能會集中式控制或分散式控制.換句話說,就是應用系統需要對於表示層的請求提供一個集中式控制模塊,以提供各種系統服務,包括內容提取、視圖管理和瀏覽,如果系統中沒有這種集中式控制模塊或控制機制,每個不同的系統服務都需要進行單獨的視圖處理,這樣代碼的重複性就會提高,致使系統開發代價提高;同時,如果沒有一個固定模塊管理視圖之間的瀏覽機制,致使其瀏覽功能下放於每個不同的視圖中,最終必將是的系統的可維護性受到破壞;本文中我們主要討論的是集中式控制模塊,而不是分散式控制,前者更適合於大型的應用系統.
基於上面所說的問題,研究人員提出了前控制器的設計模式.在這種模式中,控制器提供一個處理不同請求的控制點,這裡的處理工作包括安全事務、視圖選擇、錯誤處理和響應內容的生成;通過將這些處理工作集中在一點進行,大大地減低了Java代碼量,同時這種方法也可以減少在視圖模塊的程序邏輯,保證了在不同請求之間可以重用大量的邏輯代碼.通常,控制器都是和一個分派組件聯合工作的,分派組件主要是用於視圖管理和瀏覽,也就是為用戶選擇下一個應該顯示的視圖,並同時提供對於相關顯示資源的控制.分派組件可以包含在控制器之內,或是在另外一個單獨的組件中;雖然前控制器模式推薦對於全部的請求使用統一處理,但是它也沒有限制在一個系統中只能具有一個控制器,在系統中的每個層次都可以具有多個控制器,並且映射至不同的系統服務,下圖2顯示了前控制器的類圖.

圖2 前控制器的類圖


圖3顯示了前控制器的序列圖,表示一個控制器如何處理相關的請求.

圖3前控制器序列圖
下面我們來討論一下圖3的各個組件.
2、控制器
控制器(controller)是負責處理各種客戶請求的控制點,並可以將一定的職能(如用戶認證等)下放給幫助類.
(1)分派組件(Dispatcher).一個分派組件主要是用於視圖的管理和瀏覽,為用戶選擇下一個可以顯示的視圖,並管理相關的顯示資源;分派組件可以在一個控制器內運行,或者作為一個單獨的組件與控制器協同工作;開發人員可以在分派組件中實現靜態的視圖分派技術,或是複雜的動態分派.
(2)幫助類(Helper).幫助類負責幫助一個視圖或控制器來完成其處理工作,因此,幫助類具有多項職責,包括收集數據、存儲中間數據模型等;另外,幫助類也可以在保證數據完整性和準確性的情況下,為不同顯示需求修改數據模型;也就是說,根據用戶的請求,幫助類可以向視圖提供未經處理的原始數據,或是已經格式化后的Web內容,一個視圖同時可以和多個幫助類協同工作,而後者通常是由JavaBeans和標籤(tag)實現的.
3、視圖
視圖(view)負責向用戶顯示信息,而幫助類則負責支持視圖的工作,即打包和建立相應的數據模型,下面我們介紹幾種可以實現控制器的方法.
1)基於Servlet前控制器
這種方法建議使用servlet來實現一個控制器,儘管在語法上相差無幾,但是它比使用JSP來實現要優越一些;控制器所進行的請求處理,多數都是與程序運行和控制流動相關的,這些處理工作雖然與顯示模式相關,但是實際上是邏輯獨立的,它們更適合在servlet中實現,而不是JSP技術中;使用這種方法也存在一些弱點,比如說servlet無法使用JSP運行環境的資源,如請求參數等,但是這個弱點也不是不能解決的,我們可以在servlet中建立相關的句柄來訪問同樣的資源,當然其代碼會變得繁瑣一點.
2)基於JSP的前控制器
這種方法建議使用JSP頁面實現控制器,儘管語法上相同,但是Servlet方案要比其優越一些;控制器所處理的邏輯一般都不是有關顯示模式的,在JSP頁面中實現控制器似乎有點風馬牛不相及;使用這種方法也不利於開發團隊的角色和職責的分配,即軟體開發人員需要在負責顯示邏輯的JSP頁面中修改請求處理的代碼,通常,這種工作都是相當複雜的,尤其考慮整個JSP頁面的編程、編譯、測試和調試錯誤.


3)控制器之中的分派組件
如果分派組件沒有較多功能,開發人員可以在控制器實現該組件.
4)基礎前端
基於使用servlet實現前控制器,這種方案建議實現一個控制器作為基礎類,這樣其他的控制器可以在其之上擴展;這個基礎類可以包含一些通用的邏輯實現,它的子類就會重載這些實現代碼,這種方法也有一定的缺陷,當有許多子類繼承這個基礎類,並大量地重用代碼時,那麼就有可能出現一個類的改變會影響到所有子類的情況.
5)用過濾器實現前控制器
過濾器提供了與用戶請求的中心處理相類似的功能,也就是說,控制器的一些功能可以由過濾器來實現,這種方案的過濾器主要負責處理請求的截取和解釋,而不是請求的處理和響應的生成;通常可以為應用系統提供一個核心控制點,以處理所有的系統服務和程序邏輯,核心控制也就表明了所有的請求都可以簡單地被跟蹤和記錄,從而方便各種服務功能的實施;當然,它也存在一些缺點,一個核心控制點的小問題可能會引發系統的崩潰,但在應用系統的實際開發中,這並不是個問題,通常我們都會在同一個層面上實現多個控制器,從而避免了這個缺陷;在控制器中,開發人員可以很方便地實現一個檢查安全機制的組件,從而可以在最外層屏蔽對系統的惡意訪問,另外使用控制器也會提高系統模塊的可重用性,尤其在控制器同時使用幫助類的時候.
4、視圖幫助
視圖幫助(View helper)是屬於表示層的設計模式,一個視圖幫助可以包含相關視圖中的數據訪問和內容顯示的邏輯,並可以精鍊簡化視圖;顯示邏輯主要是關於如何格式化頁面上的數據,而訪問邏輯則是關於如何取出數據,視圖幫助通常用來顯示數據的JSP標記(tag)或是讀取數據的JavaBean.
這種設計模式的出現主要是由於目前的應用系統通常需要實時地開發顯示內容,並且能處理動態的程序數據.如果這些程序數據的訪問邏輯和顯示邏輯的關係過於緊密,則系統的表示層就會經常需要改動,從而系統的靈活性、重用性會大大地受到破壞;同時在相同的模塊中實現訪問邏輯和顯示邏輯將會影響系統的模塊化,也會是的開發團隊的任務劃分不清.
一個視圖通常包含格式化信息,並將其處理任務分發給自己的幫助類,後者通常是用JavaBeans或標記(tag)來實現的,幫助類同時可以存儲視圖的中間數據模型並實現數據適配器的功能,即適當地轉化數據格式;開發人員可以採用多種方法實現視圖組件,通常,開發人員可以使用JSP來實現,並且這也是一種值得推薦的方法.當然,相應地開發人員也可以使用Servlet來實現它,將視圖中一定的程序邏輯植入到幫助類中,會有利於應用系統的模塊化和可重用性.系統可以使用同一個幫助類為不同的用戶顯示不同的數據信息,並在不同的顯示格式下顯示;通常,如果開發人員發現視圖的JSP頁面中存在大量的腳本代碼時,就可以考慮使用視圖幫助這種模式了,在這種情況下,基本都是程序邏輯和顯示邏輯具有過於緊密的聯繫;這時開發人員可以將一些適用於所有類型的請求的邏輯處理放置到一定的幫助類中,而根據需要,也可以將另外一些邏輯處理放置在視圖層上的其他程序模塊中,比如說以前討論過的截取過濾器.


視圖幫助這種模式的設計理念主要是分離應用系統的邏輯職責,下面我們提供一些圖示,以方便大家更好地理解這種模式.
圖4以類圖(class diagram)的形式說明了視圖幫助的系統結構.

圖4 視圖幫助類圖
圖5表示了視圖幫助模式的序列圖,它表明了這種模式中的主要成分及互相之間的運行情況;不過需要說明的是,在很多應用系統中,客戶端和視圖層之間會存在一個控制器加以適當的調節.

圖5視圖幫助序列圖
在類圖表中,大家可以發現,可能存在沒有任何相關幫助類的視圖,這種情況下,通常代表視圖的JSP頁面會有一些靜態的或小數量的腳本代碼.
這裡我們對於序列圖中的各個元素加以簡單的介紹:
(1)視圖(view).視圖負責向用戶展示動態數據信息,而幫助類則負責支持視圖的工作,即打包和建立相應的數據模型.
(2)幫助類(helper).一個幫助類負責幫助視圖或控制器完成相關的處理工作,包括收集數據、存儲中間模型等;幫助類也可以在保證數據完整性和準確性的情況下,為不同顯示需求修改數據模型,也就是說,根據用戶的請求,幫助類可以向視圖提供未經處理的原始數據,或是已經格式化后的Web內容;一個視圖同時可以和多個幫助類協同工作,而後者通常是由JavaBeans和標記(tag)實現的.
(3)值bean(ValueBean).值bean實際上是用於存儲中間數據模型的幫助類的另一種叫法,例如在序列圖5中,business service就根據請求返回了一個值bean.
(4)業務服務(business service).業務服務是指用戶試圖得到的,應用系統可以提供的相關服務;通常來說,業務服務可以通過一個業務代表(business delegate)來訪問,而後者主要是提供對於業務服務的控制和保護.
在應用系統的視圖模塊中使用幫助類可以將不同的程序邏輯很好地分離開來,並在視圖模塊之外為開發人員提供設計程序邏輯的空間;基於JavaBean和標記(tag)所開發的幫助類通常都可以被多個視圖模塊重用,因此也提高了組件的重用性和可維護性;把顯示邏輯從數據處理邏輯分離出來,也有利於開發團隊中角色及人物的劃分;比如說,如果各種程序邏輯過於結合的話,軟體開發人員可能需要在HTML,網頁中修改代碼而Web設計師則需要在處理數據訪問的JSP中修改頁面布置,這些情況都可能會導致系統設計和開發中由於不同技術人員的介入,而產生相關的問題.


5、會話面
會話面(session facade)模式在合作的企業對象間調節操作,並將應用函數合成一個單一簡單的界面;它減少了類之間合作的複雜性,並是的類的調用者在該類變化的時候無需改動,這種模式通常以一個會話bean實現,以用來隱藏底層ejb的複雜交互.
這種設計模式出現的背景在於EJB通常既包括程序數據,又包括程序邏輯,而這些代碼都會通過一定的界面作用於客戶層,在多層次的J2EE平台應用程序中,就會造成一定的困難.
具體來說,在J2EE平台上的多層次系統中,通常會存在以下的問題:
(1)層次之間聯繫過於緊密,客戶層和後端的業務對象具有較強的依賴關係;
(2)在客戶和伺服器之間有多次方法調用,因而導致了Web性能方面的問題;
(3)缺乏一定的客戶訪問機制,是的一些後台對象被隨便訪問.
一個多層次的J2EE應用程序通常具有很多由EJB實現的伺服器端對象,它們通常負責提供系統服務、數據信息等,也就是說作為業務對象,它們既包括相關的程序數據,也包括其程序邏輯;在J2EE應用系統中,負責程序邏輯的對象通常由會話bean實現,而表示持久性存儲,並在多個用戶間共享的對象則由實體bean來實現;當然,應用系統的用戶需要訪問企業對象來滿足自己的需求,如果企業對象向用戶提供介面,用戶可以直接地與相關對象通信,但是這樣一來,用戶必須負責管理所調用的企業對象之間的關係,並且能夠處理其間的業務流程;然而,如果用戶和業務對象之間存在過於直接的交互,兩者的聯繫就會過於緊密,同時也是的用戶過於依賴企業對象的具體實現,並負責管理與交互過程有關的業務對象查找和創建,以及不同的對象間相互調用的關係,甚至一些時候用戶還需要管理多次調用之間的事務管理環節.
在用戶需求不斷增加時,這也是應用系統經常發生的情況,用戶與不同的企業對象之間的交互也會變得越來越複雜,而企業對象可能需要一定內部的更新才能滿足前者的需要,但是這樣的話用戶又需要根據企業對象實現的變化而做出相應的改變,這種情況將為應用系統帶來相當大的麻煩;在訪問EJB應用系統時,用戶需要與遠程對象進行交互.如果用戶直接與所有相關的業務對象交互的話,將帶來很大的Web負擔;對於每一個ejb的激活,都將產生一次遠程的調用,而如果存在大量的系統用戶,用戶與對象間的交互就將為Web通信帶來很大的壓力,使系統性能受到很大破壞;如果用戶可以直接訪問後端的企業對象,但是系統中又缺少一個統一的用戶訪問機制,那麼這些訪問很有可能變得雜亂無章,引起系統性能的下降,甚至導致一些安全問題.


為了解決以上的問題,開發人員可以採用會話面的設計模式,即使用會話bean來實現一個面(facade)來包含一個工作流中所有相關對象的交互;這個會話面負責管理業務對象,並向用戶提供一個統一的服務訪問層,會話面可以面向底層對象的交互過程,並提供一個僅僅包含必須提供的介面的服務層,由此它將複雜的對象交互和用戶之間隔離開來; 會話面也負責管理企業數據和企業對象之間的交互,並表達其中需要的企業邏輯,因此會話面也可以管理企業對象之間的作用關係;同時,根據工作流的需要,會話面也管理對象的創建、查找、修改和刪除.
在一個複雜的應用系統中,會話面可以將其生命周期的管理下放到一個單獨的幫助對象去,比如說,會話面可以將管理會話和實體bean生命周期的工作交給服務定位對象; 同時,在應用系統中,檢查業務對象之間的作用關係也是非常重要的,一些關係可能是暫時的,即只使用於一定的交互過程,而另外一些關係則是永久的,暫時的關係適合建模於會話面中的工作流,永久的關係則需要具體情況具體分析.


[火星人 ] J2EE模型及J2EE設計模式已經有289次圍觀

http://coctec.com/docs/java/show-post-59948.html