日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
J2EE的MVC體系結(jié)構(gòu)及其設(shè)計模式

目前大多數(shù)企業(yè)采用J2EE技術(shù)的結(jié)構(gòu)設(shè)計與解決方案。對于我們學(xué)習(xí)和研究J2EE體系結(jié)構(gòu)來說,了解與掌握J2EE體系結(jié)構(gòu)的設(shè)計方法及一些常用模式是必須的;模型-視圖-控制(model-view-control,簡稱MVC)結(jié)構(gòu)是目前最常見的J2EE應(yīng)用所基于的體系結(jié)構(gòu),MVC主要適用于交互式的Web應(yīng)用,尤其是存在大量頁面及多次客戶訪問及數(shù)據(jù)顯示;相比較而言,一個工作流體系結(jié)構(gòu)更多應(yīng)用于過程控制和較少交互的情況下;除了體系結(jié)構(gòu)外,J2EE的設(shè)計模式對我們解決應(yīng)用系統(tǒng)的設(shè)計也有很大的幫助。

創(chuàng)新互聯(lián)專注于錦州網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供錦州營銷型網(wǎng)站建設(shè),錦州網(wǎng)站制作、錦州網(wǎng)頁設(shè)計、錦州網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造錦州網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供錦州網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

一、J2EE的模型-視圖-控制(MVC)體系結(jié)構(gòu)

模型-視圖-控制結(jié)構(gòu)是交互式應(yīng)用程序廣泛使用的一種體系結(jié)構(gòu)。它有效地在存儲和展示數(shù)據(jù)的對象中區(qū)分功能模塊以降低它們之間的連接度,這種體系結(jié)構(gòu)將傳統(tǒng)的輸入、處理和輸入模型轉(zhuǎn)化為圖形顯示的用戶交互模型,或者換一種說法,是多層次的Web商業(yè)應(yīng)用;MVC體系結(jié)構(gòu)具有三個層面:模型(Model)、視圖(View)和控制(Controller),每個層面有其各自的功能作用,MVC體系結(jié)構(gòu)如下:

J2EE的MVC體系結(jié)構(gòu)及其設(shè)計模式

圖1 MVC 體系結(jié)構(gòu)

模型層負責(zé)表達和訪問商業(yè)數(shù)據(jù),執(zhí)行商業(yè)邏輯和操作。也就是說,這一層就是現(xiàn)實生活中功能的軟件模擬;在模型層變化的時候,它將通知視圖層并提供后者訪問自身狀態(tài)的能力,同時控制層也可以訪問其功能函數(shù)以完成相關(guān)的任務(wù)。

視圖層負責(zé)顯示模型層的內(nèi)容。它從模型層取得數(shù)據(jù)并指定這些數(shù)據(jù)如何被顯示出來。在模型層變化的時候,它將自動更新。另外視圖層也會將用戶的輸入傳送給控制器。

控制層負責(zé)定義應(yīng)用程序的行為。它可以分派用戶的請求并選擇恰當?shù)囊晥D以用于顯示,同時它也可以解釋用戶的輸入并將它們映射為模型層可執(zhí)行的操作;在一個圖形界面中,常見的用戶輸入包括點擊按鈕和菜單選擇。在Web應(yīng)用中,它包括對Web層的HTTP GET和POST的請求;控制層可以基于用戶的交互和模型層的操作結(jié)果來選擇下一個可以顯示的視圖,一個應(yīng)用程序通常會基于一組相關(guān)功能設(shè)定一個控制層的模塊,甚至一些應(yīng)用程序會根據(jù)不同的用戶類型具有不同的控制層設(shè)定,這主要是由于不同用戶的視圖交互和選擇也是不同的。

在模型層、視圖層和控制層之間劃分責(zé)任可以減少代碼的重復(fù)度,并使應(yīng)用程序維護起來更簡單。同時由于數(shù)據(jù)和 商務(wù) 邏輯的分開,在新的數(shù)據(jù)源加入和數(shù)據(jù)顯示變化的時候,數(shù)據(jù)處理也會變得更簡單。

二、J2EE設(shè)計模式

一個設(shè)計模式描述了對于特定設(shè)計問題被驗證的解決方案,它綜合了所有開發(fā)者對這個問題所在領(lǐng)域的知識和見解;同時也是對于常見問題的可重用方案,它們一般適用于單個問題,但是組織在一起就可以提供整個企業(yè)系統(tǒng)的解決方案。下面我們列舉八種常用于J2EE平臺的設(shè)計模式,并對每種模式作簡單的介紹,便于大家學(xué)習(xí)、理解與靈活應(yīng)用。

1、前控制器

前控制器(front controller)主要提供一種可以集中式 管理 請求的控制器,一個前控制器可以接受所有的客戶請求,將每個請求遞交給相應(yīng)的請求句柄,并適當?shù)仨憫?yīng)用戶。

