通過 JSP Model 深入學習 MVC
動態Web程式設計技術的發展歷史
使用 JSP 技術開發 Web 應用程式, 有兩種架構模型可供選擇. 通常稱為 Model1和 Model2.
所謂Model 1 就是JSP大行其道的時代,在Model 1模式下,整個Web應用幾乎全部由JSP頁面組成,JSP頁面接收處理客戶端請求,對請求處理後直接做出響應。用少量的JavaBean來處理資料庫連線、資料庫訪問等操作。如下圖:
Model 1 模式的實現比較簡單,適用於快速開發小規模專案。但從工程化的角度看,它的侷限性非常明顯:JSP頁面身兼View和Controller兩種角色,將控制邏輯和表現邏輯混雜在一起,從而導致程式碼的重用性非常低,增加了應用的擴充套件性和維護的難度。
早期有大量ASP和JSP技術開發出來的Web應用,這些Web應用都採用了Model 1架構。
Model 2 模式是基於MVC架構的設計模式。在Model 2架構中,Servlet作為前端控制器,負責接收客戶端傳送的請求,在Servlet中只包含控制邏輯和簡單的前端處理;然後,呼叫後端JavaBean來完成實際的邏輯處理;最後,轉發到相應的JSP頁面處理顯示邏輯。如下圖:
Model 2下JSP不再承擔控制器的責任,它僅僅是表現層角色,僅僅用於將結果呈現給使用者,JSP頁面的請求與Servlet(控制器)互動,而Servlet負責與後臺的JavaBean通訊。在Model 2模式下,模型(Model)由JavaBean 充當,檢視(View)由JSP頁面充當,而控制器(Controller)則由Servlet充當。
由於引入了MVC模式,使Model 2具有元件化的特點,更適用於大規模應用的開發,但也增加了應用開發的複雜程度。原本需要一個簡單的JSP頁面就能實現的應用,在Model 2中被分解成多個協同工作的部分,需花更多時間才能真正掌握其設計和實現過程。
注意 對於非常小型的Web站點,如果後期的更新、維護工作不是特別大,可以使用Model 1的模式來開發應用,而不是使用Model 2的模式。雖然Model 2提供了更好的可擴充套件性及可維護性,但增加了前期開發成本。從某種程度上講,Model 2為了降低系統後期維護的複雜度,卻導致前期開發的更高複雜度。
MVC並不是Java語言所特有的設計思想,也並不是Web應用所特有的思想,它是所有物件導向程式設計語言都應該遵守的規範。
MVC思想將一個應用分成三個基本部分:Model(模型)、View(檢視)和Controller(控制器),這三個部分以最少的耦合協同工作,從而提高應用的可擴充套件性及可維護性。
起初,MVC模式是針對相同的資料需要不同顯示的應用而設計的,其整體的效果如下圖所示。
在經典的MVC模式中,事件由控制器處理,控制器根據事件的型別改變模型或檢視,反之亦然。具體地說,每個模型對應一系列的檢視列表,這種對應關係通常採用註冊來完成,即:把多個檢視註冊到同一個模型,當模型發生改變時,模型向所有註冊過的檢視傳送通知,接下來,檢視從對應的模型中獲得資訊,然後完成檢視顯示的更新。
從設計模式的角度來看,MVC思想非常類似於一個觀察者模式,但與觀察者模式存在少許差別:觀察者模式下觀察者和被觀察者可以是兩個互相對等的物件,但對於MVC思想而言,被觀察者往往只是單純的資料體,而觀察者則是單純的檢視頁面。
概括起來,MVC有如下特點:
1、多個檢視可以對應一個模型。按MVC設計模式,一個模型對應多個檢視,可以減少程式碼的複製及程式碼的維護量,一旦模型發生改變,也易於維護。
2、模型返回的資料與顯示邏輯分離。模型資料可以應用任何的顯示技術,例如,使用JSP頁面、Velocity模板或者直接產生Excel文件等。
3、應用被分隔為三層,降低了各層之間的耦合,提供了應用的可擴充套件性。
4、控制層的概念也很有效,由於它把不同的模型和不同的檢視組合在一起,完成不同的請求。因此,控制層可以說是包含了使用者請求許可權的概念。
5、MVC更符合軟體工程化管理的精神。不同的層各司其職,每一層的元件具有相同的特徵,有利於通過工程化和工具化產生管理程式程式碼。
6、相對於早期的MVC思想,Web模式下的MVC思想則又存在一些變化,因為對於一個應用程式而言,我們可以將檢視註冊給模型,當模型資料發生改變時,即時通知檢視頁面發生改變;而對於Web應用而言,即使將多個JSP頁面註冊給一個模型,當模型發生變化時,模型無法主動傳送訊息給JSP頁面(因為Web應用都是基於請求/響應模式的),只有當使用者請求瀏覽該頁面時,控制器才負責呼叫模型資料來更新JSP頁面。
注意 MVC思想與觀察者模式有一定的相似之處,但並不完全相同。經典的MVC思想與Web應用的MVC思想也存在一定的差別,引起差別的主要原因是因為Web應用是一種請求/響應模式下應用,對於請求/響應應用,如果使用者不對應用發出請求,檢視無法主動更新自己。
相關文件:詳細介紹JSP技術的兩種架構模型
相關文章
- 通過示例學習PYTORCHPyTorch
- RLHF · PBRL | PEBBLE:透過 human preference 學習 reward model
- 【ITOO】--MVC學習MVC
- JSP指令學習JS
- 通過例項學習 PyTorchPyTorch
- 通過示例學習使用 netstat
- 通過例項學習 tcpdump 命令TCP
- 通過 GDB 學習 C 語言
- Phalcon學習-model
- MVC學習筆記MVC筆記
- Spring MVC學習SpringMVC
- 通過動效學習UI設計UI
- 通過原始碼學習ListView(大章)原始碼View
- 通過Struts應用MVC設計模型MVC模型
- 逐步學習什麼是遞迴?通過使用場景來深入認識遞迴。遞迴
- YYModel學習筆記筆記
- ASP.NET MVC系列:ModelASP.NETMVC
- Binder學習(三)通過AIDL分析Binder通訊流程AI
- Spring mvc學習指南SpringMVC
- 在ASP.NET MVC中使用Knockout實踐02,組合View Model成員、Select繫結、通過構造器建立View Model,擴充套件View Model方法ASP.NETMVCView套件
- 通過原始碼學習@functools.lru_cache原始碼
- [譯] 通過整合學習提高機器學習結果機器學習
- [譯] 通過構建 Observable 來學習 Observable
- 通過示例學習Python列表推導Python
- Bootstrap for MVC:Html.Bootstrap().TextBoxFor(model=>model.Name)bootMVCHTML
- Java學習--Jsp簡介JavaJS
- 深入學習synchronizedsynchronized
- YYCache深入學習
- 深入學習 vueVue
- 深入淺出——MVCMVC
- 深入理解MVCMVC
- QT5學習 QFileSystemModelQT
- 學習JSP過程中看JiveJdon2.5好,還是3.0好?JS
- MVC 繫結 集合型別 modelMVC型別
- 【深入學習JVM 04】回收“已死”物件的過程JVM物件
- JVM 深入學習:Java 解析 Class 檔案過程解析JVMJava
- iOS學習之深入理解程式編譯過程iOS編譯
- SpringBoot學習之mvcSpring BootMVC