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

面试篇:Spring MVC

基础概念

什么是Spring MVC?

Spring MVC 是 Spring Framework 提供的一个基于 Servlet 的 Web 框架,属于 MVC(Model-View-Controller)架构的一种实现。它通过 DispatcherServlet 作为前端控制器,对请求进行分发和调度,实现请求控制逻辑与业务逻辑、视图渲染的解耦。


Spring MVC 的核心组件有哪些?

Spring MVC 的核心组件包括:

  1. DispatcherServlet:前端控制器,接收所有请求,统一调度处理流程。

  2. HandlerMapping:根据 URL 找到对应的 Controller 方法。

  3. Controller:业务控制器,处理请求逻辑并返回模型数据或视图名。

  4. ModelAndView:封装模型数据和视图信息。

  5. ViewResolver:视图解析器,负责将逻辑视图名解析为实际视图(如 JSP 文件)。

  6. View:最终负责渲染页面给客户端。

  7. HandlerAdapter:用于执行不同类型的处理器方法。


Spring MVC 的请求流程是怎样的?

简要流程如下:

  1. 浏览器发送请求被 DispatcherServlet 接收。

  2. DispatcherServlet 调用 HandlerMapping 找到对应的处理器(Controller)。

  3. 调用 HandlerAdapter 执行处理器方法。

  4. 控制器返回 ModelAndView。

  5. DispatcherServlet 调用 ViewResolver 解析视图。

  6. 渲染视图并响应给客户端。


请求处理

@RequestMapping 和 @GetMapping 有什么区别?

  • @RequestMapping 是一个通用的映射注解,可以指定请求方法、路径、参数、头信息等。

  • @GetMapping@RequestMapping(method = RequestMethod.GET) 的语法糖,专用于处理 GET 请求。

Spring 4.3 后引入了 @GetMapping@PostMapping 等注解,更加语义化和简洁。


如何接收请求参数?

Spring MVC 提供多种方式:

  1. @RequestParam:接收 URL 参数或表单参数。

  2. @PathVariable:接收路径中的变量。

  3. @RequestBody:接收 JSON 请求体并反序列化为 Java 对象。

  4. @ModelAttribute:接收表单提交的参数并封装为 Java Bean。

  5. HttpServletRequest / HttpSession:传统方式。


如何返回 JSON 数据?

使用 @ResponseBody 注解或 @RestController(组合注解),并确保引入了 Jackson 等 JSON 处理器:

@RestController
public class DemoController {@GetMapping("/hello")public Map<String, Object> hello() {return Map.of("msg", "Hello World");}
}

异常处理

Spring MVC 如何进行全局异常处理?

方式一:使用 @ControllerAdvice + @ExceptionHandler

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handle(Exception ex) {return ResponseEntity.status(500).body("系统异常:" + ex.getMessage());}
}

方式二:实现 HandlerExceptionResolver 接口,自定义异常处理逻辑。


数据绑定与表单处理

@ModelAttribute 的作用是什么?

  • 用于将请求参数绑定到对象上。

  • 也可用于控制器方法参数预处理,比如填充公共数据。

@ModelAttribute
public void addAttributes(Model model) {model.addAttribute("globalAttr", "全局属性");
}

如何校验表单参数合法性?

可使用 javax.validation 注解与 @Valid@Validated 配合使用:

@PostMapping("/submit")
public String submit(@Valid @RequestBody User user, BindingResult result) {if (result.hasErrors()) {return "参数错误";}return "成功";
}

视图与响应

Spring MVC 支持哪些视图技术?

  • JSP(默认)

  • Thymeleaf

  • FreeMarker

  • Velocity

  • PDF、Excel(通过 View 实现类)

  • JSON(通过 Jackson)


如何自定义视图解析器?

通过配置 InternalResourceViewResolver 或实现 ViewResolver 接口来自定义视图路径规则:

@Bean
public InternalResourceViewResolver resolver() {InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");return resolver;
}

拦截器与过滤器

拦截器与过滤器有什么区别?

对比点拦截器(Interceptor)过滤器(Filter)
所属框架SpringServlet
执行时机Controller 之前/之后请求进入容器之前
使用场景权限、日志、接口签名编码、XSS、日志
实现方式实现 HandlerInterceptor实现 Filter 接口

