SpringMVC 是基于 Spring 框架的 MVC 模式 Web 开发框架,核心解决传统 Servlet 开发中 “一个功能一个 Servlet” 的冗余问题,通过前端控制器统一分发请求,简化开发流程并提升可维护性。
mvc >里面自己写了一个servlet 放到tomcat 里面接收所有请求>转发到xxxController
初步配置
创建maven项目

新建mvc配置文件

1. Maven 依赖配置(pom.xml)
<dependencies>
<!-- Spring 核心上下文依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.25</version>
</dependency>
<!-- SpringMVC 核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.25</version>
</dependency>
</dependencies>
配置原因:
spring-context:提供 Spring 核心容器功能,支持依赖注入(DI)和控制反转(IOC)spring-webmvc:包含 SpringMVC 核心组件(如 DispatcherServlet、处理器映射等),是实现 MVC 模式的基础- 统一版本号(5.3.25):避免不同版本组件间的兼容性问题
2. Web 应用配置(web.xml)
<!-- dispatcherServlet :前端控制器 后续所有前端请求 都会映射到这边 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc的配置文件 -->
<init-param>
<!-- contextConfigLocation:固定写法 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<!-- 请求映射,拦截所有的请求都映射到DispatcherServlet-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
配置原因:
DispatcherServlet是 SpringMVC 的核心前端控制器,负责接收所有客户端请求并分发到相应处理器contextConfigLocation参数:指定 SpringMVC 配置文件位置,使容器能加载自定义配置<url-pattern>/</url-pattern>:拦截所有请求(除 JSP 外),确保所有请求都经过 SpringMVC 处理流程- 作为 Web 应用的入口配置,连接 Web 容器(如 Tomcat)与 SpringMVC 框架
3. SpringMVC 核心配置(spring-mvc.xml)
<!-- 包扫描配置:仅扫描控制器层 -->
<context:component-scan base-package="com.cykj.controller"/>
配置原因:
context:component-scan:启用组件扫描,Spring 会自动识别并实例化标注了@Controller等注解的类base-package="com.cykj.controller":限定扫描范围为控制器层,避免扫描其他层(如服务层)导致的资源浪费和功能冲突- 通过 XML 配置集中管理 SpringMVC 核心功能,便于后期扩展(如添加视图解析器、拦截器等)
- 作用:启用 Spring 组件扫描,仅扫描控制器层(
com.cykj.controller),自动识别并实例化标注@Controller或@RestController的类。 - 优势:限定扫描范围,避免扫描服务层、数据层等非控制器组件,减少资源浪费和功能冲突。
4. 控制器实现(UserController.java)
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/test")
@ResponseBody
public void test(){
System.out.println("test");
}
}
[!note]
这里没有SpringBoot内置tomcat 启动时tomcat需要手动配置一下
浏览器默认访问的静态页面
所以访问时 没有静态页面 会显示404

所以我们用到 @ResponseBody 注解
SpringMVC的一些操作方法
初步测试
进行如上配置后 初步测试如下

接收参数的形式
继续导入 相关依赖
<!-- Servlet API 依赖 -->
<!-- 原因:
1. SpringMVC 构建于 Servlet 规范之上,编译时需要 Servlet API 接口(如 HttpServletRequest)。
2. <scope>provided</scope> 表示该依赖由运行时的 Web 容器(如 Tomcat)提供,打包时不包含。
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
进行测试



[!note]
@RequestParam
一句话总结:拿 URL 或表单里的零散参数。
用在哪? 控制器方法的参数前面。
干什么用? 把 URL 地址栏里 ? 后面的参数(如 ?name=张三),或者 HTML 表单里输入框的值,直接赋值给方法里的变量。
举个例子:
URL: …/hello?name=李四
代码: public String hello(@RequestParam String name)
结果:方法里的 name 变量的值就是 “李四”。
@RequestParam vs @RequestBody (一句话区别)
@RequestParam: 从 地址栏 或 表单 拿 零散的小参数 (如 name=张三)。
@RequestBody: 从 请求体 拿 完整的大对象 (如 {“name”:“张三”, “age”:20})。
VO对象接收时json的配置操作
接下来 当传入参数 非常多时 我们一般使用一个VO类去接收 这个时候 mvc对json较不友好 所以我们需要导入一个fastjson的依赖 并进行手动配置
<!--fastjson 处理 用类接收参数时 通过mvc自动转换为json 避免媒体类型错误的的警告-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.40</version>
</dependency>
在spring-mvc.xml 配置文件当中 配置如下
- 作用:启用 SpringMVC 注解支持(如
@RequestMapping、@RequestParam),同时配置消息转换器,支持 JSON 数据解析。 - fastJsonHttpMessageConverter 配置:指定支持的媒体类型(text/html、application/json 等),实现 JSON 与 Java 对象的双向转换。
<!--添加注解的支持-->
<mvc:annotation-driven>
<!--消息解析器-->
<mvc:message-converters>
<ref bean="fastJsonHttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!--创建FastJsonHttpMessageConverter 并赋值-->
<!--注意: FastJSON2 已经剔除对spring的支持-->
<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=utf-8</value>
<value>application/json</value>
<value>application/x-www-form-urlencoded</value>
<value>multipart/form-data</value>
</list>
</property>
</bean>
进行测试

