当前位置: 首页 > article >正文

Java面试(2025)—— Spring MVC

什么是Spring MVC

Spring MVC 是 Spring 框架的一个 基于 Java 的 Web 开发模块,它实现了 MVC(Model-View-Controller)架构模式,用于构建灵活、松耦合的 Web 应用程序。
它是 Spring 生态的核心组件之一,通过简化 HTTP 请求处理、数据绑定和视图渲染,帮助开发者高效构建企业级 Web 应用。

Spring MVC的优点

Spring MVC 是 Spring 生态中用于构建 Web 应用的核心模块,它的核心优势在于 模块化设计注解驱动开发,能够高效处理 HTTP 请求并支持灵活的视图技术。我个人认为它的主要优点可以从以下几个方面展开:

(1) 松耦合的模块化设计

首先,Spring MVC 基于 前端控制器模式DispatcherServlet),将请求分发、业务处理、视图渲染等职责分离。
这种设计让各组件(如 ControllerViewResolver)可以独立替换或扩展,比如从 JSP 切换到 Thymeleaf 只需修改配置,无需改动业务代码。

(2) 注解驱动的开发效率

其次,它通过 注解(如 @Controller@GetMapping)极大简化了开发。对比传统的 Servlet 或 Struts2,代码量减少 50% 以上,且意图更清晰。

(3) 强大的数据绑定与验证

Spring MVC 支持 自动参数绑定(如 @RequestParam@ModelAttribute)和 JSR-303 验证(如 @Valid)。开发者无需手动解析 HTTP 参数,还能通过 BindingResult 统一处理校验错误,提升代码健壮性。

(4) 灵活的视图技术整合

它支持多种视图技术(JSP、Thymeleaf、Freemarker),并能无缝切换。对于前后端分离项目,还可以直接返回 JSON/XML(通过 @ResponseBody),适应现代开发需求。

(5) 与 Spring 生态深度集成

作为 Spring 的一部分,它可以轻松整合其他组件,比如用 @Transactional 管理事务,或通过 Spring Security 实现权限控制。这种一致性降低了学习成本,也便于维护。

综上,Spring MVC 特别适合 需要快速开发要求高可维护性 的项目,比如企业级后台管理系统或 RESTful API。它的灵活性和与 Spring 生态的无缝整合,是许多团队选择它的主要原因。

Spring MVC的主要组件

Spring MVC 主要组件

Spring MVC 框架由多个核心组件组成,它们协同工作来处理 HTTP 请求并生成响应。以下是主要组件及其功能:

DispatcherServlet (前端控制器)

  • 核心控制器,负责接收所有请求
  • 将请求委托给其他组件处理
  • 继承自 HttpServlet

HandlerMapping (处理器映射器)

  • 确定哪个 Controller 应该处理当前请求
  • 默认实现:RequestMappingHandlerMapping
  • 将 URL 映射到对应的处理方法

HandlerAdapter (处理器适配器)

  • 实际调用处理器方法
  • 处理不同类型的处理器
  • 默认实现:RequestMappingHandlerAdapter

Controller (控制器)

  • 处理业务逻辑
  • 返回 ModelAndView 或直接响应
  • 通常使用 @Controller 注解标记

ViewResolver (视图解析器)

  • 解析逻辑视图名到实际视图
  • 常见实现:InternalResourceViewResolver
  • 支持多种视图技术(JSP, Thymeleaf等)

View (视图)

  • 负责渲染模型数据
  • 生成最终响应内容(HTML, JSON等)

HandlerExceptionResolver (异常处理器)

  • 处理控制器执行过程中抛出的异常
  • 可以自定义异常处理逻辑

MultipartResolver (文件上传解析器)

  • 处理 multipart 文件上传请求
  • 常见实现:CommonsMultipartResolver

什么是DispatcherServlet?

DispatcherServlet 是 Spring MVC 框架的核心组件,它充当了前端控制器的角色,负责协调整个请求处理流程。

