IT兄弟連 JavaWeb教程 MVC設計模式

  • 2019 年 10 月 5 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/ITXDL123/article/details/90089804

MVC是Model-View-Controller的簡稱,即模型-視圖-控制器。MVC是一種設計模式,它強制性地把應用程式的數據展示、數據處理和流程式控制制分開。MVC把應用程式分成3個核心模組:模型、視圖和控制器,它們分別擔當不同的任務。圖1顯示了這幾個模組各自的功能及它們的相互關係。

圖1 MVC設計模式

1 視圖

視圖是用戶看到並與之交互的介面。視圖向用戶顯示相關的數據,並能接收用戶的輸入數據,但是它並不進行任何實際的業務處理。視圖可以向模型查詢業務狀態,但不能改變模型。視圖還能接收模型發出的數據更新事件,從而對用戶介面進行同步更新。

2 模型

模型是應用程式的主體部分。模型表示業務數據和業務邏輯,一個模型能為多個視圖提供數據。由於同一個模型可以被多個視圖重用,所以提高了模型的可重用性。

3 控制器

控制器負責應用的流程式控制制。所謂流程式控制制,這裡是指接收用戶的輸入並調用相應的模型和視圖去完成用戶的需求。當Web用戶單擊Web介面中的"提交"按鈕來發送HTML表單時,控制器會接收請求並調用相應的模型組件去處理請求,然後在調用相應的視圖來顯示模型返回的數據。

4 MVC處理過程

我們來總結一下MVC處理過程,首先控制器接收用戶的請求,並決定應該調用那個模型來進行處理;然後模型根據客戶請求進行相應的業務邏輯處理,並返回數據。最後控制器調用相應的視圖來格式化模型返回的數據,並通過視圖呈現給用戶。

5 MVC的優點

在最初的JSP網頁中,像資料庫查詢語句這樣的數據訪問程式碼和像HTML這樣的表示層程式碼是混在一起的。經驗比較豐富的開發者會將資料庫訪問程式碼從表示層分離開來,但這通常不是很容易做到的,它需要精心的設計和不斷地嘗試,MVC從根本上強制性地將他們分開。儘管構成MVC應用程式需要一些額外的工作,但是它給開發人員帶了的諸多優點是毋庸置疑的。

首先,多個視圖能共享一個模型。如今,同一個Web應用程式會提供多種用戶介面,例如用戶即希望能通過瀏覽器來收發電子郵件,還希望通過手機來訪問電子郵箱,這就要求Web網站同時提供Web介面和WAP介面。在MVC設計模式中,模型響應客戶請求並返迴響應數據,視圖負責格式化數據並把他們呈現給用戶,業務邏輯和表示層分離。同一個模型可以被不同的視圖重用,所以大大提高了程式碼的可重用性。

其次,模型是自包含的,與控制器和視圖保持相對獨立,所以可以方便地改變應用程式的業務數據和業務規則。如果要把資料庫從MySQL移植到Oracle,或者把RDBMS數據源改變成LDAP數據源,只需更改模型即可。一旦正確地實現了模型,不管數據是來自資料庫還是來自LDAP伺服器,視圖都會正確地顯示它們。由於MVC的3個模組相互獨立,改變其中一個不會影響其他兩個,所以依據這種設計思想能構造良好的松耦合的構件。

此外,控制器提高了應用程式的靈活性和可配置性。控制器可以用來連接不同的模型和視圖去完成用戶的需求,還可以為構造應用程式提供強有力的組合手段。給定一些可重用的模型和視圖,控制器可以根據用戶的需求選擇適當的模型進行處理,然後選擇適當的視圖將處理結果顯示給用戶。

MVC的適用範圍

使用MVC需要精心的設計,並且由於它的內部原理比較複雜,所以需要花費一些時間去理解它,將MVC運用到應用程式中,會帶來額外的工作量,增加應用的複雜性,所以MVC不適合小型應用程式。

但對於開發存在大量用戶介面,並且業務邏輯複雜的大型應用程式,MVC將會使軟體在健壯性和程式碼可重用性方面上一個新的台階。儘管最初構件MVC框架會花費一定的時間,但從長遠角度看,它會大大提高後期軟體開發的效率。

