文章目錄
- 前言
- 一、回憶什么是 MVC 模式?
- 1.1、Model、View、Controller 組件介紹
- 1.2、明確 View 與 Controller 組件區別
- 二、什么是 Servlet?
- 2.1、Servlet 的組件定義
- 2.2、Servlet 組件處于 Controller 層?
- 三、老師說 Servlet 是 View 層的!
- 四、什么是 JSP?
- 4.1、Servlet 是 JSP 的變式
- 五、Servlet 的角色根據應用場景定義
- 5.1、開發中的 MVC 設計框架
- 5.1、完整 MVC 設計框架中不同組件的角色
- 5.2、老師說 Servlet 是 View 層的!!
- 5.3、純 JSP 項目中 Servlet 的角色
- 總結
前言
今天課下,偶然聽到有幾個同學在討論這么一個問題:Servlet 到底屬于 MVC 模式的哪一層?談到這個問題就考察你對于 MVC 模式的熟悉程度了。本篇我們就分別從 MVC 模式、Servlet 和 JSP 的原理來探討一下,Servlet 到底屬于哪一層?一、回憶什么是 MVC 模式?
首先我們先回憶一下這個經典的軟件設計框架——MVC 模式。
這里請注意軟件設計模式與軟件設計框架的區別:軟件設計模式是指那經典的 23 個設計模式:創建型、行為型、結構型;軟件設計框架就是 MVC、SSH、SSM 等。
MVC(Model VIew Controller),是模型、視圖、控制器的縮寫,是一種經典的軟件設計框架,同時提供了對 HTML、CSS、JavaScript 的支持。
1.1、Model、View、Controller 組件介紹
經典的 MVC 模式整體組件類型的關系和功能如下圖所示,我們分別來介紹組件類型以及關系:
- Model(模型)是應用程序中用于處理數據邏輯的部分,即業務模型。用來表示應用程序的核心,比如:數據庫記錄字段,負責在數據庫中存取數據。
- View(視圖)是應用程序中處理數據顯示的部分,即用戶界面,通常視圖是依賴模型的數據來創建的,模型發生改變視圖必須同步更新。
- Controller(控制器)是應用程序中處理用戶交互的部分。負責從視圖中讀取數據,控制用戶的輸入,并向模型發送數據。
1.2、明確 View 與 Controller 組件區別
現在從 MVC 模式的介紹我們可以明確 View 和 Controller 的區別:View 負責數據顯示,Controller 負責數據和用戶的交互。
二、什么是 Servlet?
介紹完 MVC 模式,那么什么是 Servlet 呢?Servlet 又是怎么樣的一個組件呢?它扮演怎么一個角色呢?
2.1、Servlet 的組件定義
Servlet 是用 Java 語言編寫的服務器端程序,是由服務器端調用執行,按照 Servlet 自身規范編寫的 Java 類。Servlet 可以處理客戶端傳來的 HTTP 請求,并返回響應。
2.2、Servlet 組件處于 Controller 層?
說得通俗點,Servlet 就是一個 Java 類,里面定義了接收用戶請求,調用業務類,發送響應視圖的方法。現在你是不是覺得 Servlet 好像是屬于 Controller 層的?
三、老師說 Servlet 是 View 層的!
Q:這個時候可能有人反問?為什么我們老師說過說 Servlet 是 View 層的?你這說的不對!
或者說:為什么我們老師說過說 JSP 是 Controller 層的?你這說的不對!
A:別急嘛,我們接著往下走,再來剖析一下 JSP 的原理。這倆問題我們放在最后面作為總結。
四、什么是 JSP?
要分析 Servlet 的角色,我們就不得不說一下 JSP,什么是 JSP?關于 JSP 的基礎定義大家早已耳熟能詳,我就不再贅述。
4.1、Servlet 是 JSP 的變式
- JSP 將 Java 代碼和特定變動的內容嵌入到靜態頁面中,實現以靜態頁面為模板,動態生成其他部分。
- JSP 文件在運行的時候編譯器會將內嵌的 Java 代碼編譯成 Java 寫的 Servlet 代碼,JSP 指令通過 JSP 的編譯器來控制如何生成 Servlet,然后 Java 代碼編譯為 .class 結尾的中間字節碼文件最后轉化為二進制的機器碼。
- 我們通過 JSP 的內置指令來取代 Java 中(即 Servlet)中使用
out.write();
的輸出,節約大量的代碼又能實現頁面交互。
更詳細的 JSP 編譯原理部分建議大家看我之前的博文——JSP 編譯原理:JSP 是 Servlet?如何用 Eclipse 查看 JSP 編譯生成的 Servlet 源文件?
由此我們得出下一個結論:JSP 就是 Servlet,反過來也可以說 Servlet 就是 JSP。你又要有問題了?
Q:你這給我搞糊涂了,Servlet 到底是什么角色?
五、Servlet 的角色根據應用場景定義
我們在項目開發中,完整的一個 MVC 設計框架可能會包含很多組件或者同時結合其他的組件,我們分別從不同的需求場景來一一介紹。
5.1、開發中的 MVC 設計框架
項目中經常使用的 MVC 模式組件結構以及其功能如下圖所示:
上圖在我們經典的 MVC 結構中進一步進行了細分:
- View 層負責數據的顯示。包括我們看得到的使用 JSP 和 HTML 實現的界面。
- Cotroller 層負責控制數據和用戶的交互。包括我們上面提到的 Servlet。
- Model 層負責對數據邏輯的處理。包括實體類 POJO(封裝對象數據)、業務層 Service(處理數據邏輯信息)、持久層 Dao(進行數據的 CRUD)等組件。
注意:在開發中一定要遵循開發規范、框架規范,通過 Servlet 來實現交互,通過業務層 Service 進行邏輯處理,通過持久層 Dao 來執行數據查詢。不要把每個組件的順序和功能搞混,否則使用框架也就沒有意義了。
5.1、完整 MVC 設計框架中不同組件的角色
在如上圖所示的完整的 MVC 設計框架中,嚴格來說,Servlet 是屬于Controller 層的,負責和用戶的交互,而我們常見的業務層 Service、持久層 Dao、實體類 JavaBean 都是屬于Model層的。
5.2、老師說 Servlet 是 View 層的!!
A:好了我們來回答這個問題。
現在你需要返回去看一下上面 4.1 的內容了——JSP 的本質就是 Servlet,就是 Java 類,Servlet 也就是 JSP,說 Servlet 處于 View 層也沒大錯。但是嚴格來說 JSP 的主要功能是實現數據信息的顯示,很少的一部分功能用于實現數據信息的交互處理,所以我們通常按照代碼規范將 Serlet 作為 Java 代碼歸為 Controller 層。明白?
5.3、純 JSP 項目中 Servlet 的角色
如果你看的是純 JSP 的教程,可能會直接使用 JSP 硬連數據庫,而不添加其他的組件,那么這個時候就可以說:Servlet 是屬于 View 層組件。因為僅僅就是使用 JSP 就可以實現簡單的增刪改查,也沒有建立 Java 類文件。
總結
本文帶領大家回顧了經典的 MVC 軟件設計框架,辨析了 JSP 與 Servlet 的組件定位,明確 Servlet 在 MVC 中是處于 Controller 層,在非嚴格 MVC 模式中也可處于 View 層。通過對于組件角色的定位,更深一步了解和掌握 Servlet 與 JSP 的原理,掌握 MVC 這個經典的設計框架。我們在之后的框架學習中,一切的原理都是圍繞這個基礎展開的,框架僅僅只是為我們提供一個方便的工具,基礎還是要打牢的。我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!