[!important]
注意这里发送的格式需要是json
如
{
“id”:“1”,
“username”:“root”,
“password”:“123456”
}
静态资源的初步访问
关于静态资源的访问 mvc默认 jsp 所以 当访问 html等静态资源时 需在 spring-mvc配置文件中进行配置
- 作用:解决 SpringMVC 默认拦截所有请求导致静态资源(HTML、CSS、JS 等)无法访问的问题,将静态资源请求交还给 Web 容器默认的 Servlet 处理。
<!-- 支持 html css js-->
<mvc:default-servlet-handler/>
进行测试

静态资源访问的进一步优化
静态资源访问的进一步优化 用到了 视图解析器
在mvc配置文件中
prefix -> 前缀自动添加 /pages/
suffix -> 后缀自动添加 .html
所以我们直接访问页面 名称就可以
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/>
<property name="suffix" value=".html"/>
</bean>
- 作用:简化页面跳转路径配置,控制器方法返回视图名时,自动拼接前缀和后缀。
- 示例:返回
return "login"时,实际跳转路径为/pages/login.html。
进行测试

核心注解详解
1. 控制器相关注解
- @Controller:标识该类为 SpringMVC 控制器,用于处理请求,默认返回视图名(需配合视图解析器跳转页面)。
- @RestController:组合注解(
@Controller + @ResponseBody),类中所有方法默认将返回值作为 HTTP 响应体(无需视图解析器),适用于纯 API 开发。 - @RequestMapping:用于类或方法上,指定请求路径(如
/user、/user/test),支持 GET、POST 等多种请求方式。 - @GetMapping:
@RequestMapping(method = RequestMethod.GET)的简化形式,仅接收 GET 请求。
2. 参数绑定相关注解
(1)@ResponseBody
- 作用:将控制器方法返回值直接作为 HTTP 响应体,不经过视图解析器。
- 适用场景:返回字符串、JSON 数据(如 AJAX 响应),避免页面跳转。
(2)@RequestParam
- 作用:从 URL 地址栏(
?后参数)或表单中获取零散小参数,绑定到控制器方法参数。 - 使用场景:请求参数名与方法参数名不一致时(如 URL 参数为
account,方法参数为acc),需指定@RequestParam("account") String acc。 - 示例:URL 为
http://localhost:8080/user/test03?account=root&password=123,方法参数@RequestParam("account") String acc可获取acc = root。
(3)@RequestBody
- 作用:从 HTTP 请求体中获取完整的 JSON 数据,绑定到 Java 对象(如 VO 类)。
- 适用场景:请求参数较多时,通过 VO 类统一接收参数,需配合 fastjson 依赖实现 JSON 解析。
- 示例:请求体为
{"id":"1","username":"root","password":"123456"},可通过@RequestBody UserVO userVO直接获取 UserVO 对象。
3. 注解区别总结
- @RequestParam vs @RequestBody:前者从地址栏 / 表单拿零散小参数,后者从请求体拿完整 JSON 大对象。
- @Controller vs @RestController:前者默认返回视图,后者默认返回响应体(API 开发首选)
常见问题与注意事项
- 404 错误:可能是 Tomcat 未正确配置、请求路径错误、静态资源未配置
<mvc:default-servlet-handler/>等原因。 - JSON 解析失败:需导入 fastjson 依赖并配置消息转换器,请求体格式需严格遵循 JSON 规范。
- 参数绑定失败:检查请求参数名与方法参数名是否一致,多参数时需使用
@RequestParam或@RequestBody明确绑定规则。 - 依赖冲突:确保所有 Spring 相关依赖版本一致,避免不同版本组件不兼容。

1905

被折叠的 条评论
为什么被折叠?