如何注册 Spring MVC 拦截器?

通过配置类实现 WebMvcConfigurer 接口:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");}
}

安全与跨域

Spring MVC 如何实现跨域?

  1. 注解方式:在 Controller 上添加 @CrossOrigin

  2. 全局配置:通过实现 WebMvcConfigurer 配置 CORS 映射

  3. 过滤器方式:实现 CorsFilter


Spring MVC 与 Spring Boot 的关系

Spring Boot 中还需要配置 Spring MVC 吗?

不需要手动配置 DispatcherServlet 等基础设施。Spring Boot 会自动根据依赖注入合适的 MVC 配置,包括:

  • 自动注册视图解析器

  • 自动扫描 @RestController@Controller

  • 集成 Jackson 等 JSON 处理器

开发者只需专注于业务逻辑编写。


Spring MVC 和 Spring WebFlux 有什么区别?

特性Spring MVCSpring WebFlux
编程模型基于 Servlet、阻塞 IO响应式、非阻塞
最小依赖Servlet APIReactor Core
适用场景大多数同步 Web 应用高并发、低延迟服务
Controller风格@Controller@RestController 或函数式

相关文章:

面试篇:Spring MVC

基础概念 什么是Spring MVC&#xff1f; Spring MVC 是 Spring Framework 提供的一个基于 Servlet 的 Web 框架&#xff0c;属于 MVC&#xff08;Model-View-Controller&#xff09;架构的一种实现。它通过 DispatcherServlet 作为前端控制器&#xff0c;对请求进行分发和调度…...

ctfshow——web入门351~356

SSRF没有出网的部分 web入门351 $ch curl_init($url); 作用&#xff1a;初始化一个 cURL 会话&#xff0c;并设置目标 URL。解释&#xff1a; curl_init($url) 创建一个新的 cURL 资源&#xff0c;并将其与 $url 关联。这里的 $url 是用户提供的&#xff0c;因此目标地址完全…...

C++中六个特殊成员函数的关系

C中六个特殊成员函数的关系 C11之后的版本每个类有六个特殊的成员函数&#xff0c;之所以特殊是因为它们可以在各种情况下由编译器自动提供&#xff1b; 默认构造函数、复制构造函数、复制赋值运算符、析构函数、移动构造函数、移动赋值运算符 关系规则&#xff1a; 1、如果…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.1 风险数据清洗与特征工程

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 PostgreSQL金融风控分析案例&#xff1a;风险数据清洗与特征工程实战一、案例背景&#xff1a;金融风控数据处理需求二、风险数据清洗实战&#xff08;一&#xff09;缺失值…...

美女热舞混剪视频批量剪辑生产技术实践:智能处理与原创性提升方案解析

一、引言&#xff1a;短视频工业化生产的技术转型 在美女类短视频内容运营中&#xff0c;通过标准化技术流程实现「高质量、规模化」产出成为核心需求。本文结合实战经验&#xff0c;解析如何通过智能素材重组、AI 语音合成、动态元素叠加等技术手段&#xff0c;构建自动化生产…...

破局智算瓶颈:400G光模块如何重构AI时代的网络神经脉络

一、技术演进与市场需求双重驱动 在数字化转型浪潮下&#xff0c;全球互联网流量正以每年30%的复合增长率持续攀升。根据Dell’Oro Group最新报告&#xff0c;2023年400G光模块市场规模已突破15亿美元&#xff0c;预计2026年将占据数据中心光模块市场60%以上份额。这种爆发式增…...

python标准库--collections - 高性能数据结构在算法比赛的应用

目录 一、deque双端队列 1.头部删除元素popleft&#xff08;&#xff09; 2.BFS&#xff08;广度优先搜索&#xff09;优化 3.滑动窗口&#xff08;双指针&#xff09; 4.实现栈或队列 5. 双向遍历与操作 一、deque双端队列 特点&#xff1a;支持两端 O (1) 时间复杂度的…...

神经网络基础-从零开始搭建一个神经网络

一、什么是神经网络 人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通…...

【Go】优化文件下载处理:从多级复制到零拷贝流式处理

