初识 SpringMVC,运行配置第一个Spring MVC 程序

news2024/11/29 8:51:47

1. 初识 SpringMVC,运行配置第一个Spring MVC 程序

文章目录

  • 1. 初识 SpringMVC,运行配置第一个Spring MVC 程序
    • 1.1 什么是 MVC
  • 2. Spring MVC 概述
    • 2.1 Spring MVC 的作用:
  • 3. 运行配置第一个 Spring MVC 程序
    • 3.1 第一步:创建Maven模块
    • 3.2 第二步:添加 web 支持
    • 3.3 第三步:配置 web.xml文件
    • 3.4 第四步:编写控制器 FirstController
    • 3.5 第五步:配置springmvc-servlet.xml文件
    • 3.6 第六步:根据自行定义好的视图解析器(的配置),提供视图
    • 3.7 第七步:控制器 FirstController 处理请求返回逻辑视图名称
    • 3.8 第八步:运行 Tomcat 测试
    • 3.9 执行流程总结:
  • 4. 第一个 Spring MVC 程序优化:
    • 4.1 在web.xml 配置文件中 ,手动自定 spring mvc 的配置文件
    • 4.2 配置 thymeleaf 翻译为 html 的模板
    • 4.3 编写 IndexController 定义个“首页”
    • 4.4 测试
  • 5. 总结:
  • 6. 最后:

1.1 什么是 MVC

MVC 是一种软件架构模式(是一种软件架构设计思想,不仅仅是Java开发中用到,其它语言也需要用到),它将应用分为三块。

  • M: Model (模型)
  • V:View (视图)
  • C:Controller (控制器)

应用为什么要被分为三块,优点是什么?

  • 低耦合,扩展能力增强
  • 代码复用性增强
  • 代码可维护性增强
  • 高内聚,让程序员更加专注业务的开发。

MVC 将应用分为三块,每一块各司其职,都有自己专注的事情要做,它们属于分工协作,互相配合:

  • Model :负责业务处理及数据的收集
  • View:负责数据的展示
  • Controller:负责调度,它是一个调度中心,它来决定什么时候调用Model 来处理业务,什么时候调用 View 视图来展示数据。

MVC 架构图模式如下:所示

在这里插入图片描述

MVC 架构模式的描述:前端浏览器发送请求给 Web 服务器,Web 服务器中的 Controller 接收到用户的请求,Controller 负责将前端提交的数据进行封装,然后 Controller 调用 Model 来处理业务,当Model 处理完业务后,会返回处理之后的数据给 Controller,Controller 再调用 View 来完成数据的展示,最终将结果响应给浏览器,浏览器进行渲染展示页面的内容。

面试题:什么是三层模型,并说一说MVC架构模式与三层模型的区别?

在这里插入图片描述

MVC 和 三层模型都采用了分层结构来设计应用程序,都是降低耦合度,提高扩展力,提高组件复用性,区别在于:它们的关注点不同,三层模型更关注业务逻辑组件的划分。

MVC 架构模式关注的是整个应用程序的层次关系和分离思想。现代的开发方式大部分都是 MVC 架构模式结合三层模型一起用的。

更多关于 MVC 架构的内容大家可以移步至:✏️✏️✏️ MVC 三层架构案例详细讲解_mvc三层架构-CSDN博客

2. Spring MVC 概述

Spring MVC 是一个实现了MVC架构模式的 Web 框架,底层基于 Servlet 实现。

Spring MVC 已经将MVC架构模式实现了,因此只要我们基于 Spring MVC 框架写代码,编写的程序就是符合 MVC架构模式的。(MVC的架子已经为我们搭好了,我们只需要添添补补即可)

Spring 框架中有一个子项目叫做:Spring Web,Spring Web 子项目当中包含很多模块,例如:

  • Spring MVC
  • Spring WebFlux
  • Spring Web Services
  • Spring Web Flow
  • Spring WebSocket
  • Spring Web Services Client