主要职责

  1. 请求接收:作为 Servlet,它接收所有的 HTTP 请求
  2. 请求分发:将请求委托给适当的控制器进行处理
  3. 视图渲染:协调视图解析和渲染过程
  4. 异常处理:处理请求处理过程中出现的异常
  5. 结果返回:将最终响应返回给客户端

工作原理

  1. 接收客户端请求
  2. 查询 HandlerMapping 确定处理请求的 Controller
  3. 通过 HandlerAdapter 调用实际的 Controller 方法
  4. 处理 Controller 返回的 ModelAndView 或直接响应
  5. 通过 ViewResolver 解析视图名称
  6. 渲染视图并返回响应

什么是Spring MVC框架的控制器?

简明定义(先给结论)

Spring MVC控制器是处理客户端请求并返回响应的核心组件,它负责接收用户请求、协调业务逻辑处理,并决定如何响应客户端。

核心特性(展示深度)

可以补充以下关键点:

  • 注解驱动:主要通过@Controller@RestController注解标识
  • 请求映射:使用@RequestMapping及其变体(@GetMapping等)定义URL映射
  • 多返回值支持:可以返回视图名称、ModelAndView、响应体或ResponseEntity
  • 松散耦合:与视图技术解耦,支持JSP、Thymeleaf等多种视图
  • REST支持:通过@RestController简化RESTful API开发

工作流程(结合架构)

在Spring MVC架构中,控制器位于DispatcherServlet之后:

  1. DispatcherServlet接收到请求后
  2. 通过HandlerMapping找到匹配的控制器方法
  3. 方法执行后返回处理结果
  4. 结果经过视图解析器或消息转换器处理
  5. 最终生成响应返回客户端

Spring MVC的控制器是不是单例模式,如果是,有什么问题,怎么解决?

Spring MVC中的控制器默认是单例的(Singleton),这是由Spring容器的默认作用域决定的。在Spring中,所有Bean默认都是单例的,包括使用@Controller@RestController注解的类。

单例模式带来的潜在问题

  1. 线程安全问题
  • 多个HTTP请求会并发访问同一个控制器实例
  • 如果控制器有实例变量(成员变量),这些变量会被所有请求共享
  • 可能导致数据混乱或并发修改异常
  1. 状态保持问题
  • 单例控制器不适合保存请求特定的状态
  • 例如:在成员变量中存储请求相关的数据会导致不同请求间的数据污染。

解决方案

1. 避免使用实例变量(推荐)

最佳实践是控制器中不定义任何实例变量,所有请求特定的数据都应通过方法参数传递。

2. 使用方法局部变量

所有请求特定的数据都应在方法内部创建:

请描述Spring MVC的工作流程?描述一下 DispatcherServlet 的工作流程?

时序图


注意:

  1. HandlerMapping返回的是Hander或者是处理器链(处理器+拦截器);
  2. 拦截器执行的三个时机:

(1)适配器调用前执行 (preHandle)

  • 时机:在 HandlerAdapter 调用控制器方法之前
  • 作用:权限校验、日志记录、参数预处理等
  • 中断能力:若任一拦截器的 preHandle 返回 false,后续拦截器和控制器方法均不会执行
  • 顺序:按拦截器配置的正序执行

(2)适配器调用后执行 (postHandle)

  • 时机:在 HandlerAdapter 调用控制器方法之后,但在视图渲染之前
  • 作用:修改模型数据、记录执行结果等
  • 注意:此时控制器已执行完毕,但响应未写入客户端
  • 顺序:按拦截器配置的逆序执行;

(3)请求完成后执行 (afterCompletion)

  • 时机:在视图渲染完成后(整个请求处理完毕时)
  • 作用:资源清理、性能监控统计等
  • 特点:无论请求成功或异常都会执行
  • 顺序:按拦截器配置的逆序执行

过滤器和拦截器

特性

过滤器(Filter)

拦截器(Interceptor)

所属规范

Servlet 规范

Spring MVC 机制

执行位置

DispatcherServlet

DispatcherServlet