在开发音频处理服务过程中&#xff0c;我们面临一个常见需求&#xff1a;从网络下载音频文件并保存到本地。这个看似简单的操作&#xff0c;实际上有很多优化空间。本文将分享一个逐步优化的过程&#xff0c;展示如何从一个基础实现逐步改进到高效的流式下载方案。 初始实现&a…...

Java 显式锁与 Condition 的使用详解

Java 显式锁与 Condition 的使用详解 在多线程编程中&#xff0c;线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步&#xff0c;除了传统的 synchronized 关键字外&#xff0c;ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...

android ViewModel liveData无法监听之多线程下activityViewModels不安全

我们一般的&#xff0c;会遇到liveData无法监听到结果&#xff0c;可能存在主要2种可能&#xff1a; liveData没有正确注册&#xff1b;liveData连续多次设置值&#xff0c;中间的值&#xff0c;会被丢弃&#xff0c;但最后一次是能监听到的。 但是我们容易忽略一种case&…...

#Redis黑马点评#(五)Redisson原理详解

目录 一 基于Redis的分布式锁优化 二 Redisson 1 实现步骤 2 Redisson可重入锁机制 3 Redisson可重试机制 4 Redisson超时释放机制 5 RedissonMultiLock解决主从一致性 三 trylock与lock两者有何区别 四 Redis优化秒杀 一 基于Redis的分布式锁优化 二 Redisson Redis…...

23.(vue3.x+vite)引入组件并动态切换(component)

让多个组件使用同一个挂载点,并动态切换,这就是动态组件 效果截图 A组件代码: <template><div><div>{{message }}</</...

VBA会被Python代替吗

VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持&#xff0c;逐渐成为自动化和数据分析领域的主流工具。然而&#xff0c;VBA依旧在Exc…...

2025 年福建省职业院校技能大赛网络建设与运维赛项Linux赛题解析

​ 准备环境&#xff1a;系统安装及网络配置 [!TIP] 接下来将完全按照国赛评分标准进行&#xff0c;过程中需要掌握基础的Linux命令以及理解Linux系统&#xff0c;建议大家在做题前将Linux基础命令熟练运用 网络建设与运维赛项详细教程请联系主页一、X86架构计算机操作系统安装…...

SEMI E40-0200 STANDARD FOR PROCESSING MANAGEMENT(加工管理标准)-(三)完结

10 消息服务详情 10.1 本章定义实现加工管理概念所需的消息服务。这些消息已在第8.1节中初步介绍。 协议无关性&#xff1a;这些服务独立于所使用的消息协议&#xff0c;可映射至SECS-II&#xff08;SEMI E5&#xff09;或其他类似协议。 10.1.1 消息服务定义内容包括&#…...

MySQL数据库创建、删除、修改

一&#xff1a;建库建表 我们以学校体系进行建表。将数据库命名为school。 以下代码中的大写均可小写不影响。如CREATE DATABASE与create database相同 四个关键的实体分别是学院、老师、学生和课程&#xff0c;其中&#xff0c;学生跟学院是从属关系&#xff0c;这个关系从…...

招行数字金融挑战赛数据赛道赛题一

赛题描述&#xff1a;根据提供的用户行为数据&#xff0c;选手需要分析用户行为特征与广告内容的匹配关系&#xff0c;准确预测用户对测试集广告的点击情况&#xff0c;通过AUC计算得分。 得分0.6120&#xff0c;排名60。 尝试了很多模型都没有能够提升效果&#xff0c;好奇大…...

【氮化镓】GaN在不同电子能量损失的SHI辐射下的损伤

该文的主要发现和结论如下: GaN的再结晶特性 :GaN在离子撞击区域具有较高的再结晶倾向,这导致其形成永久损伤的阈值较高。在所有研究的电子能量损失 regime 下,GaN都表现出这种倾向,但在电子能量损失增加时,其效率会降低,尤其是在材料发生解离并形成N₂气泡时。 能量损失…...

容器化-Docker-私有仓库Harbor

一、Harbor 的含义与作用​ Harbor 是一个开源的企业级 Docker 镜像仓库,它为用户提供了安全、高效的 Docker 镜像管理方案。其核心功能是集中管理 Docker 中所有的镜像,涵盖了镜像的存储、分发、版本控制等全生命周期管理。通过使用 Harbor,企业和团队能够显著提升 Docker…...

【Leetcode 每日一题】1550. 存在连续三个奇数的数组