前控制器也是表示層的設(shè)計模式,它的出現(xiàn)主要是由于表示層通常需要控制和協(xié)調(diào)來自不同用戶的多個請求,而這種控制機制又根據(jù)不同的需要,可能會集中式控制或分散式控制。換句話說,就是應(yīng)用系統(tǒng)需要對于表示層的請求提供一個集中式控制模塊,以提供各種系統(tǒng)服務(wù),包括內(nèi)容提取、視圖管理和瀏覽,如果系統(tǒng)中沒有這種集中式控制模塊或控制機制,每個不同的系統(tǒng)服務(wù)都需要進行單獨的視圖處理,這樣代碼的重復(fù)性就會提高,致使系統(tǒng)開發(fā)代價提高;同時,如果沒有一個固定模塊管理視圖之間的瀏覽機制,致使其瀏覽功能下放于每個不同的視圖中,最終必將使得系統(tǒng)的可維護性受到破壞;本文中我們主要討論的是集中式控制模塊,而不是分散式控制,因為前者更適合于大型的應(yīng)用系統(tǒng)。

基于上面所說的問題,研究人員提出了前控制器的設(shè)計模式。在這種模式中,控制器提供一個處理不同請求的控制點,這里的處理工作包括安全事務(wù)、視圖選擇、錯誤處理和響應(yīng)內(nèi)容的生成;通過將這些處理工作集中在一點進行,大大地減低了Java代碼量,同時這種方法也可以減少在視圖模塊的程序邏輯,保證了在不同請求之間可以重用大量的邏輯代碼。通常,控制器都是和一個分派組件聯(lián)合工作的,分派組件主要是用于視圖管理和瀏覽,也就是為用戶選擇下一個應(yīng)該顯示的視圖,并同時提供對于相關(guān)顯示資源的控制。分派組件可以包含在控制器之內(nèi),或是在另外一個單獨的組件中;雖然前控制器模式推薦對于全部的請求使用統(tǒng)一處理,但是它也沒有限制在一個系統(tǒng)中只能具有一個控制器,在系統(tǒng)中的每個層次都可以具有多個控制器,并且映射至不同的系統(tǒng)服務(wù),下圖2顯示了前控制器的類圖。

圖2 前控制器的類圖

圖3顯示了前控制器的序列圖,表示一個控制器如何處理相關(guān)的請求。

圖3前控制器序列圖

下面我們來討論一下圖3的各個組件。

2、控制器

控制器(controller)是負責(zé)處理各種客戶請求的控制點,并可以將一定的職能(如用戶認證等)下放給幫助類。

(1)分派組件(Dispatcher)。一個分派組件主要是用于視圖的管理和瀏覽,為用戶選擇下一個可以顯示的視圖,并管理相關(guān)的顯示資源;分派組件可以在一個控制器內(nèi)運行,或者作為一個單獨的組件與控制器協(xié)同工作;開發(fā)人員可以在分派組件中實現(xiàn)靜態(tài)的視圖分派技術(shù),或是復(fù)雜的動態(tài)分派。

(2)幫助類(Helper)。幫助類負責(zé)幫助一個視圖或控制器來完成其處理工作,因此,幫助類具有多項職責(zé),包括收集數(shù)據(jù)、存儲中間數(shù)據(jù)模型等;另外,幫助類也可以在保證數(shù)據(jù)完整性和準確性的情況下,為不同顯示需求修改數(shù)據(jù)模型;也就是說,根據(jù)用戶的請求,幫助類可以向視圖提供未經(jīng)處理的原始數(shù)據(jù),或是已經(jīng)格式化后的Web內(nèi)容,一個視圖同時可以和多個幫助類協(xié)同工作,而后者通常是由JavaBeans和標簽(tag)實現(xiàn)的。

3、視圖

視圖(view)負責(zé)向用戶顯示信息,而幫助類則負責(zé)支持視圖的工作,即打包和建立相應(yīng)的數(shù)據(jù)模型,下面我們介紹幾種可以實現(xiàn)控制器的方法。

1)基于Servlet前控制器

這種方法建議使用servlet來實現(xiàn)一個控制器,盡管在語法上相差無幾,但是它比使用JSP來實現(xiàn)要優(yōu)越一些;因為控制器所進行的請求處理,多數(shù)都是與程序運行和控制流動相關(guān)的,這些處理工作雖然與顯示模式相關(guān),但是實際上是邏輯獨立的,所以它們更適合在servlet中實現(xiàn),而不是JSP技術(shù)中;使用這種方法也存在一些弱點,比如說servlet無法使用JSP運行環(huán)境的資源,如請求參數(shù)等,但是這個弱點也不是不能解決的,我們可以在servlet中建立相關(guān)的句柄來訪問同樣的資源,當然其代碼會變得繁瑣一點。