可见 Spring MVC 是 Spring Web 子项目当中的一个模块,因此也可以说 Spring MVC 是Spring 框架的一部分。

所以学习 Spring MVC 框架之前要先学习 Spring 框架中的 IOC 和 AOP 等内容。

另外,使用Spring MVC 框架的时候,同样也可以始于 IOC 和 AOP 。

关于 Spring的学习内容,大家可以移步至:✏️✏️✏️ Spring_ChinaRainbowSea的博客-CSDN博客

下面是 Spring 官方给出的 Spring 架构图,其中的 Web 中的 Servlet 指的就是 Spring MVC 部分

在这里插入图片描述

2.1 Spring MVC 的作用:

Spring MVC 框架能帮我们做什么,与 纯粹的 Servlet 开发有什么区别?

  1. 入口控制:Srping MVC 框架通过 DispatcherServlet 作为 入口控制器,负责接收请求和分发请求。而在 Servlet 开发中,需要自己编写 Servlet 程序,并在 web.xml 进行配置,才能接受和处理请求。
  2. 在 Spring MVC 中,表单提交时,可以自动将表单数据绑定到相应的 Java Bean 对象中,只需要在控制器方法的参数列表中声明该JavaBean对象即可,无需手动获取和赋值表单数据。而在纯粹的 Servlet 开发中,这些都是需要自己手动完成的。
  3. IOC容器:SpringMVC 框架通过IOC容器管理对象,只需要在配置文件中进行相应的配置即可,获取实例对象,而在 Servelt 开发中需要手动创建对象实例。
  4. 统一处理请求:Spring MVC 框架提供了拦截器,异常处理器等统一处理请求的机制,并且可以灵活地配置这些处理器。而在 Servelt 开发中,需要自动编写过滤器,异常处理器等,增加了代码的复杂度和开发难度。
  5. 视图解析:Spring MVC 框架提供了多种视图模块,如:JSP,Freemarker,Velocity等,并且支持国际化,主题等特性。而在Servlet开发中需要手动处理视图层,增加了代码的复杂度。

总之,与 Servelt 开发相比,Spring MVC 框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。

3. 运行配置第一个 Spring MVC 程序

3.1 第一步:创建Maven模块

第一步:创建Empty Project,起名:springmvc。
img
第二步:设置springmvc工程的JDK版本:Java21。
img
第三步:设置maven。
img
第四步:创建Maven模块
img
img

第五步:将pom.xml文件中的打包方式修改为 war

在这里插入图片描述

<packaging>war</packaging>

第六步:添加以下依赖

  • Spring MVC依赖
  • 日志框架Logback依赖
  • Servlet依赖
  • Spring6和Thymeleaf整合依赖

在这里插入图片描述

注意点:

这里我们是在一个单独的 Spring MVC 框架的容器中,配置的 Servlet依赖 ,而我们的 web 项目是运行在 Tomcat 服务器当中的,Tomcat 服务器本身就带 servlet 的依赖,防止冲突,以及重复,占用不必要的资源。所以我们在:Servlet依赖 jar 包下,设置: <scope>provided</scope> 指定依赖的访问,provided 表示这个依赖由第三方容器来提供,打war包的时候,这个依赖不会打入war包内,因为这个依赖由其它容器来提供的。就避免了在 Tomcat 当中重复了。同时注意:我们这里用的是:jakarta.servlet 包下的 Servlet 依赖,所以要用的 tomcat9以上才行,至于为什么要 Tomcat9以上(这里我使用的是 Tomcat 10 ),大家可以移步至:✏️✏️✏️ javaEE Web(Tomcat)深度理解 和 Servlet的本质_jakarta ee 部署 web server-CSDN博客

<?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.rainbowsea</groupId>
    <artifactId>springmvc-001</artifactId>
    <version>1.0-SNAPSHOT</version>
