Servlet 到 Spring MVC 的簡化之路

beyondlicg發表於2018-03-07

背景

Servlet和JSP是開發Java Web應用程式的兩種基本技術,Spring MVC是Spring框架中用於開發Web應用的一個模組。相信大家也和我一樣,是從編寫Servelt和JSP開始,然後一步步向Spring MVC靠攏。那麼Spring MVC到底簡化了Servlet什麼地方,使Spring MVC成為Web應用開發的首選框架呢,本文將會就這個方面進行探討。

Servlet簡介

什麼是Servlet

Servlet是一種基於Java語言,用於建立Web應用程式。在Servlet之前,CGI(通用閘道器介面)指令碼語言作為服務端程式語言很受歡迎,但是這門技術有很多的缺點:

  • CGI(通用閘道器介面) CGI即使可以讓伺服器能夠呼叫外部程式,並將HTTP請求資訊傳遞給外部程式處理,對於每一個請求,會啟動一個新的程式。

    Servlet 到 Spring MVC 的簡化之路

  • CGI技術的缺點

  1. 客戶端數量增加時,響應時間更多
  2. 每一個其請求,需要啟動一個新的程式,消耗大量的系統資源
  3. 使用平臺依賴語言,如:C、C++、Perl
  • Servlet

    Servlet 到 Spring MVC 的簡化之路

  • Servlet的優點

  1. 更好的效能:每個請求建立的是執行緒,而不是程式
  2. 可移植性:使用Java跨平臺語言
  3. 更強大:Servlet有JVM管理,不需要擔心記憶體洩露、溢位等

Servlet的演化

  • Servlet的基本目錄

    Servlet 到 Spring MVC 的簡化之路
    在tomcat/webapps目錄下建立上述目錄結構,所有HTML,靜態檔案直接儲存在應用程式目錄下,所有的Servlet類儲存在web-inf/classe目錄或子目錄下,web.xml(部署描述符)檔案儲存在web-inf目錄下。

  • Servlet介面 在最基本的Servlet類中,需要實現Servlet介面定義的init()、servic()、destroy()、getServletConfig()和geServletInfo()方法,其中業務邏輯在service中編寫,在service方法中最常用的是通過PrintWriter物件進行內容的輸出。

  • 演進1:GenericServlet抽象類 實現Servlet介面的時候必須將所有的方法實現,即使方法中沒有任何程式碼。在GenericServlet抽象類的幫助下,只需要重寫service方法即可。

  • 演進2:HttpServlet抽象類 HttpServlet覆蓋了GenericServlet類,將ServletRequest和ServletResponse物件分別封裝為HttpServletRequest和HttpServletResponse物件。HttpServlet同時實現了service方法,在請求進來時,Web容器首先呼叫HttpServlet的service方法,並根據請求的型別呼叫doGet或doPost方法,搜易我們只需要覆蓋doGet()和goPost()方法即可。

演進3:JSP的加入

寫過Servlet的朋友應該知道,Servlet的最大缺點就是在Servlet類中編寫大量繁雜的HTML程式碼,使得Java程式碼與HTML程式碼糅雜在一起,所以JSP應運而生。
JSP本質也是Servelt,然而其不需要編譯,JSP頁面是一個以.jsp副檔名的文字檔案。簡單的JSP頁面在第一次請求後被翻譯為(JSP名)_jsp的servlet,翻譯之後的Servelt可以看到:_jspInit(),_jspDestory(),_jspService()這樣的方法其實都是和Servlet相對應的。

演進4:Spring橫空出世

Spring提供了強大的控制反轉(IOC)和依賴注入(DI)功能,達到專案元件的解耦。

演進5:Spring Web模組 - Spring MVC

學過Servlet的朋友應該知道,當要使用Servlet完成的複雜的功能時,需要編寫多個Servlet類,並且在web.xml進行註冊,這對於完成複雜的Web應用,程式碼編寫會變得很複雜,開發成本也會很高。所以Spring提供了強大的Web開發框架Spring MVC。Spring MVC是Spring產品的一部分,享有Spring鬆耦合等所有優點。
Spring MVC是一個模型-檢視-控制器的Web框架,建立在前端控制器servlet(DispatcherServlet),它負責傳送每個請求到合適的處理程式,使用檢視來返回響應結果。
Spring MVC的架構:

Servlet 到 Spring MVC 的簡化之路

Spring web MVC框架提供了MVC(模型 - 檢視 - 控制器)架構和用於開發靈活和鬆散耦合的Web應用程式的元件。MVC模式導致應用程式的不同方面(輸入邏輯,業務邏輯和UI邏輯)分離,同時提供這些元素之間的鬆散耦合

  • 模型(Model):封裝了應用程式的資料,通常由POJO類組成
  • 檢視(View):負責渲染模型資料,一般來說它生成客戶端瀏覽器可以解釋HTML輸出
  • 控制器(Controller):負責處理使用者請求並構建適當的模型,並將其傳遞給檢視進行渲染

DispatcherServlet元件類 Spring MVC框架是圍繞DispatcherServlet設計的,它處理所有的請求和響應。Spring MVC DispatcherServlet的工作流程:

Servlet 到 Spring MVC 的簡化之路

DispatcherServlet處理HTTP請求的工作流程

  1. 接受HTTP請求後,DispatcherServlet
  2. 會查詢HandlerMapping以呼叫相應的Controller(根據請求的url)
  3. Controller接受請求並根據請求的型別Get/Post呼叫相應的服務方法,服務方法進行相應的業務處理,並設定模型資料,最後將檢視名稱返回給DispatcherServlet
  4. DispatcherServlet根據返回的檢視名稱從ViewResolver獲取對應的檢視
  5. DispatcherServlet將模型資料傳遞到最終的檢視,並將檢視返回給瀏覽器。

總結

至此Servlet到Spring MVC的演化之路落下帷幕,只能感慨,技術的變更和迭代速度遠遠超乎我們的意料,我們只有不斷地學習,才能跟上時代的潮流。

參考連結:參考1 參考2

相關文章