依赖

依赖 Servlet 容器

依赖 Spring 容器

可访问对象

ServletRequest/Response

可以获取 HandlerMethod 等Spring对象

使用场景

底层请求/响应处理

业务相关的横切关注点

Spring MVC常用的注解有哪些?

Spring MVC 提供了丰富的注解来简化 Web 开发,以下是常用注解分类整理

请求映射相关

注解

作用

示例

@RequestMapping

通用请求映射(可指定HTTP方法、头等)

@RequestMapping(value="/users", method=RequestMethod.GET)

@GetMapping

简化GET请求映射

@GetMapping("/users/{id}")

@PostMapping

简化POST请求映射

@PostMapping("/users")

@PutMapping

简化PUT请求映射

@PutMapping("/users/{id}")

@DeleteMapping

简化DELETE请求映射

@DeleteMapping("/users/{id}")

@PatchMapping

简化PATCH请求映射

@PatchMapping("/users/{id}")

参数处理

注解

作用

示例

@RequestParam

获取URL查询参数或表单数据

getUser(@RequestParam("name") String username)

@PathVariable

获取URI模板变量

getUser(@PathVariable Long id)

@RequestBody

接收JSON/XML请求体

createUser(@RequestBody User user)

@RequestHeader

获取请求头值

getHeader(@RequestHeader("User-Agent") String agent)

@CookieValue

获取Cookie值

readCookie(@CookieValue("JSESSIONID") String sessionId)

@ModelAttribute

绑定参数到模型对象

addUser(@ModelAttribute User user) 或 在方法上标注

响应处理

注解

作用

示例

@ResponseBody

将返回值直接写入HTTP响应体

@ResponseBody User getUser() 或 类上标注@RestController

@ResponseStatus

自定义HTTP响应状态码

@ResponseStatus(HttpStatus.CREATED)

@RestController

@Controller + @ResponseBody组合

@RestController public class UserController { ... }

异常处理

注解

作用

示例

@ExceptionHandler

处理控制器内的异常

@ExceptionHandler(UserNotFoundException.class)

@ControllerAdvice

