1. 程式人生 > >web 開發原理

web 開發原理

作為一位 Java Web 開發人員,你是否遭遇過下面這些狀況:

· 客戶端請求引數我要一個個地取,不能用迴圈,醉了……

· 引數取出來都是 String 型別,我還得一個個做型別轉換,很惱火…...

· 配置檔案寫得比程式碼還多,這是要逼瘋我的節奏嗎?

· Servlet 處理多個請求,需要手動完成邏輯控制,就不能智慧一點嗎?!

如果你堅持使用原生的 Servlet 做開發,上面這些坑是一定繞不過去的。Servlet 是 Java Web 的基石,首先簡單談一下 Servlet,為什麼使用起來這麼不方便。

Web 開發的原理是服務端接收到客戶端傳來的 request,進行業務處理,然後將結果通過 Response 響應給客戶端的過程。

客戶端和服務端通過 HTTP 協議進行資料互動,底層機制是客戶端將使用者輸入的資訊組裝成 HTTP 協議報文,然後通過網路將報文傳輸到服務端。

服務端通過特定的 Web 容器(Tomcat、Jetty 等)接收報文並進行解析,將資料封裝到 request 物件中,並通過 request 獲取資料進行業務邏輯處理,將處理結果封裝到 response 物件中,傳給 Web 容器。

Web 容器再次進行解析,將 response 物件轉為 HTTP 協議報文返回給客戶端,客戶端對結果進行渲染展示給使用者。

服務端具體對接收請求做出響應的工作是由 Servlet 來完成的,但是 Servlet 有其自身無法克服的缺點:配置過於繁瑣。

同時 HTTP 協議傳輸的資料都是文字形式,這就需要開發者進行大量的資料型別轉換,這種工作沒有技術含量、簡單枯燥易出錯。因此,使用 Servlet 顯得非常低效和落後。

我們的時間和精力是有限的,不能把有限的時間和精力浪費在沒有技術含量的體力活上,我們追求的是更加高效、更加便捷的開發模式。

這就是框架存在的價值:讓開發者將精力集中在核心業務的開發上,框架會幫你遮蔽掉跟業務開發無關的各種問題,體力活框架幫你做。

框架的特點就是在原有技術的基礎上,提供一套和原技術具備相同業務功能的元件,同時比原技術更加高效易用,功能更加強大。

Spring MVC 就是這樣一款實現 MVC 設計模式的框架,是 Spring 框架的一個分支產品,以 Spring IoC 容器為基礎,並利用容器的特性來簡化它的配置。

Spring MVC 相當於 Spring 的一個子模組,可以很好地和 Spring 結合起來進行開發,是每一個 Java Web 開發者都應該掌握的技術。

 

為什麼要使用 Spring MVC

使用 Spring MVC 可以幫助你遮蔽掉繁瑣的資料型別、資料繫結,同時提高良好的自定義校驗,強大的標籤庫,讓你開發起來更加得心應手、高效。

相比於 Struts2 框架,Spring MVC 的開發效率和效能更高,配置更簡單,功能更強大,同時可以和 Spring 框架無縫對接,安全性比 Struts2 更高。

 

Spring MVC 的優點

  • 完整的角色劃分:每種角色各司其職、協同工作。

  • 簡便的配置方式:以 Spring IoC 為基礎,將各個元件都以 JavaBean 的形式配置。

  • 程式碼複用:可使用現有的業務物件作為表單物件,不需要去擴充套件某個特定框架的基類。

  • 自定義資料轉換器:可根據需求對資料型別進行轉換,比如將特定格式的字串轉為日期型別。

  • 功能強大的表單標籤庫:讓 JSP 表單的資料繫結更加便捷高效。

  • 國際化:支援根據使用者區域顯示不同國家的語言。

 

Spring MVC 工作流程

  • 客戶端請求被 DispatcherServlet(前端控制器)接收

  • 根據 HandlerMapping 對映到 Handler

  • 生成 Handler 和 HandlerInterceptor(如果有則生成)

  • Handler 和 HandlerInterceptor 以 HandlerExecutionChain 的形式一併返回給 DispatcherServlet

  • DispatcherServlet 通過 HandlerAdapter 呼叫 Handler 的方法做業務邏輯處理

  • 返回一個 ModelAndView 物件給 DispatcherServlet

  • DispatcherServlet 將獲取的 ModelAndView 物件傳給 ViewResolver 檢視解析器,將邏輯檢視解析成物理檢視 View

  • ViewResolver 返回一個 View 給 DispatcherServlet

  • DispatcherServlet 根據 View 進行檢視渲染(將模型資料填充到檢視中)

  • DispatcherServlet 將渲染後的檢視響應給客戶端