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

面试篇: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 或函数式
http://www.xdnf.cn/news/5643.html

相关文章:

  • C++多态讲解
  • 【Redis】分布式锁的实现
  • Excel分组计算求和的两种实现方案
  • 【Python】Python常用数据类型判断方法详解
  • K8S中构建双架构镜像-从零到成功
  • Go语言爬虫系列教程(一) 爬虫基础入门
  • 新能源汽车电池加热技术:传统膜加热 vs. 脉冲自加热
  • Porting Linux to a new processor architecture, part 1: The basics
  • 异步FIFO的学习
  • Linux 上安装RabbitMQ
  • android14优化ntp时间同步
  • 全栈工程师实战手册:LuatOS日志系统开发指南!
  • Matlab 垂向七自由度轨道车辆开关型半主动控制
  • Spring Boot集成RabbitMQ高级篇:可靠性与性能提升
  • OpenHarmony Linux内核本地管理
  • 网络爬虫学习之正则表达式
  • Edge浏览器打开PDF文件显示空白(每次需要等上一会)
  • FPGA前瞻篇-计数器设计与实现实例
  • Spark SQL 运行架构详解(专业解释+番茄炒蛋例子解读)
  • Mosaic数据增强技术
  • 大规模k8s集群怎么规划
  • Spring IoCDI
  • matlab simulink双边反激式变压器锂离子电池均衡系统,双目标均衡策略,仿真模型,提高均衡速度38%
  • 大语言模型训练的两个阶段
  • 神经网络是如何工作的
  • Linux 文件权限管理
  • 【Leetcode】系列之206反转链表
  • 工具篇-如何在Github Copilot中使用MCP服务?
  • 进程相关面试题20道
  • Python中操作Neo4j图数据库