全局异常处理(配合@ExceptionHandler

@ControllerAdvice public class GlobalExceptionHandler { ... }

数据验证

注解

作用

示例

@Valid

触发JSR-303验证

createUser(@Valid @RequestBody User user)

@Validated

Spring的验证注解(支持分组验证)

updateUser(@Validated(Group.Update.class) User user)

@NotNull

字段非空校验(需配合@Valid

@NotNull private String username;

视图与模型

注解

作用

示例

@Controller

定义控制器类

@Controller public class UserController { ... }

@SessionAttributes

模型属性存入Session

@SessionAttributes("user")

@CrossOrigin

解决跨域问题

@CrossOrigin(origins = "https://example.com")

其他实用注解

注解

作用

示例

@InitBinder

自定义数据绑定逻辑

@InitBinder public void initBinder(WebDataBinder binder) { ... }

@DateTimeFormat

日期格式转换

@DateTimeFormat(pattern="yyyy-MM-dd") Date birthDate;

完整代码示例

关键说明:

  1. 组合注解:如@RestController@Controller+@ResponseBody的组合
  2. 参数绑定@RequestParam默认必传,可通过required=false改为可选
  3. 验证联动@Valid需与JSR-303注解(如@NotNull)配合使用
  4. RESTful设计:推荐使用@GetMapping/@PostMapping等简化注解

掌握这些注解可以覆盖90%的Spring MVC开发场景!

@Controller注解的作用

@Controller 是 Spring MVC 中最核心的注解之一,用于标记一个类作为控制器(Controller),专门处理 HTTP 请求并返回响应。以下是它的详细作用解析:

  1. 标识控制器类
    告诉 Spring 容器:当前类是一个 MVC 控制器,需要被扫描并管理其生命周期。
  2. 接收 HTTP 请求
    @RequestMapping 等注解配合,定义处理特定 URL 请求的方法。
  3. 协调模型(Model)和视图(View)
    在传统 MVC 模式中,控制器负责处理业务逻辑,返回视图名称(如 JSP/Thymeleaf),由视图解析器渲染。

@RequestMapping注解的作用

@RequestMapping 是 Spring MVC 中最核心的注解之一,用于将 HTTP 请求映射到特定的控制器方法或类上。它提供了灵活的 URL 匹配规则,支持定义请求方法、参数、头部等条件。以下是详细解析:

  1. URL 路径映射
    将 HTTP 请求的 URL 路径与控制器方法绑定,支持:
  • 精确路径(如 /users
  • 路径变量(如 /users/{id}
  • 通配符(如 /resources/**
  1. HTTP 方法约束
    指定处理的请求类型(GET/POST/PUT/DELETE 等)。
  2. 请求参数/头部过滤
    通过附加条件(如参数必须存在、头部匹配)进一步筛选请求。

@ResponseBody注解的作用

@ResponseBody 是 Spring MVC 中用于将方法返回值直接写入 HTTP 响应体的核心注解,通常用于构建 RESTful API 或处理 AJAX 请求。以下是它的详细解析:

  1. 跳过视图渲染
    不再通过视图解析器(如 JSP/Thymeleaf)渲染,而是直接将返回值序列化为 JSON/XML 等格式写入响应体。
  2. 自动内容协商
    根据请求的
    Accept 头或 URL 后缀(如 .json),自动选择合适的 HttpMessageConverter 进行序列化。
  3. 支持多种返回类型
    可返回 Java 对象、集合、字符串等,Spring 会自动处理序列化。

@PathVariable和@RequestParam的区别

@PathVariable@RequestParam 是 Spring MVC 中用于处理 HTTP 请求参数的两种核心注解,它们的主要区别体现在 参数来源使用场景URL 风格 上。以下是详细对比:

核心区别总结

特性

@PathVariable

@RequestParam

参数来源

URL 路径 中提取

URL 查询字符串 表单数据 中提取

URL 示例

/users/123

/users?id=123

是否必传

默认必传(除非指定默认值)

可通过 required=false

设为可选

RESTful 风格

是(推荐用于资源标识)

否(传统查询方式)

数据类型转换

自动(Spring 类型转换机制)

自动(Spring 类型转换机制)

使用场景对比

1. @PathVariable(路径变量)

  • 适用场景:标识 RESTful 资源唯一性(如 ID、用户名等)
  • 示例代码
  • URL 风格

2. @RequestParam(请求参数)

  • 适用场景:过滤、排序、分页等非核心参数
  • 示例代码
  • URL 风格

相关文章:

Java面试(2025)—— Spring MVC

什么是Spring MVC Spring MVC 是 Spring 框架的一个 基于 Java 的 Web 开发模块,它实现了 MVC(Model-View-Controller)架构模式,用于构建灵活、松耦合的 Web 应用程序。 它是 Spring 生态的核心组件之一,通过简化 HTT…...

如何测试雷达与相机是否时间同步?

在多传感器融合系统中,相机与雷达的协同感知已成为环境理解的关键。相机通过捕捉纹理信息识别物体类别,而雷达利用激光或毫米波实现全天候精确测距。两者的数据融合既能避免单一传感器缺陷(如相机受光照影响、雷达缺乏语义信息)&a…...

Redis基本安装和部署

环境: linux docker 安装: sudo apt install -y redis-server运行: 后台模式:redis-server & , 前台模式:redis-server , 用配置文件运行redis: sudo redis-server /etc/redis/redis.conf , /etc/redis/redis.co…...

数据分析与产品、运营、市场之间如何有效对齐

数据分析的重要性在于它能够将海量的原始信息转化为可操作的洞察。以产品开发为例,通过用户行为数据的分析,产品经理可以清晰了解哪些功能被频繁使用,哪些设计导致用户流失,从而优化迭代方向。运营团队则依靠数据分析来监控供应链效率、预测需求波动,甚至通过实时数据调整…...

Pytorch分布式训练(DDP)(记录)

为什么要分布式训练? 随着深度学习模型参数量和数据量不断增大,单卡显存和计算能力有限,单机单卡训练难以满足大模型/大数据集训练需求,因此我们需要: 单机多卡并行:利用一台机器上多张 GPU 加速训练。 …...

爆肝整理!Stable Diffusion的完全使用手册(二)

继续介绍Stable Diffusion的文生图界面功能。 往期文章详见: 爆肝整理!Stable Diffusion的完全使用手册(一) 下面接着对SD的文生图界面的进行详细的介绍。本期介绍文生图界面的截图2,主要包含生成模块下的采用方法、调度类型、迭…...

Redis 键管理

Redis 键管理 以下从键重命名、随机返回键、键过期机制和键迁移四个维度展开详细说明,结合 Redis 核心命令与底层逻辑进行深入分析: 一、键重命名 1. ​RENAME​​ 与 ​RENAMENX​​ **RENAME key newkey​**: 功能:强制重命名…...

OpenCV day5

函数内容接上文:OpenCV day4-CSDN博客 目录 9.cv2.adaptiveThreshold(): 10.cv2.split(): 11.cv2.merge(): 12.cv2.add(): 13.cv2.subtract(): 14.cv2.multiply(): 15.cv2.divide(): 1…...

基于Spring Boot+微信小程序的智慧农蔬微团购平台-项目分享

基于Spring Boot微信小程序的智慧农蔬微团购平台-项目分享 项目介绍项目摘要目录系统功能图管理员E-R图用户E-R图项目预览登录页面商品管理统计分析用户地址添加 最后 项目介绍 使用者:管理员、用户 开发技术:MySQLSpringBoot微信小程序 项目摘要 随着…...

WPF的发展历程

文章目录 WPF的发展历程引言起源与背景(2001-2006)从Avalon到WPF设计目标与创新理念 WPF核心技术特点与架构基础架构与渲染模型关键技术特点MVVM架构模式 WPF在现代Windows开发中的地位与前景当前市场定位与其他微软UI技术的关系未来发展前景 社区贡献与…...

Franka机器人ROS 2来袭:解锁机器人多元应用新可能

前言: 在机器人技术蓬勃发展的当下,每一次创新都可能为行业带来新的变革。2025年3月12日,Franka Robotics发布的Franka ROS 2软件包首次版本0.1.0,将著名的franka_ros软件包引入当前的ROS 2 LTS Humble Hawksbill,这一…...

树莓派5+Vosk+python实现语音识别

简介 Vosk是语音识别开源框架,支持二十种语言 - 中文,英语,印度英语,德语,法语,西班牙语,葡萄牙语,俄语,土耳其语,越南语,意大利语,荷…...

系统分析师知识点:访问控制模型OBAC、RBAC、TBAC与ABAC的对比与应用

在信息安全领域,访问控制是确保数据和资源安全的关键技术。随着信息系统复杂度的提高,访问控制技术也在不断演进,从早期简单的访问控制列表(ACL)发展到如今多种精细化的控制模型。本文将深入剖析四种主流的访问控制模型:基于对象的…...

Golang errors 包快速上手

文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...

数据结构——顺序表(C语言实现)

1.顺序表的概述 1.1 顺序表的概念及结构 在了解顺序表之前,我们要先知道线性表的概念,线性表,顾名思义,就是一个线性的且具有n个相同类型的数据元素的有限序列,常见的线性表有顺序表、链表、栈、队列、字符串等等。线…...

Qt Multimedia 库总结

Qt Multimedia 库总结 Qt Multimedia 库是 Qt 框架中用于处理多媒体内容的模块,支持音频、视频、摄像头和录音功能。它为开发者提供了跨平台的 API,适用于桌面、移动和嵌入式设备。本文将从入门到精通,逐步解析 Qt Multimedia 的核心功能、使…...

STP原理与配置以及广播风暴实验STP实验

学习目标 环路引起的问题 掌握STP的工作原理 掌握STP的基本配置 STP的配置 环路引起的问题 一、广播风暴(Broadcast Storm) 问题原理: 交换机对广播帧(如 ARP 请求、DHCP 发现报文)的处理方式是洪泛&#xff0…...

网络不可达network unreachable问题解决过程

问题:访问一个环境中的路由器172.16.1.1,发现ssh无法访问,ping发现回网络不可达 C:\Windows\System32>ping 172.16.1.1 正在 Ping 172.16.1.1 具有 32 字节的数据: 来自 172.16.81.1 的回复: 无法访问目标网。 来自 172.16.81.1 的回复:…...

力扣经典拓扑排序

207. 课程表(Course Schedule) 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表…...

Session与Cookie的核心机制、用法及区别

Python中Session与Cookie的核心机制、用法及区别 在Web开发中,Session和Cookie是两种常用的用于跟踪用户状态的技术。它们在实现机制、用途和安全性方面都有显著区别。本文将详细介绍它们的核心机制、用法以及它们之间的主要区别。 一、Cookie的核心机制与用法 1…...

【第16届蓝桥杯C++C组】--- 2025

hello呀,小伙伴们,这是第16届蓝桥杯第二道填空题,和第一道填空题一样也是十分基础的题目,有C语言基础基本都可以解,下面我讲讲我当时自己的思路和想法,如果你们有更优化的代码和思路,也可以分享…...

前端基础之《Vue(7)—生命周期》

一、什么是生命周期 1、生命周期 组件从“生”到“死”的全过程。 每一个组件都有生命周期。 2、生命周期四大阶段 创建阶段:beforeCreate、created 挂载阶段:beforeMount、mounted 更新阶段:beforeUpdate、updated 销毁阶段:be…...

C语言高频面试题——指针数组和数组指针

指针数组和数组指针是 C/C 中容易混淆的两个概念,以下是详细对比: 1. 指针数组(Array of Pointers) 定义:一个数组,其元素是 指针类型。语法:type* arr[元素个数]; 例如:int* ptr_a…...

Linux服务器配置Anaconda环境、Pytorch库(图文并茂的教程)

引言:为了方便后续新进组的 师弟/师妹 使用课题组的服务器,特此编文(ps:我导从教至今四年,还未招师妹) ✅ NLP 研 2 选手的学习笔记 笔者简介:Wang Linyong,NPU,2023级&a…...

Android端使用无障碍服务实现远程、自动刷短视频

最近在做一个基于无障碍自动刷短视频的APP,需要支持用任意蓝牙遥控器远程控制, 把无障碍服务流程大致研究了一下,从下面3个部分做一下小结。 1、需要可调整自动上滑距离和速度以适配不同的屏幕和应用 智能适配99%机型,滑动参数可…...

搭建用友U9Cloud ERP及UAP IDE环境

应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...

多模态大语言模型arxiv论文略读(二十九)

Temporal Insight Enhancement: Mitigating Temporal Hallucination in Multimodal Large Language Models ➡️ 论文标题:Temporal Insight Enhancement: Mitigating Temporal Hallucination in Multimodal Large Language Models ➡️ 论文作者:Li Su…...

Java开发中的设计模式之观察者模式详细讲解

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会自动收到通知并更新。这种模式在Java开发中非常常见,尤其是在事件驱…...

基于SpringAI Alibaba实现RAG架构的深度解析与实践指南

一、RAG技术概述 1.1 什么是RAG技术 RAG(Retrieval-Augmented Generation)检索增强生成是一种将信息检索技术与生成式AI相结合的创新架构。它通过以下方式实现智能化内容生成: 知识检索阶段:从结构化/非结构化数据源中检索相关…...

卷积神经网络(CNN)详解

文章目录 引言1.卷积神经网络(CNN)的诞生背景2.卷积神经网络(CNN)介绍2.1 什么是卷积神经网络?2.2 卷积神经网络(CNN)的基本特征2.2.1 局部感知(Local Connectivity)2.2.…...