面试篇:Spring MVC

news2025/5/14 3:06:50

基础概念

什么是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 {
    @Override
    public 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 或函数式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2375070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ctfshow——web入门351~356

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

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

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

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

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

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

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

#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…

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;这个关系从…

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

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

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

案例拓扑&#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;还能实…

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

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

gitkraken 使用教程

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

【LeetCode 热题 100】二叉树 系列

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

用drawdb.app可视化创建mysql关系表

平时自己建表,没有可视化图形参考 为了便于理解,用drwadb画mysql关系表 drawDB | Online database diagram editor and SQL generator

火绒互联网安全软件:自主引擎,精准防御

在数字时代&#xff0c;网络安全是每一个用户都必须重视的问题。无论是个人用户还是企业用户&#xff0c;都需要一款高效、可靠的反病毒软件来保护设备免受恶意软件的侵害。今天&#xff0c;我们要介绍的 火绒互联网安全软件&#xff0c;就是这样一款由资深工程师主导研发并拥有…

【前端基础】8、CSS的选择器

一、什么是选择器&#xff1f; 根据一定的规则选出符合条件的HTML元素&#xff0c;从而为他们添加各种特定的样式。 二、选择器分类 通用选择器元素选择器类选择器id选择器属性选择器后代选择器兄弟选择器选择器组伪类 三、通用选择器&#xff08;*&#xff09; 作用&…

Gitee Team:关键领域行业DevSecOps落地的项目管理引擎

在全球数字化转型浪潮下&#xff0c;关键领域行业的软件研发正面临前所未有的挑战与机遇。国产化进程的加速推进与国防装备的智能化转型&#xff0c;对软件研发效能和质量提出了更高要求。在这样的背景下&#xff0c;Gitee Team作为国内领先的研发协作平台&#xff0c;正在为关…

网址为 http://xxx:xxxx/的网页可能暂时无法连接,或者它已永久性地移动到了新网址

这是由于浏览器默认的非安全端口所导致的&#xff0c;所谓非安全端口&#xff0c;就是浏览器出于安全问题&#xff0c;会禁止一些网络浏览向外的端口。 避免使用6000,6666这样的端口 6000-7000有很多都不行&#xff0c;所以尽量避免使用这个区间 还有在云服务器中&#xff0c…