JSP Model1 和 JSP Model2

儘管MVC設計模式很早就出現了,但在Web應用的開發中引入MVC卻是步履艱難,其主要原因是在早期的Web應用的開發中,程式程式碼和HTML程式碼的分離一直難以實現。例如在JSP網頁中執行業務邏輯的程式程式碼和HTML表示層程式碼混雜在一起,因而很難分離出單獨的業務模型,從而使得產品設計的彈性力度很小,很難滿足用戶的變化性需求。

在早期的JavaWeb應用中,JSP文件負責處理業務邏輯、控制網頁流程並創建HTML頁面,JSP文件時一個獨立的、能自主完成所有任務的模組,這給Web開發帶來一系列問題。

HTML程式碼和Java程式程式碼強耦合在一起:JSP文件的編寫者必須即是網頁設計者,又是Java開發者。但實際情況是,多數Web開發人員那麼只精通網頁設計,能夠設計出漂亮的網頁外觀,但是編寫的Java程式碼很糟糕;要麼僅熟悉Java編程,能夠編寫健壯的Java程式碼,但是設計的網頁外觀很難看。這兩種才能介備的開發人員並不多見。

內嵌的流程式控制制邏輯:要理解應用程式的整個流程,必須瀏覽所有JSP頁面,試想一下擁有100多個網頁的網站的流程式控制制邏輯應該多麼錯綜複雜。

調試困難:除了很糟的外觀設計,HTML標記、Java程式碼和JavaScript程式碼都集中在一個網頁中,這使調試變得相當困難。

可維護性差:更改業務邏輯或控制流程往往牽涉相關的多個JSP頁面。

可讀性差:設想有1000行程式碼的網頁,其編碼樣式看起來雜亂無章。即使有彩色語法顯示,閱讀和理解這些程式碼仍然比較困難。

為了解決以上問題,SUN公司先後制定了兩種設計模式,分別為JSP Model1和JSP Model2,雖然JSP Model1在一定程度上實現了MVC中的視圖和模型,但是它的運用並不理想,這種狀況直到基於JavaEE的JSP Model2問世才得以改觀。JSP Model2用JSP技術實現視圖的功能,用Servlet技術實現控制器的功能,用JavaBean技術實現模型的功能。

JSP Model1和JSP Model2的本質區別在於負責流程式控制制的組件不同。在Model1中,JSP頁面負責調用模型組件來響應客戶請求,並將處理結果返回給用戶,JSP既要負責流程式控制制,還要負責產生用戶介面,因此他要同時充當視圖和控制器的功能。所以未能實現這兩個模組之間的獨立和分離。儘管Model1十分適合簡單應用的小,但它不適合開發複雜的大型應用程式。不加選擇地隨意運用Model1,仍然會導致JSP頁內嵌入大量的Java程式碼。儘管這對於Java程式設計師來說可能不是什麼大問題,但如果JSP頁面時有網頁設計人員開發並維護的(通常這是開發大型項目的規範),這就確實是個問題了。從根本上講,這將導致角色定不清和職責分配不明,從而給項目管理帶來很多麻煩。

JSP Model2體系結構,是一種聯合使用JSP與Servlet來提供動態內容服務的方法。它吸取了JSP和Servlet兩種技術各自的突出優點,用JSP生成表示層內容,讓Servlet完成深層次的處理任務。在這裡,Servlet充當控制器的角色,負責處理客戶請求,創建JSP頁面需要使用的JavaBean對象,並根據客戶請求選擇合適的JSP頁面返回給用戶。在JSP頁面沒有流程式控制制邏輯,它僅負責檢索原先由Servlet創建的JavaBean對象,並把JavaBean對象包含的數據作為動態內容插入到靜態模板中。這是一種有突破性的軟體設計方法,它清晰地分離了數據展示、數據處理和流程式控制制,明確了角色定義及軟體開發者與網頁設計者的分工。事實上,項目越複雜,使用Model2設計模式的好處就越多。