<!--    打包方式: war -->
    <packaging>war</packaging>



    <dependencies>
        <!-- Spring MVC依赖 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.1.4</version>
        </dependency>
        <!--日志框架Logback依赖-->
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.5.3</version>
        </dependency>
        <!--Servlet依赖-->
        <dependency>
            <groupId>jakarta.servlet</groupId>
            <artifactId>jakarta.servlet-api</artifactId>
            <version>6.0.0</version>
<!--            指定依赖的访问,provided 表示这个依赖由第三方容器来提供-->
<!--            打war包的时候,这个依赖不会打入war包内,因为这个依赖由其它容器来提供的-->
<!--            为什么这么做:是因为,我们的tomcat本身就带 servlet 的依赖,防止冲突,以及重复-->
<!--            同时注意:我们这里用的是:jakarta.servlet 所以要用的 tomcat9以上才行-->
            <scope>provided</scope>
        </dependency>
        <!--Spring6和Thymeleaf整合依赖-->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring6</artifactId>
            <version>3.1.2.RELEASE</version>
        </dependency>
    </dependencies>


</project>

3.2 第二步:添加 web 支持

第一步:在 main 目录下创建一个 webapp目录。注意:目录名必须是:webapp ,不可以为其它的。

在这里插入图片描述

注意:一般情况下,我们添加了webapp ,IDE是会自动给我们添加上一个小蓝点的,如果没有的话,需要我们自己手动添加。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注意 web.xml 文件的位置:E:\Java\SpringMVC\SpringMVC\springmvc-001\src\main\webapp\WEB-INF\web.xml
注意版本选择:6.0

在这里插入图片描述

手动在 WEB-INF 前面添加上 src\main\webapp路径。因为我们的WEB-INF 要在 webapp 目录下才行。在这里插入图片描述

在这里插入图片描述

img

3.3 第三步:配置 web.xml文件

Spring MVC 是一个 web 框架,在 java web 中谁来负责接收请求,处理请求,以及响应?

