Spring-MVC 学习笔记

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 开发首选)

常见问题与注意事项

  1. 404 错误:可能是 Tomcat 未正确配置、请求路径错误、静态资源未配置 <mvc:default-servlet-handler/> 等原因。
  2. JSON 解析失败:需导入 fastjson 依赖并配置消息转换器,请求体格式需严格遵循 JSON 规范。
  3. 参数绑定失败:检查请求参数名与方法参数名是否一致,多参数时需使用 @RequestParam@RequestBody 明确绑定规则。
  4. 依赖冲突:确保所有 Spring 相关依赖版本一致,避免不同版本组件不兼容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值