Spring 學習筆記(3)Spring MVC

Ethan_Wong發表於2021-08-22

一、什麼是 MVC

MVC 實際上就是一種設計模式 Model-View-Controller

  • Model 模型其實就是資料,Dao,Bean 等等
  • View 檢視就是所看到的東西,網頁,JSP,展示模型中的資料,包括資料邏輯的處理和資料操作(資料庫中存取資料)
  • Controller 控制器就是將不同的資料(Model)顯示在不同的檢視(View)上

1. Model1 時代

它是在 JSP + Bean (Model + View) 基礎上升級演變過來的,稱之為 Model1,相對於 MVC 而言,它是將 Controller 和 View 兩者結合在一起。前後端高度耦合,程式碼難以複用

正是因此,MVC 隨之抽象出來,形成了 Servlet + JSP + JavaBean 的新開發模式

2. Model2 時代

這時,將 JSP 中的控制功能抽象提取出來,形成 Servlet ,用於處理使用者的資料請求。

大大的提高了程式碼的可重用性,三個模組相互獨立,降低了各模組的耦合度。

二、什麼是 SpringMVC

SpringMVC 是 Spring 的一個子專案,它其實是為三層架構中的表示層開發提供的一整套完備的解決方案

三層架構分為表示層、業務邏輯層、資料訪問層。表示層主要表示出前臺頁面和後臺 servlet

優點:

  • 基於原生的 Servlet, 通過了功能強大的前端控制器 DispatcherServlet,對請求和響應進行統一處理
  • 程式碼清新簡潔,而且是插拔式元件即插即用
  • 效能卓著,適合大型網際網路專案要求

問題:MVC 和 三層架構的區別?

這裡引用一下回答,原地址在這

其實它們相同的地方在於他們都有一個表現層。

但是他們不同的地方在於其他的兩個層。

首先先解釋一下MVC。V即View.是檢視的意思。C即Controler.是控制器的意思。而M即Model,是模型的意思。這三個裡.最不容易理解的應該是Model.就是什麼是Model,而為什麼叫Model。我先不說為什麼叫Model,先解釋Controler。

Controller是控制器的意思,所謂控制器,就是將使用者請求轉發給模型層,經過處理後把結果返回到介面展現的一箇中間層,那麼Controler到底管什麼工作呢?先不說.先來看下在Java Web中這三個層一般的定義,一般在Java Web裡,JSP充當V,Servlet充當C,JavaBean充當M,這裡的Servlet管什麼工作呢?接受輸入,轉到Model層去處理,處理結果儲存後轉發到JSP,然後展現資料。所以它的功能就是控制器的基本功能,它就管轉發,在V和M之間轉來轉去。

再來說說M,即Model,在Java Web裡說的是JavaBean,我認識的很多人都把JavaBean誤認為是實體類,其實JavaBean有比實體類更豐富的定義,在JavaBean中除了其屬性和欄位,還可以有行為及其事件,JavaBean可以理解為普通Java物件。Java普通物件,就是符合Java規範的所有物件,這和實體類完全是兩回事。所以,我認為在MVC中。業務邏輯和資料訪問應該放在Model層,也就是V負責展示資料,Controler除了轉發不做業務邏輯。真正的邏輯事務,資料訪問,甚至演算法都放到Model去。

再說三層架構。三層其實很好理解,介面,業務,資料訪問,就這三個,從字面都可以理解出它們的意思。我要說的是它和MVC的區別。在三層架構中沒有定義Controler的概念。這是我認為最不同的地方。而MVC也沒有把業務的邏輯訪問看成兩個層,這是採用三層架構或MVC搭建程式最主要的區別。

當然了。在三層中也提到了Model,但是三層架構中Model的概念與MVC中Model的概念是不一樣的,“三層”中典型的Model層是已實體類構成的,而MVC裡,則是由業務邏輯與訪問資料組成的。不一樣的概念。雖然名字一樣

三、利用一個 HelloSpringMVC 程式來跟蹤 SpringMVC 的請求過程

先看看 SpringMVC 的請求過程:

1. HTTP 請求到 DispatcherServlet

使用者發起一個 Request 請求,這個請求會到達 DispatcherServlet ,經過相應的處理傳送到對應的 Handler 處理器(Controller)。首先檢視對應的 web.xml 檔案的 Servlet 部分程式碼:

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <!--攔截所有的請求,將這些請求傳送給 Spring MVC 控制器-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

2. DispatcherServlet 請求處理器對映器,查詢對應的控制器

將 3, 4 ,5 步驟合起來講,這一部分我們先看 dispatcher-servlet.xml 檔案中的內容:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="simpleUrlHandlerMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <!-- /hello 路徑的請求交給 id 為 helloController 的控制器處理-->
                <prop key="/hello">helloController</prop>
            </props>
        </property>
    </bean>
    <bean id="helloController" class="controller.HelloController"></bean>
</beans>

處理器對映器會通過在瀏覽器中輸入的 URL 資訊返回一個執行鏈,然後 HandlerAdapter 根據執行鏈中的 Handler 的資訊找到對應的 Handler 。比如我們在輸入框輸入https://localhost:8080/hello 處理器對映器則會對應將這個資訊傳送給 HelloController 控制器進行處理。

後期可以用註解來代替這種方式。

3. Handler 處理器

對應 6,7 步驟,這一部分就是我們常見的 Controller 程式碼,處理相應的邏輯。

public class HelloController implements Controller {
    @Override
    public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView("index.jsp");
        modelAndView.addObject("message", "Hello SpringMVC");
        return modelAndView;
    }
}

在處理完會返回給 HandlerAdapter 一個 ModelAndView 物件(Spring MVC的底層物件,包括 Model 資料模型和 View 檢視資訊), HandlerAdapter 會繼續將這個物件返回給 DispatcherServlet 。

4. ViewResolver 檢視解析器

這部分對應 8,9 步驟 DispatcherServlet 會將接收到的 ModelAndView 傳遞給 ViewResolver , 讓其對該物件進行解析,並且根據 View 資訊匹配到相應的檢視結果,並將 View 返回給 DispatcherServlet 。

注意,這裡傳遞的僅僅是一個邏輯名稱,這個名稱將會用來查詢產生結果的真正檢視

也就是這一行程式碼

ModelAndView modelAndView = new ModelAndView("index.jsp");

5. View 檢視

DispatcherServlet 根據接收到的 View 檢視,對檢視進行渲染,並且將 Model 中的模型資料填充到 View 檢視中的 request 域中,生成最終的檢視 View。檢視將這些結果顯示到瀏覽器中。

相關文章