当然是 Servlet ,在 Spring MVC 框架中已经为我们写好了一个 Servlet ,它的名字叫做:DispatcherServlet ,我们称其为前端控制器 ,既然是 Servlet,那么它就需要在 web.xml 文件中进行配置。

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"
         version="6.0">

    <!--SpringMVC提供的前端控制器-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- /* 表示任何一个请求都交给DispatcherServlet来处理 -->
        <!-- / 表示当请求不是xx.jsp的时候,DispatcherServlet来负责处理本次请求-->
        <!-- jsp本质就是Servlet,因此如果请求是jsp的话,应该走它自己的Servlet,而不应该走DispatcherServlet -->
        <!-- 因此我们的 url-pattern 使用 / -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

注意:

在这里插入图片描述

<url-pattern>/</url-pattern> 配置为 / 的作用意义是:

/* 表示任何一个请求都交给DispatcherServlet来处理 -->
/ 表示当请求不是xx.jsp的时候,DispatcherServlet来负责处理本次请求-->
jsp本质就是Servlet,因此如果请求是jsp的话,应该走它自己的Servlet,而不应该走DispatcherServlet 
 <!-- 因此我们的 url-pattern 使用 / -->

DispatcherServlet 是 Spring MVC 框架为我们提供的最核心 的类。它是整个 Spring MVC 框架的前端控制器。负责接收 HTTP 请求,将请求路由到处理程序,处理响应信息,最终将响应返回给客户端。DispatcherServlet 是 Web 应用程序的主要入口之一,它的职责包括:

  1. 接收客户端的 HTTP 请求:DispatcherServlet 监听来自 Web 浏览器的 HTTP 请求,然后根据请求的 URL 将请求数据解析为 Request 对象。
  2. 处理请求的 URL:DispatcherServlet 将请求的URL(Uniform Resource Locator)与处理程序进行匹配,确定要调用哪个控制器(Controller) 来处理此请求。
  3. 调用相应的控制器:DispatcherServlet 将请求发送给找到的控制器处理,控制器将执行业务逻辑,然后返回一个模型对象(Model)
  4. 渲染视图:DispatcherServlet 将调用视图对象引擎,将模型对象呈现为用户可以查看的 HTML 页面。
  5. 返回响应给客户端:DispatcherServlet 将用户生成的响应发送回浏览器,响应可以包括:表单,JSON,XML,HTML 以及其它类型的数据。

DispatcherServlet 工作流程图:

在这里插入图片描述

3.4 第四步:编写控制器 FirstController

DispatcherServlet 接收到请求之后,会根据请求路径分发到对应的Controller,Controller 来负责处理请求的核心业务。在Spring MVC 框架中 Controller 是一个普通的Java类(一个普通的POJO类,不需要继承任何类或实现任何接口),需要注意的是:POJO类要纳入 IOC 容器来管理,POJO类的生命周期由 Spring 来管理,因此要使用注解标注@Controller

在这里插入图片描述

package com.rainbowsea.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 该注解表示,将该类交给 Spring IOC 容器管理
public class FirsController {



}

3.5 第五步:配置springmvc-servlet.xml文件

SpringMVC框架有它自己的配置文件,该配置文件的名字默认为:-servlet.xml,默认存放的位置是WEB-INF 目录下:

在这里插入图片描述

当然,这个默认的,都是可以通过配置修改的。关于这部分的内容,在后续更新文章当中会说明的。

要在该 -servlet.xml 配置文件当中,配置如下两项信息:

  1. 第一项:组件扫描,Spring 扫描这个包中的类,将这个包中的类实例化并纳入IOC容器当中进行管理。

  2. 第二项:视图解析器:视图解析器(View Resolver) 的作用主要是将Controller 方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给 DispatcherServlet,并最终由 DispatcherServlet 将该视图对象转化为响应结果,呈现给用户。

  3. 注意:如果采用了其它视图,请配置对应的视图解析器,例如:

    • JSP的视图解析器:InternalResourceViewResolver

    • FreeMarker视图解析器:FreeMarkerViewResolver

    • Velocity视图解析器:VelocityViewResolver

第一项:组件扫描,Spring 扫描这个包中的类,将这个包中的类实例化并纳入IOC容器当中进行管理。

在这里插入图片描述

在这里插入图片描述

第二项:视图解析器:视图解析器(View Resolver) 的作用主要是将Controller 方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给 DispatcherServlet,并最终由 DispatcherServlet 将该视图对象转化为响应结果,呈现给用户

在这里插入图片描述

在这里插入图片描述

<?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">

<!--    Spring MVC 框架的配置文件-->

<!--    组件扫描-->
    <context:component-scan base-package="com.rainbowsea.springmvc.controller"></context:component-scan>


    <!--视图解析器-->
    <bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
        <!--作用于视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
        <property name="characterEncoding" value="UTF-8"/>
        <!--如果配置多个视图解析器,它来决定优先使用哪个视图解析器,它的值越小优先级越高-->
        <property name="order" value="1"/>
        <!--当 ThymeleafViewResolver 渲染模板时,会使用该模板引擎来解析、编译和渲染模板-->
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring6.SpringTemplateEngine">
                <!--用于指定 Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、模板资源名称、文件编码等信息,加载模板并对其进行解析-->
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
                        <!--设置模板文件的位置(前缀)-->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html-->
<!--                        将来要在 xxx.thymeleaf 文件中编写符合 Thymeleaf 语法格式的字符串-> 也被称之为"模板字符串"-->
                        <property name="suffix" value=".thymeleaf"/>
                        <!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等-->
                        <property name="templateMode" value="HTML"/>
                        <!--用于模板文件在读取和解析过程中采用的编码字符集-->
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
</beans>

注意:

<property name="prefix" value="/WEB-INF/templates/"/>
                        <!--设置模板文件后缀(后缀),Thymeleaf文件扩展名不一定是html,也可以是其他,例如txt,大部分都是html-->
<!--                        将来要在 xxx.thymeleaf 文件中编写符合 Thymeleaf 语法格式的字符串-> 也被称之为"模板字符串"-->
                        <property name="suffix" value=".thymeleaf"/>
                        <!--设置模板类型,例如:HTML,TEXT,JAVASCRIPT,CSS等-->
                        <property name="templateMode" value="HTML"/>
                        <!--用于模板文件在读取和解析过程中采用的编码字符集-->
                        <property name="characterEncoding" value="UTF-8"/>

在这里插入图片描述

3.6 第六步:根据自行定义好的视图解析器(的配置),提供视图

在这里插入图片描述

在WEB-INF目录下新建 templates目 录,在 templates 目录中新建 thymeleaf 文件,例如:first.thymeleaf,并提供以下代码:

在这里插入图片描述

在这里插入图片描述

注意:这个是 Thymeleaf的模板字符串,只有:Thymeleaf的模板引擎才可以解析,虽然看上去是:html,但是它不是 html,本质上是 Thymeleaf的模板字符串,浏览器是看不懂的的。只有将这些信息,交给 Thyemeleaf 视图解析器翻译真正转化为了 html代码(的时候才是真正的html),

,浏览器才能看懂。至于为什么是 html 呢,是因为这里我们配置的 Thymeleaf 视图解析器,就是配置的翻译为 html 文件,当然也可以配置翻译为其它的类型的文件。

在这里插入图片描述

3.7 第七步:控制器 FirstController 处理请求返回逻辑视图名称

在这里插入图片描述

package com.rainbowsea.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 该注解表示,将该类交给 Spring IOC 容器管理
public class FirsController {



    // 请求映射
    // 这个方法是一个实例方法
    // 这个方法目前返回一个String 字符串
    // 返回值代表一逻辑视图名称,一个逻辑视图名称,会对应上一个真正的物理上的文件
    @RequestMapping(value = "/test")
    public String hehe() {
        // 返回一个逻辑视图名称
        return "first";
    }


}

@RequestMapping 注解标识:该请求的路径映射。

注意:方法名随意,但是返回类型一定要是String 字符串的类型,因为这个返回值是一个逻辑视图的名称 是一个字符串。

什么是逻辑视图名称

在这里插入图片描述

最终会将逻辑视图名称转换为物理视图名称
> 逻辑视图名称:first
> 物理视图名称: 前缀 + first + 后缀
> 最终路径是:/WEB-INF/templates/first.thymeleaf
> 使用Thymeleaf 模板引擎,/WEB-INF/templates/first.thymeleaf转换成 html代码,最终响应到浏览器端

3.8 第八步:运行 Tomcat 测试

注意:由于我们这里导入的是:jakarta.servlet 包下的 servelt 所以要用,Tomcat 9 以上的版本才行,这里我使用的是 Tomcat 10

在这里插入图片描述

第一步:配置Tomcat服务器

img

img

第三步:启动Tomcat服务器。如果在控制台输出的信息有中文乱码,请修改tomcat服务器配置文件:apache-tomcat-10.1.19\conf\logging.properties

img

第四步:打开浏览器,在浏览器地址栏上输入地址:http://localhost:8080/springmvc/test

在这里插入图片描述

3.9 执行流程总结:

  1. 浏览器发送请求:http://localhost:8080/springmvc/haha
  2. SpringMVC的前端控制器DispatcherServlet接收到请求
  3. DispatcherServlet根据请求路径 /haha 映射到 FirstController#名字随意(),调用该方法
  4. FirstController#名字随意() 处理请求
  5. FirstController#名字随意() 返回逻辑视图名称 first 给视图解析器
  6. 视图解析器找到 /WEB-INF/templates/first.thymeleaf文件,并进行解析,生成视图解析对象返回给前端控制器DispatcherServlet
  7. 前端控制器DispatcherServlet响应结果到浏览器。

4. 第一个 Spring MVC 程序优化:

4.1 在web.xml 配置文件中 ,手动自定 spring mvc 的配置文件

Spring MVC 中的配置文件,名字是可以指定的,位置也是可以指定的,怎么指定?
设置 DispatcherServlet 的初始化参数


<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        通过 Servlet 的初始化参数来指定Spring MVC 配置文件的名字和位置-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
<!--            指定Spring MVC 配置文件的名字是:springmvc.xml-->
<!--            指定了Spring MVC 文件存放的路径是:类的根路径 classpath-->
<!--            这里爆红是:idea的误报-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

建议: 在 web 服务器启动的时候,初始化 DispatcherServlet,这样用户第一次请求时,效率较高。体验好

重点:SpringMVC 配置文件的名字和路径是可以手动设置的,如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">

    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--        通过 Servlet 的初始化参数来指定Spring MVC 配置文件的名字和位置-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
<!--            指定Spring MVC 配置文件的名字是:springmvc.xml-->
<!--            指定了Spring MVC 文件存放的路径是:类的根路径 classpath-->

            <param-value>classpath:springmvc.xml</param-value>
        </init-param>

<!--        在 web 服务器启动的时候,就初始化 DispatcherServlet-->
<!--        这是优化方式,可以提高用户第一次发送请求的体验,第一次请求的效率较高-->
        <load-on-startup>0</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

通过来设置SpringMVC配置文件的路径和名字。在DispatcherServlet的init方法执行时设置的。
1建议加上,这样可以提高用户第一次访问的效率。表示在web服务器启动时初始化DispatcherServlet。

下面是 :springmvc.xml 的编写:

在这里插入图片描述

4.2 配置 thymeleaf 翻译为 html 的模板

这里我们将 thymeleaf 视图解析器的后缀改为:

WEB-INF目录下新建templates目录,在templates目录中新建html文件,例如:first.html,并提供以下代码:

在这里插入图片描述

在这里插入图片描述

对于每一个Thymeleaf文件来说 xmlns:th=“http://www.thymeleaf.org” 是必须要写的,为了方便后续开发,可以将其添加到html模板文件中:

img

4.3 编写 IndexController 定义个“首页”

在这里插入图片描述

package com.rainbowsea.springmvc.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller // 表示交给 Spring IOC 容器管理
public class IndexController {


    @RequestMapping("/")
    public String index() {
        return "index";
    }

}

表示请求路径如果是:http://localhost:8080/springmvc/ ,则进入 /WEB-INF/templates/index.html 页面。
这就是项目的首页效果!!!!!

在这里插入图片描述

index.html 的编写

<!DOCTYPE html>
<html lang="en" xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>首页</h1>

<a th:href="@{/first}"> first Spring mvc </a>
</body>
</html>

4.4 测试

部署到web服务器,启动web服务器,打开浏览器,在地址栏上输入:http://localhost:8080/springmvc/

在这里插入图片描述

5. 总结:

  1. 总之,与 Servelt 开发相比,Spring MVC 框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。

  2. servlet依赖(scope设置为 provided,表示这个依赖最终由第三方容器来提供)

  3. 注意:一般情况下,我们添加了webapp ,IDE是会自动给我们添加上一个小蓝点的,如果没有的话,需要我们自己手动添加。

  4. DispatcherServlet 是 Spring MVC 框架为我们提供的最核心 的类。它是整个 Spring MVC 框架的前端控制器。负责接收 HTTP 请求,将请求路由到处理程序,处理响应信息,最终将响应返回给客户端。DispatcherServlet 是 Web 应用程序的主要入口之一,

  5. 视图解析器:视图解析器(View Resolver) 的作用主要是将Controller 方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给 DispatcherServlet,并最终由 DispatcherServlet 将该视图对象转化为响应结果,呈现给用户

  6. 编写FirsController ,在类上标注 @Controller 注解,纳入IOC容器的管理,当然,也可以采用 @Component注解 进行标注, @Controller 只是 @Component 注解的别名

  7. Spring MVC 中的配置文件,名字是可以指定的,位置也是可以指定的,怎么指定?
    设置 DispatcherServlet 的初始化参数
          
    ```xml
          
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--        通过 Servlet 的初始化参数来指定Spring MVC 配置文件的名字和位置-->
            <init-param>
                <param-name>contextConfigLocation</param-name>
    <!--            指定Spring MVC 配置文件的名字是:springmvc.xml-->
    <!--            指定了Spring MVC 文件存放的路径是:类的根路径 classpath-->
    <!--            这里爆红是:idea的误报-->
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
    ```
    建议: 在 web 服务器启动的时候,初始化 DispatcherServlet,这样用户第一次请求时,效率较高。体验好
    

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费开源的地图解析工具【快速上手】

视频学习地址 这篇文章和【Nominatim】是相呼应的&#xff0c;在尝试了OSM数据一直有问题之后&#xff0c;通过别人的指点是不是可以换个思路&#xff0c;我的数据只需要精确到市级别&#xff0c;也可以不用OSM这样全的数据&#xff08;主要原因还是OSM太过庞大了&#xff09; …

Mybatis(根据id查找这一行的数据)

首先在查询之前&#xff0c;我们先要做些基础的工作先创建一个以你的数据库命名的model类 我的数据库的名字叫admin 我就创建了一个Admin的类 用来方便数据的访问 然后我们就要创建一个接口来声明我们要写的方法 我创建的接口命名为AdminDao 在创建一个xml的类用来实现声明的…

NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点

目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码&#xff01;启动! [LitCTF 2023]Flag点击就送&#xff01; 相关知识点 1.intval 绕过 绕过的方式&#xff1a; 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息&#xff0c;所以想到使用dis…

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…

利口 202. 快乐数

力扣 202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结…

信号基本分析方法——频域分析

二、频域分析 随机信号的时域分析只能提供有限的时域故障特征信息&#xff0c;故障发生时往往会引起信号频率结构的变化&#xff0c;而故障频率可以计算和预知&#xff0c;通过检测频率的幅值变换规律&#xff0c;就可以监控故障的发展过程。 频谱分析的理论基础是傅里叶变换…

AI音乐模型:创新还是颠覆?

文章目录 AI音乐大模型的崛起音乐创作门槛的降低与兴奋AI音乐作品的版权归属问题创意产业在AI阴影下的生长结语 &#x1f389;欢迎来到AIGC人工智能专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&…

【数据结构】链表的大概认识及单链表的实现

目录 一、链表的概念及结构 二、链表的分类 三、单链表的实现 建立链表的节点&#xff1a; 尾插——尾删&#xff1a; 头插——头删&#xff1a; 查找&#xff1a; 指定位置之后删除——插入&#xff1a; 指定位置之前插入——删除指定位置&#xff1a; 销毁链表&am…

向量和矩阵的点乘、叉乘

# 本科学习的全都还回去了-_- 一、向量 &#xff08;1&#xff09;点乘 向量点积&#xff0c; &#x1d44e;⋅&#x1d44f;&#x1d450; &#xff0c;符号为 ⋅ &#xff0c;要求向量长度相同&#xff0c;是两个向量之间的点乘运算&#xff0c;结果是一个标量。又称&…

在 Equinix 上使用 MinIO 控制云数据成本

公有云改变了公司构建、部署和管理应用程序的方式&#xff0c;主要是向好的方向发展。在您刚开始使用时&#xff0c;公有云会提供基础架构、服务、支持和维护&#xff0c;以便快速启动和运行。它以几乎无限的方式提供最终的可伸缩性&#xff0c;无论应用程序的负载如何&#xf…

ROS中的TF是什么

在ROS (Robot Operating System) 中&#xff0c;tf::TransformBroadcaster 是一个用于发布坐标变换信息的重要类&#xff0c;尤其在处理机器人定位和导航数据时非常常见。tf::TransformBroadcaster 对象允许你广播从一个坐标系到另一个坐标系的变换关系&#xff0c;这对于多传感…

c语言 课设 atm

功能需求分析 ATM功能主界面:显示所能进行的操作,用户可多次选择。 ATM注册界面:输入用户名,用户密码,确认密码,密码长度不是六位重新输入,两次密码不一致重新输入,输入账号。密码隐藏,实现退格换行对*无影响。多人注册 ATM登录界面:输入账号,密码,三次以内输入…

bug记录——C语言中运算符前假后面不执行

A&&B A为真&#xff0c;才会判断B&#xff0c; 所以如果B访问越界的情况下必有A为假&#xff0c;那么代码是正确的 像这里&#xff0c;当child 1 > n时&#xff0c;a[child 1]越界访问&#xff0c; 但由于&&前面判断了child 1 < n为假&#xff0c;所以…

荒野大镖客2启动找不到emp.dll的7个修复方法,轻松解决dll丢失的办法

一、emp.dll文件丢失的常见原因 安装或更新问题&#xff1a;在软件或游戏的安装过程中&#xff0c;可能由于安装程序未能正确复制文件到目标目录&#xff0c;或在更新过程中文件被意外覆盖或删除&#xff0c;导致emp.dll文件丢失。 安全软件误删&#xff1a;某些安全软件可能…

跌倒识别:守护公共安全的AI技术应用场景-免费API调用

随着科技的不断进步&#xff0c;人工智能在各个领域的应用日益广泛&#xff0c;其中在公共安全领域&#xff0c;智能跌倒识别系统正逐渐成为守护人们安全的重要工具。本文将分享智能跌倒识别系统在不同场景下的应用及其重要性。 产品在线体验地址-API调用或本地化部署 AI算法模…

C#实现音乐在线播放和下载——Windows程序设计作业3

1. 作业内容 编写一个C#程序&#xff0c;在作业二实现的本地播放功能的基础上&#xff0c;新增在线播放和在线下载功能&#xff0c;作业二博客地址&#xff1a;C#实现简单音乐文件解析播放——Windows程序设计作业2 2. 架构选择 考虑到需求中的界面友好和跨版本兼容性&#xf…

【Linux】基础IO_3

文章目录 六、基础I/O3. 软硬链接4. 动静态库 未完待续 六、基础I/O 3. 软硬链接 使用 ln 就可以创建链接&#xff0c;使用 ln -s 可以创建软链接&#xff0c;直接使用 ln 则是硬链接。 我们对硬链接进行测试一下&#xff1a; 根据测试&#xff0c;我们知道了 硬链接就像一…

Django框架数据库ORM查询操作

Django框架在生成数据库的models模型文件后&#xff0c;旧可以在应用中通过ORM来操作数据库了。今天抽空试了下查询语句。以下是常用的查询语句。 以下查询需要引入django的Sum&#xff0c;Count&#xff0c;Q模块 from django.db.models import Sum,Count,Q 导入生成的mode…

【FreeRTOS】删除任务 用遥控器控制音乐

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》 学习视频&#xff1a;【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS&#xff08;FreeRTOS教程 基于STM32&#xff0c;以实际项目为导向&#xff09;】 【精准空降到 01:22】 https://www.bilibili.com/video/BV1…

App Store苹果应用商店如何退款

这几天想在App Store找一款录音可以转文字的app&#xff0c;结果找到后需要订阅才能转文字&#xff1b;最短1个月38元&#xff0c;购买之后&#xff0c;试用了功能&#xff0c;发现转出来的文字差强人意&#xff0c;且好多语音漏过了没转出来&#xff1b;于是决定取消订阅&…