初识 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会话和工作环境的信息(这也是它们被称作环境变量的原 因ÿ…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...