2)基于JSP的前控制器

這種方法建議使用JSP頁面實現(xiàn)控制器,盡管語法上相同,但是Servlet方案要比其優(yōu)越一些;因為控制器所處理的邏輯一般都不是有關(guān)顯示模式的,所以在JSP頁面中實現(xiàn)控制器似乎有點風(fēng)馬牛不相及;使用這種方法也不利于開發(fā)團隊的角色和職責(zé)的分配,即軟件開發(fā)人員需要在負責(zé)顯示邏輯的JSP頁面中修改請求處理的代碼,通常,這種工作都是相當復(fù)雜的,尤其考慮整個JSP頁面的編程、編譯、測試和調(diào)試錯誤。

3)控制器之中的分派組件

如果分派組件沒有較多功能,開發(fā)人員可以在控制器實現(xiàn)該組件。

4)基礎(chǔ)前端

基于使用servlet實現(xiàn)前控制器,這種方案建議實現(xiàn)一個控制器作為基礎(chǔ)類,這樣其他的控制器可以在其之上擴展;這個基礎(chǔ)類可以包含一些通用的邏輯實現(xiàn),它的子類就會重載這些實現(xiàn)代碼,這種方法也有一定的缺陷,當有許多子類繼承這個基礎(chǔ)類,并大量地重用代碼時,那么就有可能出現(xiàn)一個類的改變會影響到所有子類的情況。

5)用過濾器實現(xiàn)前控制器

過濾器提供了與用戶請求的中心處理相類似的功能,也就是說,控制器的一些功能可以由過濾器來實現(xiàn),這種方案的過濾器主要負責(zé)處理請求的截取和解釋,而不是請求的處理和響應(yīng)的生成;通常可以為應(yīng)用系統(tǒng)提供一個核心控制點,以處理所有的系統(tǒng)服務(wù)和程序邏輯,核心控制也就表明了所有的請求都可以簡單地被跟蹤和記錄,從而方便各種服務(wù)功能的實施;當然,它也存在一些缺點,一個核心控制點的小問題可能會引發(fā)系統(tǒng)的崩潰,但在應(yīng)用系統(tǒng)的實際開發(fā)中,這并不是個問題,因為通常我們都會在同一個層面上實現(xiàn)多個控制器,從而避免了這個缺陷;在控制器中,開發(fā)人員可以很方便地實現(xiàn)一個檢查安全機制的組件,從而可以在最外層屏蔽對系統(tǒng)的惡意訪問,另外使用控制器也會提高系統(tǒng)模塊的可重用性,尤其在控制器同時使用幫助類的時候。

4、視圖幫助

視圖幫助(View helper)是屬于表示層的設(shè)計模式,一個視圖幫助可以包含相關(guān)視圖中的數(shù)據(jù)訪問和內(nèi)容顯示的邏輯,并可以精煉簡化視圖;顯示邏輯主要是關(guān)于如何格式化頁面上的數(shù)據(jù),而訪問邏輯則是關(guān)于如何取出數(shù)據(jù),視圖幫助通常用來顯示數(shù)據(jù)的JSP標記(tag)或是讀取數(shù)據(jù)的JavaBean。

這種設(shè)計模式的出現(xiàn)主要是由于目前的應(yīng)用系統(tǒng)通常需要實時地開發(fā)顯示內(nèi)容,并且能處理動態(tài)的程序數(shù)據(jù)。如果這些程序數(shù)據(jù)的訪問邏輯和顯示邏輯的關(guān)系過于緊密,則系統(tǒng)的表示層就會經(jīng)常需要改動,從而系統(tǒng)的靈活性、重用性會大大地受到破壞;同時在相同的模塊中實現(xiàn)訪問邏輯和顯示邏輯將會影響系統(tǒng)的模塊化,也會使得開發(fā)團隊的任務(wù)劃分不清。

一個視圖通常包含格式化信息,并將其處理任務(wù)分發(fā)給自己的幫助類,后者通常是用JavaBeans或標記(tag)來實現(xiàn)的,幫助類同時可以存儲視圖的中間數(shù)據(jù)模型并實現(xiàn)數(shù)據(jù)適配器的功能,即適當?shù)剞D(zhuǎn)化數(shù)據(jù)格式;開發(fā)人員可以采用多種方法實現(xiàn)視圖組件,通常,開發(fā)人員可以使用JSP來實現(xiàn),并且這也是一種值得推薦的方法。當然,相應(yīng)地開發(fā)人員也可以使用Servlet來實現(xiàn)它,將視圖中一定的程序邏輯植入到幫助類中,會有利于應(yīng)用系統(tǒng)的模塊化和可重用性。系統(tǒng)可以使用同一個幫助類為不同的用戶顯示不同的數(shù)據(jù)信息,并在不同的顯示格式下顯示;通常,如果開發(fā)人員發(fā)現(xiàn)視圖的JSP頁面中存在大量的腳本代碼時,就可以考慮使用視圖幫助這種模式了,因為在這種情況下,基本都是程序邏輯和顯示邏輯具有過于緊密的聯(lián)系;這時開發(fā)人員可以將一些適用于所有類型的請求的邏輯處理放置到一定的幫助類中,而根據(jù)需要,也可以將另外一些邏輯處理放置在視圖層上的其他程序模塊中,比如說以前討論過的截取過濾器。

