Spring 學習筆記(3)Spring MVC

一、什麼是 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="//www.springframework.org/schema/beans"
       xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="//www.springframework.org/schema/beans //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 。比如我們在輸入框輸入//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。視圖將這些結果顯示到瀏覽器中。

Tags: