初识 SpringMVC,运行配置第一个Spring MVC 程序
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 开发有什么区别?
- 入口控制:Srping MVC 框架通过 DispatcherServlet 作为 入口控制器,负责接收请求和分发请求。而在 Servlet 开发中,需要自己编写 Servlet 程序,并在
web.xml进行配置,才能接受和处理请求。 - 在 Spring MVC 中,表单提交时,可以自动将表单数据绑定到相应的 Java Bean 对象中,只需要在控制器方法的参数列表中声明该JavaBean对象即可,无需手动获取和赋值表单数据。而在纯粹的 Servlet 开发中,这些都是需要自己手动完成的。
- IOC容器:SpringMVC 框架通过IOC容器管理对象,只需要在配置文件中进行相应的配置即可,获取实例对象,而在 Servelt 开发中需要手动创建对象实例。
- 统一处理请求:Spring MVC 框架提供了拦截器,异常处理器等统一处理请求的机制,并且可以灵活地配置这些处理器。而在 Servelt 开发中,需要自动编写过滤器,异常处理器等,增加了代码的复杂度和开发难度。
- 视图解析:Spring MVC 框架提供了多种视图模块,如:JSP,Freemarker,Velocity等,并且支持国际化,主题等特性。而在Servlet开发中需要手动处理视图层,增加了代码的复杂度。
总之,与 Servelt 开发相比,Spring MVC 框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。
3. 运行配置第一个 Spring MVC 程序
3.1 第一步:创建Maven模块
第一步:创建Empty Project,起名:springmvc。

第二步:设置springmvc工程的JDK版本:Java21。

第三步:设置maven。

第四步:创建Maven模块


第五步:将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 目录下才行。
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 应用程序的主要入口之一,它的职责包括:
- 接收客户端的 HTTP 请求:DispatcherServlet 监听来自 Web 浏览器的 HTTP 请求,然后根据请求的 URL 将请求数据解析为 Request 对象。
- 处理请求的 URL:DispatcherServlet 将请求的URL(Uniform Resource Locator)与处理程序进行匹配,确定要调用哪个控制器(Controller) 来处理此请求。
- 调用相应的控制器:DispatcherServlet 将请求发送给找到的控制器处理,控制器将执行业务逻辑,然后返回一个模型对象(Model)
- 渲染视图:DispatcherServlet 将调用视图对象引擎,将模型对象呈现为用户可以查看的 HTML 页面。
- 返回响应给客户端: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 配置文件当中,配置如下两项信息:
第一项:组件扫描,Spring 扫描这个包中的类,将这个包中的类实例化并纳入IOC容器当中进行管理。
第二项:视图解析器:视图解析器(View Resolver) 的作用主要是将Controller 方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给 DispatcherServlet,并最终由 DispatcherServlet 将该视图对象转化为响应结果,呈现给用户。
注意:如果采用了其它视图,请配置对应的视图解析器,例如:
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服务器


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

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

3.9 执行流程总结:
- 浏览器发送请求:http://localhost:8080/springmvc/haha
- SpringMVC的前端控制器DispatcherServlet接收到请求
- DispatcherServlet根据请求路径 /haha 映射到 FirstController#名字随意(),调用该方法
- FirstController#名字随意() 处理请求
- FirstController#名字随意() 返回逻辑视图名称 first 给视图解析器
- 视图解析器找到 /WEB-INF/templates/first.thymeleaf文件,并进行解析,生成视图解析对象返回给前端控制器DispatcherServlet
- 前端控制器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模板文件中:

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. 总结:
总之,与 Servelt 开发相比,Spring MVC 框架可以帮我们节省很多时间和精力,减少代码的复杂度,更加专注于业务开发。同时,也提供了更多的功能和扩展性,可以更好地满足企业级应用的开发需求。
servlet依赖(scope设置为 provided,表示这个依赖最终由第三方容器来提供)
注意:一般情况下,我们添加了webapp ,IDE是会自动给我们添加上一个小蓝点的,如果没有的话,需要我们自己手动添加。
DispatcherServlet 是 Spring MVC 框架为我们提供的最核心 的类。它是整个 Spring MVC 框架的前端控制器。负责接收 HTTP 请求,将请求路由到处理程序,处理响应信息,最终将响应返回给客户端。DispatcherServlet 是 Web 应用程序的主要入口之一,
视图解析器:视图解析器(View Resolver) 的作用主要是将Controller 方法返回的逻辑视图名称解析成实际的视图对象。视图解析器将解析出的视图对象返回给 DispatcherServlet,并最终由 DispatcherServlet 将该视图对象转化为响应结果,呈现给用户
编写FirsController ,在类上标注 @Controller 注解,纳入IOC容器的管理,当然,也可以采用 @Component注解 进行标注, @Controller 只是 @Component 注解的别名
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. 最后:
“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”
相关文章:
初识 SpringMVC,运行配置第一个Spring MVC 程序
1. 初识 SpringMVC,运行配置第一个Spring MVC 程序 文章目录 1. 初识 SpringMVC,运行配置第一个Spring MVC 程序1.1 什么是 MVC 2. Spring MVC 概述2.1 Spring MVC 的作用: 3. 运行配置第一个 Spring MVC 程序3.1 第一步:创建Mave…...
STM32F1+HAL库+FreeTOTS学习1——FreeRTOS入门
STM32F1HAL库FreeTOTS学习1——FreeRTOS入门 裸机开发与操作系统嵌入式操作系统简介FreeRTOS简介FreeRTOS的几个重要概念任务调度器任务状态状态列表 裸机开发与操作系统 在以往的嵌入式学习中,我们最常用的就是裸机开发,所谓裸机开发就是指在没有操作系…...
杭州代理记账报税全程托管专业实力全面指南
杭州代理记税报税服务可以为企业提供全程托管财务管理解决方案,确保企业的财务工作专业、高效、合规。以下是杭州代理记税报税服务全面指南: https://www.9733.cn/news/detail/185.html 一、代理记账报税服务的内容 基础服务: 每日记…...
PHP 界的扛把子 Swoole 异步通信利器
大家好,我是码农先森。 引言 我今天主要介绍的内容是包括但不仅限于 Swoole ,也有一部分 Go 语言的内容。 为什么要介绍 Swoole ? 先说一说背景吧,我们项目组之前要为《香港 01》开发一个积分系统的项目,这个系统的主要功能包…...
40.连接假死-空闲检测-发送心跳
连接假死情况 1.网络设备出现故障,例如网卡,机房等。底层的TCP连接已经断开,但应用程序没有感知到,仍然占着资源。 2.公网网络不稳定,出现丢包。若果连续出现丢包,这时现象就是客户端数据发不出去,服务端也一直收不到数据,就这么一直耗着。 3.应用程序线程阻塞,无法…...
hdfs高可用文件系统架构
1、整体架构 2、角色简介 2.1、namenode NameNode 是 HDFS 集群中的核心组件,负责管理文件系统的元数据、处理客户端请求、管理数据块、确保数据完整性和高可用性。由于其重要性,NameNode 的性能和可靠性直接影响整个 HDFS 集群的性能和可靠性。在生产…...
从官方源码精简出第1个FreeRTOS程序
一、下载官方源码 1、打开百度搜索freerots,找到官网:FreeRTOS官网 2、将源码解压到没有中文目录的路径下 二、删减目录 1、删除FreeRTOS-Plus和tools 2、删除FreeRTOS/Demo下除CORTEX_STM32F103_Keil外的所有文件 3、删除FreeRTOS\Source\portable下除RVDS和MemM…...
谷歌上搞下来的,无需付费,可以收藏!
在数字化时代,我们越来越依赖于智能设备来获取信息和知识。中国智谋App正是这样一款应用,它将中国古代的智慧与谋略书籍带入了我们的移动设备,让我们能够随时随地学习和领悟。而且提供文言文的原文和译文。 软件下载方式:谷歌上搞…...
宿主机无法通过ip连接wsl2解决方案
文章目录 原因排查网络模式win11防火墙关闭wsl ubuntu防火墙 如果之前能连接现在连接不上可以参考该方案 原因排查 网络模式win11防火墙(win11新增了Hyper-V防火墙)wsl2 ubuntu防火墙 网络模式 wsl2的默认网络模式是NAT,建议修改为镜像模式。在C:\Users\<User…...
Ruby编程语言学习
学习Ruby编程语言,你可以按照以下步骤进行: ### 1. 基础知识入门 #### 安装Ruby - 访问Ruby官网(https://www.ruby-lang.org/)下载适合你操作系统的版本。 - 对于Linux用户,可以使用包管理器安装。 #### 学习资源 -…...
Redis实战—基于setnx的分布式锁与Redisson
本博客为个人学习笔记,学习网站与详细见:黑马程序员Redis入门到实战 P56 - P63 目录 分布式锁介绍 基于SETNX的分布式锁 SETNX锁代码实现 修改业务代码 SETNX锁误删问题 SETNX锁原子性问题 Lua脚本 编写脚本 代码优化 总结 Redisson 前言…...
ARM功耗管理框架之LPI
安全之安全(security)博客目录导读 思考:功耗管理框架?SCP?PPU?LPI?之间的关系?如何配合? 目录 一、功耗管理框架中的LPI 二、LPI分类 三、Q-Channel和P-Channel对比 四、Q-Channel和P-Ch…...
Unity太空避障Demo总结
太空避障:主要是实现飞机躲避子弹 面板基类、音乐类、排行榜类、json等等都和上一篇Unity坦克迷宫Demo总结一样,太空避障主要是对四元数的练习和使用 1.选择飞机面板 (1)通过左右按钮对显示的模型进行切换 (2ÿ…...
SpringSecurity-重写默认配置
重写UserDetailService组件 1.注入Bean的方式 /*** author: coffee* date: 2024/6/22 21:22* description: 重写springsecurity默认组件:注入Bean的方式*/Configuration public class ProjectConfig {/*** 重写userDetailsService组件*/Beanpublic UserDetailsSer…...
C# 判断值是否在枚举里
你还在代码里面通篇通过数字的定义类型。比如type为1 表示xx,type为2 表示yy吗?然后程序里面通过数字1和2来判断吗?比如下面类似的代码: if(type1){ //.... } else if(type2){ //... } else if(type3){ //... } 老鸟们一般都会用枚举来定义…...
Interview preparation--elasticSearch倒排索引原理
搜索引擎应该具备哪些要求 查询速度快 优秀的索引结构设计高效率的压缩算法快速的编码和解码速度 结果准确 ElasiticSearch 中7.0 版本之后默认使用BM25 评分算法ElasticSearch 中 7.0 版本之前使用 TP-IDF算法 倒排索引原理 当我们有如下列表数据信息,并且系统…...
银河麒麟高级服务器操作系统V10SP2(X86)配置bond0的mac地址为指定子网卡的mac地址
银河麒麟高级服务器操作系统V10SP2(X86)配置bond0的mac地址为指定子网卡的mac地址 一 系统环境二 删除和备份原有配置2.1 down掉bond02.2 备份之前的bond配置到/root/bak2.3 删除bond配置(网卡文件根据实际情况变化) 三 新建bond0…...
python中不同维度的Tensor向量为何可以直接相加——广播机制
文章目录 广播机制示例解释广播机制如何工作代码示例输出解释广播机制的本质 在矩阵加法中,如果两个张量的形状不同,但其中一个张量的形状可以通过广播机制扩展到与另一个张量的形状相同,则可以进行加法操作。广播机制在深度学习框架…...
38.MessageToMessageCodec线程安全可被共享Handler
handler被注解@Sharable修饰的。 这样的handler,创建一个实例就够了。例如: ByteToMessageCodec的子类不能被@Sharable修饰 如果自定义类是MessageToMessageCodec的子类就是线程共享的,可以被@Sharable修饰的 package com.xkj.protocol;import com.xkj.message.Message; i…...
Linux中的全局环境变量和局部环境变量
Linux中的全局环境变量和局部环境变量 一、全局环境变量二、局部环境变量三、 设置全局环境变量 bash shell用一个叫作环境变量 (environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原 因ÿ…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...