視圖幫助這種模式的設(shè)計理念主要是分離應(yīng)用系統(tǒng)的邏輯職責(zé),下面我們提供一些圖示,以方便大家更好地理解這種模式。

圖4以類圖(class diagram)的形式說明了視圖幫助的系統(tǒng)結(jié)構(gòu)。

圖4 視圖幫助類圖

圖5表示了視圖幫助模式的序列圖,它表明了這種模式中的主要成分及互相之間的運行情況;不過需要說明的是,在很多應(yīng)用系統(tǒng)中,客戶端和視圖層之間會存在一個控制器加以適當?shù)恼{(diào)節(jié)。

圖5視圖幫助序列圖

在類圖表中,大家可以發(fā)現(xiàn),可能存在沒有任何相關(guān)幫助類的視圖,這種情況下,通常代表視圖的JSP頁面會有一些靜態(tài)的或小數(shù)量的腳本代碼。

這里我們對于序列圖中的各個元素加以簡單的介紹:

(1)視圖(view)。視圖負責(zé)向用戶展示動態(tài)數(shù)據(jù)信息,而幫助類則負責(zé)支持視圖的工作,即打包和建立相應(yīng)的數(shù)據(jù)模型。

(2)幫助類(helper)。一個幫助類負責(zé)幫助視圖或控制器完成相關(guān)的處理工作,包括收集數(shù)據(jù)、存儲中間模型等;幫助類也可以在保證數(shù)據(jù)完整性和準確性的情況下,為不同顯示需求修改數(shù)據(jù)模型,也就是說,根據(jù)用戶的請求,幫助類可以向視圖提供未經(jīng)處理的原始數(shù)據(jù),或是已經(jīng)格式化后的Web內(nèi)容;一個視圖同時可以和多個幫助類協(xié)同工作,而后者通常是由JavaBeans和標記(tag)實現(xiàn)的。

(3)值bean(ValueBean)。值bean實際上是用于存儲中間數(shù)據(jù)模型的幫助類的另一種叫法,例如在序列圖5中,business service就根據(jù)請求返回了一個值bean。

(4)業(yè)務(wù)服務(wù)(business service)。業(yè)務(wù)服務(wù)是指用戶試圖得到的,應(yīng)用系統(tǒng)可以提供的相關(guān)服務(wù);通常來說,業(yè)務(wù)服務(wù)可以通過一個業(yè)務(wù)代表(business delegate)來訪問,而后者主要是提供對于業(yè)務(wù)服務(wù)的控制和保護。

在應(yīng)用系統(tǒng)的視圖模塊中使用幫助類可以將不同的程序邏輯很好地分離開來,并在視圖模塊之外為開發(fā)人員提供設(shè)計程序邏輯的空間;基于JavaBean和標記(tag)所開發(fā)的幫助類通常都可以被多個視圖模塊重用,因此也提高了組件的重用性和可維護性;把顯示邏輯從數(shù)據(jù)處理邏輯分離出來,也有利于開發(fā)團隊中角色及人物的劃分;比如說,如果各種程序邏輯過于結(jié)合的話,軟件開發(fā)人員可能需要在HTML,網(wǎng)頁中修改代碼而Web設(shè)計師則需要在處理數(shù)據(jù)訪問的JSP中修改頁面布置,這些情況都可能會導(dǎo)致系統(tǒng)設(shè)計和開發(fā)中由于不同技術(shù)人員的介入,而產(chǎn)生相關(guān)的問題。

【編輯推薦】

  1. 簡析J2EE應(yīng)用程序中數(shù)據(jù)庫類的設(shè)計模式
  2. J2EE設(shè)計模式之Template
  3. 如何優(yōu)化JavaScript腳本的性能
  4. J2EE設(shè)計模式之State模式
  5. 簡析J2EE應(yīng)用程序中數(shù)據(jù)庫類的設(shè)計模式

 


網(wǎng)站欄目:J2EE的MVC體系結(jié)構(gòu)及其設(shè)計模式
網(wǎng)站鏈接:http://www.dlmjj.cn/article/cohgsce.html