簡述一下SpringMVC的執行流程,多看幾遍對你沒有壞處。

MVC簡介

  • MVC是一種軟件設計規範,模型(Model)、視圖(View)、控制器(Controller)的縮寫.
  • MVC是一種常見的架構模式,其目的是爲了解耦!
  • Model(模型):數據模型提供頁面要展現的數據,也叫業務邏輯層。模型層是一個普遍的概述,模型層包括Service層、Dao層。
  • View(視圖):負責進行數據模型 + 視圖框架的展現,也就是咱們看到的網頁!
  • Controller(控制器):接收用戶請求,委託給模型進行處理,處理完畢後把返回的模型數據返回給視圖,由視圖負責展現。
  • 在MVC架構提出以前,Web頁面的開發是隻有模型、視圖兩層;也就是說沒有Controller控制層,下面先來看看爲何MVC會成功取代傳統的兩層架構

在這裏我的整理了一些資料,有須要的朋友能夠直接點擊領取。html

Java基礎知識大全前端

22本Java架構師核心書籍java

從0到1Java學習路線和資料程序員

1000+道2021年最新面試題web

優勢:

架構簡單,容易實現。面試

缺點:

視圖層的職責不單一;不只須要對數據進行封裝,還須要編寫邏輯代碼調用模型層也就是說這裏的視圖層充當了視圖 + 控制兩個職責;視圖層直接與模型層打交道頁面及其的混亂、不利於維護spring

MVC架構提出是爲了將視圖與模型層分開,兩者不直接打交道;而是經過控制層來從當兩者交互的橋樑;數據庫

視圖層只須要專一於數據封裝與展現架構

模型層專一於業務邏輯mvc

控制層負責處理用戶遞交的請求,而且協調視圖與模型層

SpringMVC執行流程

SpringMVC框架的核心圍繞着DispatcherServlet前端控制器進行展開,它用於協調全部的Servlet對用戶的請求進行解析、查找對應的Servlet進行處理、最後給出響應!能夠將DispatcherServlet功能相似於CPU處理器、人類的大腦…

  • 用戶經過視圖頁面或者是url地址路徑發起請求,前端控制DispatcherServlet接收用戶的請求開始運做!
  • DispatcherServlet調用HandlerMapping找到最終用於執行的Handler
  • HandlerExecution中包括具體的執行器Handler、HandlerInterceptor處理器攔截器。將其返回交給前端控制器DispatcherServlet。
  • 將獲取到的HandlerExecution對象匹配對應的處理器適配器HandlerAdapter,將其進行解析。
  • 處理器適配器HandlerAdapter最終成功匹配到程序員寫的Controller層的Servlet類。
  • Controller層職責分明,調用模型層進行數據庫的訪問,而且獲取到最後須要響應給用戶的數據、視圖。
  • Controller層中將數據、視圖封裝在ModelAndView對象中,而後將其返回給處理器適配器HandlerAdapter。
  • 處理器適配器HandlerAdapter接收到Controller返回結果進行處理,而後移交給前端控制器DispatcherServlet。
  • 前端控制器DispatcherServlet調用視圖解析器ViewResolver;ViewResolver解析ModelAndView中的數據、解析響應的視圖名、找到對應的視圖、最後將數據封裝到視圖中!
  • 視圖解析器ViewResolver將視圖名字返回給前端控制器DispatcherServlet,最後前端控制器DispatcherServlet調用響應的視圖展現給用戶!

第一個SpringMVC程序

JSP頁面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>${message}</h1>
</body>
</html>

編寫對應的Servlet(Controller)

public class HelloController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {

        // 1. 建立模型-視圖
        ModelAndView mv = new ModelAndView();
        
        //調用業務層
        // 2. 封裝數據對象
        mv.addObject("message","Hello, SpringMVC!");

        // 3. 封裝要跳轉的視圖,放在ModelAndView中
        mv.setViewName("hellomvc");
        return mv;
    }

}

配置SpringMVC核心文件

核心配置文件中,配置映射器、適配器、解析器;最後將請求的路徑以及對應的Servlet類交給IOC容器託管。

<?xml version="1.0" encoding="UTF8"?>
<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
    https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 1. 配置處理器映射器   -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

    <!-- 2. 配置處理器適配器  -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

    <!-- 3. 配置視圖解析器 -->
    <bean  id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前綴 -->
        <property name="prefix" value="/WEB-INF/page/"/>
        <!-- 後綴 -->
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 4. 將servlet交給IOC容器管理 -->
    <bean id="/hellomvc" class="com.controller.HelloController"/>
</beans>

配置映射路徑處理

因爲全部的Sevlet不在走各自的映射路徑,而是統一由前端控制器DispatcherServlet調度,因此只須要在項目的web.xml中配置DispatcherServlet便可。而後將SpringMVC核心配置文件交給前端控制器DispatcherServlet掌管!

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
         
    <!--1.註冊DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!-- 關聯Spring的核心配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC-Servlet.xml</param-value>
        </init-param>
        <!-- 啓動級別1 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

測試結果

分析與總結

web.xml中無須要在配置單獨Servlet的映射路徑,而是直接配DispatcherServlet。這是由於前端控制器會自行根據HandlerMapping進行查找。

Servlet無需在繼承HttpServlet類,是由於DispatcherServlet是繼承了HttpServlet。而如今編寫的Servlet實現了Controller接口會在通過適配器HandlerAdapter進行找到!

最後

都看到這裏,以爲文章對你有幫助記得給個點贊。

相關文章
相關標籤/搜索