簡(jiǎn)述一下SpringMVC的執(zhí)行流程,多看幾遍對(duì)你沒(méi)有壞處。

MVC簡(jiǎn)介

  • MVC是一種軟件設(shè)計(jì)規(guī)范,模型(Model)、視圖(View)、控制器(Controller)的縮寫(xiě).

  • MVC是一種常見(jiàn)的架構(gòu)模式,其目的是為了解耦!

  • Model(模型):數(shù)據(jù)模型提供頁(yè)面要展示的數(shù)據(jù),也叫業(yè)務(wù)邏輯層。模型層是一個(gè)廣泛的概述,模型層包括Service層、Dao層。

  • View(視圖):負(fù)責(zé)進(jìn)行數(shù)據(jù)模型 + 視圖框架的展示,也就是我們看到的網(wǎng)頁(yè)!

  • Controller(控制器):接收用戶(hù)請(qǐng)求,委托給模型進(jìn)行處理,處理完畢后把返回的模型數(shù)據(jù)返回給視圖,由視圖負(fù)責(zé)展示。

  • 在MVC架構(gòu)提出之前,Web頁(yè)面的開(kāi)發(fā)是只有模型、視圖兩層;也就是說(shuō)沒(méi)有Controller控制層,下面先來(lái)看看為什么MVC會(huì)成功取代傳統(tǒng)的兩層架構(gòu)

在這里個(gè)人整理了一些資料,有需要的朋友可以直接點(diǎn)擊領(lǐng)取。

Java基礎(chǔ)知識(shí)大全

22本Java架構(gòu)師核心書(shū)籍

從0到1Java學(xué)習(xí)路線(xiàn)和資料

1000+道2021年最新面試題

優(yōu)點(diǎn):

架構(gòu)簡(jiǎn)單,容易實(shí)現(xiàn)。

缺點(diǎn):

視圖層的職責(zé)不單一;不僅需要對(duì)數(shù)據(jù)進(jìn)行封裝,還需要編寫(xiě)邏輯代碼調(diào)用模型層也就是說(shuō)這里的視圖層充當(dāng)了視圖 + 控制兩個(gè)職責(zé);視圖層直接與模型層打交道頁(yè)面及其的混亂、不利于維護(hù)

MVC架構(gòu)提出是為了將視圖與模型層分開(kāi),二者不直接打交道;而是通過(guò)控制層來(lái)從當(dāng)二者交互的橋梁;

視圖層只需要專(zhuān)注于數(shù)據(jù)封裝與展示

模型層專(zhuān)注于業(yè)務(wù)邏輯

控制層負(fù)責(zé)處理用戶(hù)遞交的請(qǐng)求,并且協(xié)調(diào)視圖與模型層

SpringMVC執(zhí)行流程

SpringMVC框架的核心圍繞著DispatcherServlet前端控制器進(jìn)行展開(kāi),它用于協(xié)調(diào)所有的Servlet對(duì)用戶(hù)的請(qǐng)求進(jìn)行解析、查找對(duì)應(yīng)的Servlet進(jìn)行處理、最后給出響應(yīng)!可以將DispatcherServlet功能類(lèi)似于CPU處理器、人類(lèi)的大腦…

  • 用戶(hù)通過(guò)視圖頁(yè)面或者是url地址路徑發(fā)起請(qǐng)求,前端控制DispatcherServlet接收用戶(hù)的請(qǐng)求開(kāi)始運(yùn)作!
  • DispatcherServlet調(diào)用HandlerMapping找到最終用于執(zhí)行的Handler
  • HandlerExecution中包括具體的執(zhí)行器Handler、HandlerInterceptor處理器攔截器。將其返回交給前端控制器DispatcherServlet。
  • 將獲取到的HandlerExecution對(duì)象匹配對(duì)應(yīng)的處理器適配器HandlerAdapter,將其進(jìn)行解析。
  • 處理器適配器HandlerAdapter最終成功匹配到程序員寫(xiě)的Controller層的Servlet類(lèi)。
  • Controller層職責(zé)分明,調(diào)用模型層進(jìn)行數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),并且獲取到最后需要響應(yīng)給用戶(hù)的數(shù)據(jù)、視圖。
  • Controller層中將數(shù)據(jù)、視圖封裝在ModelAndView對(duì)象中,然后將其返回給處理器適配器HandlerAdapter。
  • 處理器適配器HandlerAdapter接收到Controller返回結(jié)果進(jìn)行處理,然后移交給前端控制器DispatcherServlet。
  • 前端控制器DispatcherServlet調(diào)用視圖解析器ViewResolver;ViewResolver解析ModelAndView中的數(shù)據(jù)、解析響應(yīng)的視圖名、找到對(duì)應(yīng)的視圖、最后將數(shù)據(jù)封裝到視圖中!
  • 視圖解析器ViewResolver將視圖名字返回給前端控制器DispatcherServlet,最后前端控制器DispatcherServlet調(diào)用響應(yīng)的視圖展示給用戶(hù)!

第一個(gè)SpringMVC程序

JSP頁(yè)面

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


編寫(xiě)對(duì)應(yīng)的Servlet(Controller)

public class HelloController implements Controller {

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

        // 1. 創(chuàng)建模型-視圖
        ModelAndView mv = new ModelAndView();
        
        //調(diào)用業(yè)務(wù)層
        // 2. 封裝數(shù)據(jù)對(duì)象
        mv.addObject("message","Hello, SpringMVC!");

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

}

配置SpringMVC核心文件

核心配置文件中,配置映射器、適配器、解析器;最后將請(qǐng)求的路徑以及對(duì)應(yīng)的Servlet類(lèi)交給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不在走各自的映射路徑,而是統(tǒng)一由前端控制器DispatcherServlet調(diào)度,所以只需要在項(xiàng)目的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.注冊(cè)DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!-- 關(guān)聯(lián)Spring的核心配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:SpringMVC-Servlet.xml</param-value>
        </init-param>
        <!-- 啟動(dòng)級(jí)別1 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

測(cè)試結(jié)果

分析與總結(jié)

web.xml中無(wú)需要在配置單獨(dú)Servlet的映射路徑,而是直接配DispatcherServlet。這是因?yàn)榍岸丝刂破鲿?huì)自行根據(jù)HandlerMapping進(jìn)行查找。

Servlet無(wú)需在繼承HttpServlet類(lèi),是因?yàn)镈ispatcherServlet是繼承了HttpServlet。而現(xiàn)在編寫(xiě)的Servlet實(shí)現(xiàn)了Controller接口會(huì)在經(jīng)過(guò)適配器HandlerAdapter進(jìn)行找到!

最后

都看到這里,覺(jué)得文章對(duì)你有幫助記得給個(gè)點(diǎn)贊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容