问题背景 给你一个整数数组 a r r arr arr&#xff0c;请你判断数组中是否存在连续三个元素都是奇数的情况&#xff1a;如果存在&#xff0c;请返回 t r u e true true&#xff1b;否则&#xff0c;返回 f a l s e false false。 数据约束 1 ≤ a r r . l e n g t h ≤ 10…...

C#中SetProperty方法使用

SetProperty 是 MVVM&#xff08;Model-View-ViewModel&#xff09; 模式中用于实现 属性变更通知&#xff08;INotifyPropertyChanged&#xff09; 的核心方法&#xff0c;主要用于在属性值变化时自动更新 UI 绑定。 1. SetProperty 的基本作用 更新字段值&#xff1a;修改属性…...

防火墙来回路径不一致导致的业务异常

案例拓扑&#xff1a; 拓扑描述&#xff1a; 服务器有2块网卡&#xff0c;内网网卡2.2.2.1/24 网关2.2.254 提供内网用户访问&#xff1b; 外网网卡1.1.1.1/24&#xff0c;外网网关1.1.1.254 80端口映射到公网 这个时候服务器有2条默认路由&#xff0c;分布是0.0.0.0 0.0.0.0 1…...

WTK6900C-48L:离线语音芯片重构玩具DNA,从“按键操控”到“声控陪伴”的交互跃迁

一&#xff1a;开发背景 随着消费升级和AI技术进步&#xff0c;传统玩具的机械式互动已难以满足市场需求。语音控制芯片的引入使玩具实现了从被动玩耍到智能交互的跨越式发展。通过集成高性价比的语音识别芯片&#xff0c;现代智能玩具不仅能精准响应儿童指令&#xff0c;还能实…...

[Java实战]Spring Boot 中Starter机制与自定义Starter实战(九)

[Java实战]Spring Boot 中Starter机制与自定义Starter实战&#xff08;九&#xff09; 引言 Spring Boot 的 Starter 是其“约定优于配置”理念的核心体现&#xff0c;通过简化依赖管理和自动配置&#xff0c;极大提升了开发效率。本文将深入剖析 Starter 的设计思想、实现原…...

电商双十一美妆数据分析

1. 数据读取与基础查看 库导入&#xff1a;使用 import numpy as np 和 import pandas as pd 导入常用数据分析库。数据读取&#xff1a; df pd.read_csv(双十一_淘宝美妆数据.csv) 读取数据文件。数据查看&#xff1a;通过 df.head() 查看数据前几行&#xff1b; df.info() 了…...

Python 数据分析与可视化:开启数据洞察之旅(5/10)

一、Python 数据分析与可视化简介 在当今数字化时代&#xff0c;数据就像一座蕴藏无限价值的宝藏&#xff0c;等待着我们去挖掘和探索。而 Python&#xff0c;作为数据科学领域的明星语言&#xff0c;凭借其丰富的库和强大的功能&#xff0c;成为了开启这座宝藏的关键钥匙&…...

gitkraken 使用教程

一、安装教程 安装6.5.3&#xff0c;之后是收费的&#xff0c;Windows版免安装 二、使用教程 0. 软件说明 gitkraken是一个git本地仓库管理软件&#xff0c;可以管理多个仓库&#xff0c;并且仓库可以属于多个网站多个账户。 1. 克隆仓库 选择要克隆到什么位置&#xff0…...

如何避免 JavaScript 中常见的闭包陷阱?

文章目录 1. 引言2. 什么是闭包&#xff1f;3. 常见的闭包陷阱及解决方案3.1 循环中的闭包陷阱3.2 内存泄漏3.3 意外的全局变量3.4 React 中的闭包陷阱 4. 总结 1. 引言 闭包&#xff08;Closure&#xff09;是 JavaScript 中一个强大而常用的特性&#xff0c;它允许函数访问其…...

【LeetCode 热题 100】二叉树 系列

&#x1f4c1; 104. 二叉树的最大深度 深度就是树的高度&#xff0c;即只要左右子树其中有一个不为空&#xff0c;就继续往下递归&#xff0c;知道节点为空&#xff0c;向上返回。 int maxDepth(TreeNode* root) {if(root nullptr)return 0;return max(maxDepth(root->lef…...