• 【零基础入门SpringMVC】第一期——开篇导论


    一、导论

    $ 什么是MVC?

    • MVC 是一种将软件按照 模型、视图、控制器来划分的一种架构思维
    • MVC全称SpringWebMVC,那么M、V、C分别代表什么呢?
      • M:Model 代表模型层,作用就是处理数据,在我们SpringMVC中,分为两种Bean

        • 第一类为实体Bean,用于我们数据存取 【pojo
        • 第二类为业务Bean,用于我们业务处理与数据访问 【dao、service
      • V: View 代表视图层,为我们提供前端页面的显示,与用户进行交互

      • C:Controller 代表控制层,负责接收请求和响应服务器【Service

    在这里插入图片描述

    • MVC的工作流程:

      用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到ControllerController再根据请求处理的结果找到相应的View视图,渲染数据后最终响应给浏览器

    在这里插入图片描述

    $ 什么是SpringMVC?

    • 我们知道Spring分为八大模块,SpringWebMVC是其中的一个子项目
    • 三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台servlet
    • MVC是一种设计模式,然而我们三层架构是一种架构,不要把三层架构与MVC的三部分对应上

    $ SpringMVC的特点

    • 是基于MVC的轻量级框架,支持IoCAOP,完全基于注解开发
    • 基于原生的Servlet,封装了功能强大的前端控制器DispatcherServlet,对请求和响应进行统一处理
    • 配置 + Jar包 == 框架

    二、第一个项目

    • 演示如何构建springMVC项目以及了解springMVC的执行流程

    $ 开发环境

    • 此处我以我自己选择的开发环境为例
      • IDEA 2022.2.3
      • Maven 3.8.3
      • Tomcat 9.0.54
      • Spring 5.3.1

    $ 创建一个新的工程

    • 我们可以使用模板创建web工程,也可以创建普通maven工程然后动手配置【此处我选择第二种】
      在这里插入图片描述
    • 修改pom.xml,添加打包方式为 war,并配置相关依赖
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
      
          <groupId>com.atguigu</groupId>
          <artifactId>springMVC-demo1</artifactId>
          <version>1.0-SNAPSHOT</version>
          <packaging>war</packaging>
          <dependencies>
              <!-- SpringMVC -->
              <dependency>
                  <groupId>org.springframework</groupId>
                  <artifactId>spring-webmvc</artifactId>
                  <version>5.3.1</version>
              </dependency>
      
              <!-- 日志 -->
              <dependency>
                  <groupId>ch.qos.logback</groupId>
                  <artifactId>logback-classic</artifactId>
                  <version>1.2.3</version>
              </dependency>
      
              <!-- ServletAPI -->
              <dependency>
                  <groupId>javax.servlet</groupId>
                  <artifactId>javax.servlet-api</artifactId>
                  <version>3.1.0</version>
                  <scope>provided</scope>
              </dependency>
      
              <!-- Spring5Thymeleaf整合包 -->
              <dependency>
                  <groupId>org.thymeleaf</groupId>
                  <artifactId>thymeleaf-spring5</artifactId>
                  <version>3.0.12.RELEASE</version>
              </dependency>
          </dependencies>
      </project>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
    • src/main 目录下创建一个新的目录 webapp 用于我们web相关的文件
    • 然后在项目结构中去添加我们的 web.xml 文件

    File >> Project Structure >> 点击我们的模块 >> Web 右侧上方加号 >> 根据提示补充路径 >> 点击应用

    在这里插入图片描述

    $ 配置我们的 web.xml

    • 我们知道 web.xml 一般是用来注册 Servlet监听器

    • 因为我们springMVC基于原生的Servlet,为我们提供一个功能强大的前端控制器【本身就是一个Servlet】,所以我们要到web.xml中进行注册

    • 那我们为什要去注册?注册有什么用呢?

      • 因为我们浏览器不能直接去访问一个类,我们需要通过Servlet去配置一个访问路径
      • 当访问路径符合我们的匹配路径,就会被这个Servlet去处理
    • springMVC 为我们提供两种配置方式:

      • 第一种为默认配置方式:对于springMVC的配置文件的位置和命名都是固定的,很不方便

        <!-- 配置SpringMVC的前端控制器,对浏览器发送的请求统一进行处理 -->
        <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <!--设置springMVC的核心控制器所能处理的请求的请求路径 -->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10

        为什么此处不比配jsp文件呢?
        因为jsp文件本质就是一种Servlet,应该使用特殊的Servlet去处理,而不是我们springMVC的前端控制器
        为什么说默认配置不方便呢?
        对于上面的这个配置文件而言,我们的配置文件的位置只能为WEB-INF目录下,文件名为springMVC-servlet.xml

      • 第二种为扩展配置方式:在servlet标签中使用参数初始化子标签

        <!--我们需要通过前端控制器Dispatcher来处理所有前端的请求,因为它是一个Servlet所以需要我们在web.xml中进行注册-->
            <servlet>
                <servlet-name>springMVC</servlet-name>
                <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
                <!--我们不采用默认的配置方式,因为默认的配置方式路径和配置文件命名都是固定的-->
                <!--我们采用拓展的配置方式,在此给出初始化参数-->
                <init-param>
                    <!--这个参数名值固定的,我们在前端控制器中已经配置好的-->
                    <param-name>contextConfigLocation</param-name>
                    <!--classpath 代表根路径,对应我们main下的java和resource-->
                    <param-value>classpath:springMVC.xml</param-value>
                </init-param>
                <!--我们servlet默认是在第一次被调用的时候进行加载,为了解决第一次启动的时候加载慢
                    我们可以通过load-on-startup来提高启动优先级,也就是让服务器初始化的时候进行加载-->
                <load-on-startup>1</load-on-startup>
            </servlet>
            <servlet-mapping>
                <!--对应映射的name要与我们上面的name一致-->
                <servlet-name>springMVC</servlet-name>
                <!--url的模式为 /,代表会处理所有除了.jsp结尾的请求-->
                <url-pattern>/</url-pattern>
            </servlet-mapping>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22

        为什么我们要提高Servlet初始化的优先级呢?
        我们知道Servlet是在第一次调用的时候进行初始化的,启动过程有很多初始化操作,这些操作如果都放到第一次访问的时候去做会影响我们的访问速度,所以我们就让服务器启动的时候执行servlet的初始化工作

    $ 创建请求控制器

    • 我们前端控制器Dispatcher就是统一对前端的请求进行处理的,但是针对不同的请求处理过程可能不一致
    • 我们要实现一个控制器类,类中方法对应着不同的处理过程
    • springMVC会根据我们的预设自动进行匹配
    • 我们通过@Controller注解将控制器纳入到SpringIoC容器进行管理 【用其他注解也行,不过控制层用这个可读性高】
    • 我们需要在核心配置文件中添加注解扫描,才能让我们这个pojo类成为真正的控制器
    package com.atguigu.mvc.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     * @author Bonbons
     * @version 1.0
     */
    @Controller
    public class HelloController {
    
        // 我们希望对于所有的链接 "/" 的处理走我们控制器中指定的方法,是通过@RequestMapping来完成的
        @RequestMapping("/") // 此处省略了value属性
        public String index(){
            /*
                方法名不重要,我们在前端控制器的Servlet注册配置了我们处理哪些请求
                然后找到我们的控制器,我们控制器的方法对应哪种处理,我们通过方法的
                返回值获得视图名称,然后到我们springMVC的核心配置文件中的视图解析
                器去解析,添加上我们的前缀和后缀 >> 就获得了我们要跳转的页面     
             */
            return "index";
        }
    
        @RequestMapping(value = "/target")
        public String toTarget(){
            return "target";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 这里有几个需要注意的点:
      • 因为我们的页面在WEB-INF下,所以浏览器不能直接访问到,重定向也不行,只能通过跳转的方式
      • 对于控制器方法的命名随意,我们springMVC的核心配置文件中的视图解析器根据控制器返回值进行拼接,最后实现页面的跳转

    $ 编写我们springMVC的核心配置文件

    • 我们直接将核心配置文件放到类路径下,此处就是 resource 目录下
    • 对于我们的第一个项目而言,只需要配置扫描Bean包的功能和视图解析器的功能【采用了thymeleaf框架】
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--扫描组件-->
        <context:component-scan base-package="com.atguigu.mvc.controller"/>
    
        <!-- 配置Thymeleaf视图解析器 -->
        <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
            <!--优先级-->
            <property name="order" value="1"/>
            <property name="characterEncoding" value="UTF-8"/>
            <property name="templateEngine">
                <!--内部Bean-->
                <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                    <property name="templateResolver">
                        <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    
                            <!-- 视图前缀 -->
                            <property name="prefix" value="/WEB-INF/templates/"/>
    
                            <!-- 视图后缀 -->
                            <property name="suffix" value=".html"/>
                            <property name="templateMode" value="HTML5"/>
                            <property name="characterEncoding" value="UTF-8" />
                        </bean>
                    </property>
                </bean>
            </property>
        </bean>
        
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    $ 编写我们的前端页面

    • index页面中给出一个超链接,可以跳转到我们的第二个页面
      • 需要使用我们 thymeleaf 的命名空间
      • 以 / 开头代表绝对路径,又分为浏览器解析的绝对路径和服务器解析的绝对路径两种【超链接由浏览器负责解析】
      • 此处的 /target 代表请求地址,请求地址与我们控制器方法@RequestMapping注解的属性值一致
      <!DOCTYPE html>
      <html lang="en" xmlns:th="http://www.thymeleaf.org">
      
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <h1>首页</h1>
      <!--th 代表使用thymeleaf去解析,使用@{}包裹属性值,识别到为绝对路径后,会自动为我们添加上下文路径-->
      <a th:href="@{/target}">HelloWorld</a><br/>
      </body>
      </html>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    • 我们的 target.html 是我们用来跳转的第二个页面
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
        <p>Hello World!</p>
      </body>
      </html>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

    $ 配置Tomcat

    • 要想将项目运行到本地web服务器上,就需要配置我们的 tomcat

    Edit Configurations >>左上角加号 >> 找到Tomcat Server >> 选择我们应用的tomcat >> 选择Deployment 进行配置 【我们通常都会选择 exploded

    在这里插入图片描述

    • 在我们Deployment页面下方配置上下文路径
      在这里插入图片描述
    • 修改以下两个配置
      在这里插入图片描述
    • 保存后就可以运行我们的项目了
      在这里插入图片描述
      当把光标放到我们的超链接上面,就可以在我们的状态栏里看到我们超链接的请求地址

    在这里插入图片描述
    点击后跳转我们的 target 页面,至此我们的第一个springMVC 项目就结束了

    在这里插入图片描述

  • 相关阅读:
    探索CSS中的宽度设置:width: 100% 与 width: auto 的区别
    2024年vue 开发环境 Node.js于win10环境下的安装
    代码随想录day38 || 动态规划理论基础 || 斐波那契数 || 爬楼梯 || 最小花费爬楼梯
    C++面向对象语言自制多级菜单
    回归预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测
    Selenium WebElement: Selenium 中的页面元素以及常用的属性和方法
    Portainer - 管理docker
    leetcode题刷250天(87)——654. 最大二叉树(DFS)
    解决 requests 2.28.x 版本 SSL 错误
    开源代码安全 | 西门子为保护代码安全采取了什么措施?
  • 原文地址:https://blog.csdn.net/qq_61323055/article/details/127954219