源本科技 | 码上会

Spring MVC 面试题及参考答案

2026/04/05
2
0

Spring MVC中的DispatcherServlet是什么,它如何工作?

DispatcherServlet 是 Spring MVC 的核心前端控制器,也是整个框架的总调度中心,所有客户端的 Web 请求都会先经过它。它的工作流程是标准化的:首先拦截所有请求,通过 HandlerMapping 组件找到与请求路径匹配的 Controller 和处理方法;接着调用 HandlerAdapter 执行对应的业务方法,获取方法返回的模型数据和视图信息;然后将结果交给视图解析器解析出具体视图;最后渲染视图并将响应返回给客户端。它全权负责请求分发、流程调度,开发者无需关注底层流程,只需要编写 Controller 的业务逻辑即可,是 Spring MVC 的核心枢纽。

Spring MVC中的@Controller注解是如何工作的?

@Controller 是 Spring 的组件注解,专门用来标记Web 请求处理器类。容器启动时,Spring 会扫描标注了 @Controller 的类,将其实例化为 Bean 并纳入 IoC 容器管理。同时,这个类会被 HandlerMapping 识别为请求处理组件,类中搭配 @RequestMapping、@GetMapping 等路径注解的方法,会被注册成请求映射规则。当 DispatcherServlet 接收到请求后,会根据路径匹配到对应的 Controller 方法并执行。该注解的核心作用是将普通 Java 类转化为能处理 Web 请求的控制器,实现了请求与业务逻辑的解耦。

Spring MVC如何处理表单提交?

Spring MVC 处理表单提交非常简便,核心是数据自动绑定。前端表单的 input 标签 name 属性,需要和后端 Java 实体类的属性名保持一致。客户端提交表单请求后,DispatcherServlet 会将表单参数传递给 Controller 方法,Spring 会自动把表单数据封装到实体类对象中,也可以直接用基本类型接收单个参数。Controller 接收数据后进行业务处理,处理完成后可以返回视图或重定向。同时还能搭配校验注解做表单验证,通过 BindingResult 接收校验结果,不满足规则就返回错误提示,整个流程无需手动解析表单参数。

Spring MVC中的ModelAndView是什么?

ModelAndView 是 Spring MVC 中封装模型数据和视图信息的统一对象,是 Controller 处理完请求后返回的核心载体。它包含两部分:Model 是模型数据,用来存放需要传递给前端页面的业务数据;View 是视图名称,比如 jsp、html 页面的名字,用来指定展示数据的页面。Controller 方法可以创建 ModelAndView 对象,往里面添加数据、设置视图名,然后返回给 DispatcherServlet。相比单独返回视图名,它能一次性封装数据和页面,适合需要同时传递数据和指定页面的场景,是早期 Spring MVC 最常用的返回值类型。

Spring MVC中拦截器(Interceptor)的作用是什么?

Spring MVC 的拦截器是针对 Controller 请求的增强组件,作用和过滤器类似,但更贴合 Spring 生态。它主要在请求进入 Controller 前、处理完成后、视图渲染前三个节点执行自定义逻辑,核心用途包括登录校验、权限控制、日志记录、请求参数预处理等。拦截器由 Spring 容器管理,可以直接注入 Bean 使用,能精准拦截指定路径的请求,还能获取 Controller 的方法信息。它不拦截静态资源,只针对 Controller 请求,相比原生 Filter,更适合在 Spring MVC 项目中做业务层的请求拦截和增强。

Spring MVC中的视图解析器(View Resolver)是什么?

视图解析器是 Spring MVC 中负责解析视图名称的核心组件。Controller 方法返回的通常是简洁的视图名(比如 login、index),而非完整的页面路径,视图解析器的作用就是把这个逻辑视图名,拼接成完整的物理视图路径。它会配置前缀和后缀,比如前缀是 /WEB-INF/views/,后缀是.jsp,那么视图名 login 就会被解析为 /WEB-INF/views/login.jsp。DispatcherServlet 拿到解析后的完整路径,就可以渲染页面并返回给客户端,它简化了视图的配置,让 Controller 无需关注页面的具体存储位置。

Spring MVC中的路径变量(@PathVariable)和用途

路径变量是通过 **@PathVariable 注解 ** 获取的 URL 路径中的动态参数,是 RESTful 风格接口的核心。它将参数直接拼接在 URL 路径中,比如 / user /1,其中 1 就是用户 id 的路径变量。在 Controller 方法中,用 @PathVariable 绑定路径参数和方法形参,就能直接获取数值。它的主要用途是设计简洁的 REST 接口,替代传统的? 拼接参数的方式,让 URL 更直观、语义化,适合获取、修改、删除指定资源的接口场景,是 Spring MVC 实现 RESTful API 的必备注解。

Spring MVC中的@RequestParam注解是用来做什么的?

@RequestParam 是用来获取 URL 请求参数或表单参数的注解,主要处理? 后面拼接的参数,比如 /user?name= 张三 &age=20。它可以绑定请求参数和 Controller 方法的形参,支持设置参数是否必填、默认值、参数别名等。如果前端参数名和后端形参名一致,可以省略该注解;如果不一致,就用它指定参数名。它主要用于接收简单类型的参数(字符串、数字等),是 Spring MVC 中最常用的参数接收注解,适合表单提交、普通 GET 请求的参数获取场景。

Spring MVC中如何实现异常处理?

Spring MVC 提供了全局统一异常处理方案,核心是 @RestControllerAdvice/@ControllerAdvice + @ExceptionHandler 注解。我们创建一个全局异常处理类,标注 @RestControllerAdvice,然后针对不同的异常类型编写方法,用 @ExceptionHandler 指定要捕获的异常。当 Controller 抛出异常时,会被该类的对应方法捕获,统一封装错误信息返回给前端。此外还支持局部异常处理(Controller 内定义)、自定义异常解析器,这种方式将分散的异常逻辑集中管理,返回格式统一,方便排查问题,是企业项目的标准用法。

Spring MVC中的重定向(Redirect)和转发(Forward)有什么区别?

重定向和转发是 Spring MVC 中页面跳转的两种方式,核心区别很大。转发是服务器内部跳转,地址栏 URL 不变,一次请求,能共享 Request 域的数据,效率更高,适合页面内部跳转。重定向是客户端重新发起请求,地址栏 URL 会改变,两次请求,不能共享 Request 数据,会重新经过 DispatcherServlet。转发用 forward: 前缀,重定向用 redirect: 前缀。重定向适合表单提交后避免重复提交、跳转外部链接;转发适合内部页面快速跳转,日常开发根据业务场景选择即可。

Spring MVC中的静态资源处理

Spring MVC 默认会拦截所有请求,导致无法访问 JS、CSS、图片等静态资源,因此需要专门配置静态资源映射。核心是通过 mvc:resources/ 标签(XML)或实现 WebMvcConfigurer 接口(注解),指定静态资源的存放路径和访问规则。比如配置访问路径 /res/**,映射到项目的 /resources/ 目录,当请求 /res/xxx.js 时,框架会自动去对应目录查找资源。配置后,DispatcherServlet 会放行静态资源请求,不再交给 Controller 处理,保证前端页面能正常加载样式、脚本和图片,是 Web 项目的必备配置。

Spring MVC和Spring Boot的区别

Spring MVC 是Spring 的 Web 层子框架,专注处理 Web 请求、页面跳转,需要手动配置 DispatcherServlet、视图解析器、静态资源等大量内容,配置繁琐。Spring Boot 是快速开发框架,并非替代 Spring MVC,而是对 Spring 生态的封装,核心是约定大于配置。Spring Boot 自动配置好 Spring MVC 所需的所有组件,内置 Tomcat 服务器,无需手动 XML 配置,引入 starter-web 依赖就能直接开发 Web 接口。简单说,Spring MVC 是 Web 开发的核心,Spring Boot 是简化 Spring MVC 开发、部署的工具。

Spring MVC中的数据绑定是如何工作的?

数据绑定是 Spring MVC自动将请求参数封装为 Java 对象的核心机制。客户端提交的表单参数、URL 参数都是字符串类型,Spring 会通过数据绑定器,将这些字符串自动转换为对应 Java 实体类的属性类型(数字、日期等),并封装成对象。绑定的前提是前端参数名和实体类属性名一致,框架通过反射找到对应的 setter 方法赋值。同时支持自定义类型转换器,处理特殊格式的参数。数据绑定省去了手动解析参数、封装对象的繁琐操作,大幅简化了 Controller 的参数接收工作。

Spring MVC中的Content Negotiation是什么

Content Negotiation 叫内容协商,是 Spring MVC 根据客户端需求,返回不同格式数据的机制。客户端可以通过请求头、URL 后缀、参数等方式,告诉服务器需要的数据格式(JSON、XML、HTML 等)。Spring MVC 会根据客户端的要求,选择对应的消息转换器,将模型数据转换成指定格式返回。比如客户端请求.json 后缀,就返回 JSON 数据;请求.xml 就返回 XML 数据。它让同一个接口能适配不同客户端的需求,无需编写多个接口,提升了接口的通用性和扩展性。

Spring MVC中的@RequestBody和@ResponseBody注解作用

@RequestBody 和 @ResponseBody 是处理 JSON 数据的核心注解。@RequestBody 用在 Controller 方法的形参上,将前端传来的 JSON 字符串自动解析为 Java 对象,解决了前端传递复杂 JSON 数据的接收问题。@ResponseBody 用在方法或类上,将方法返回的 Java 对象自动转换为 JSON 字符串,直接响应给前端,不再跳转页面。两个注解搭配使用,专门处理前后端分离的 AJAX 请求,是开发 RESTful API 的必备注解,让前后端数据交互更便捷。

Spring MVC的Model、ModelMap和ModelAndView的区别

三者都是用来传递数据到前端的载体,核心区别在使用方式。Model 是一个接口,只用来存放模型数据,通过 addAttribute 方法添加数据,返回值为视图名,使用最简洁。ModelMap 是 Map 的实现类,功能和 Model 一致,用法几乎相同,底层基于键值对存储数据,兼容 Map 的操作方法。ModelAndView 是数据 + 视图的封装对象,既可以添加数据,又能指定视图名称,一个对象完成所有操作。日常开发优先用 Model,简洁易用;需要同时指定视图和数据时用 ModelAndView,ModelMap 极少使用。

Spring MVC中视图解析的过程

视图解析是 DispatcherServlet 将 Controller 返回的逻辑视图名,转为物理视图的完整流程。Controller 处理完请求后,返回逻辑视图名(如 index);DispatcherServlet 将视图名交给 ViewResolver 视图解析器;解析器根据配置的前缀、后缀,拼接出完整的物理视图路径(如 /WEB-INF/views/index.jsp);接着解析器创建 View 视图对象;最后 View 对象渲染页面,将 Model 中的数据填充到页面中,生成 HTML 响应返回给客户端。整个过程自动完成,开发者只需配置前缀后缀,无需关注底层解析细节。

Spring MVC中的前端控制器(Front Controller)模式

前端控制器模式是 Spring MVC 的核心设计模式,属于通用的 Web 设计模式。该模式的核心是用一个统一的中央控制器(DispatcherServlet)接收所有客户端请求,统一处理请求分发、流程调度,而非每个请求对应一个独立的处理器。所有请求先经过中央控制器,再由它分发给具体的业务处理器(Controller)。这种模式统一了请求入口,简化了请求处理流程,实现了请求调度和业务逻辑的解耦,方便统一处理拦截、异常、日志等通用逻辑,是 Spring MVC 的架构基础。

Spring MVC中的@SessionAttributes和@SessionAttribute注解用途

两个注解都是用来操作 Session 域数据,用法不同。@SessionAttributes用在 Controller 类上,指定将 Model 中的哪些数据自动存入 Session 域,实现跨请求共享数据,适合在同一个控制器的多个方法间共享数据,比如表单分步提交。@SessionAttribute用在方法形参上,从 Session 域中获取已存在的数据,直接绑定到方法参数上,方便读取 Session 中的用户信息、登录状态等。两者搭配使用,简化了 Session 数据的存取操作,无需手动调用 request.getSession(),让代码更简洁。

Spring MVC中的WebApplicationContext是什么

WebApplicationContext 是 Spring MVC专用于 Web 环境的 IoC 容器,是 ApplicationContext 的子接口,具备普通容器的所有功能,还新增了 Web 相关特性。它和 Web 容器(Tomcat)绑定,生命周期随 Web 应用启动和销毁,能获取 ServletContext、请求、会话等 Web 对象。Spring MVC 中,会创建父子容器:父容器管理 Service、Dao 等业务 Bean,子容器(WebApplicationContext)管理 Controller、视图解析器、拦截器等 Web 组件。它是 Spring MVC 在 Web 环境中运行的核心容器,支撑了整个 Web 层的 Bean 管理。

Spring MVC中如何使用@ModelAttribute注解

@ModelAttribute 是 Spring MVC 的实用注解,有三种核心用法。一是用在方法上,该方法会在当前 Controller 的所有请求方法执行前运行,用来预加载数据到 Model 中,全局共享。二是用在方法形参上,自动将请求参数绑定到实体对象,并将对象存入 Model,前端可直接获取。三是配合 @SessionAttributes 使用,从 Session 中获取数据绑定到参数。它主要用于数据预加载、参数绑定、模型数据共享,是简化 Controller 数据处理的重要注解,适合需要全局共享数据的场景。

Spring MVC中的@RestController和@Controller的区别

@RestController 是 @Controller 和 @ResponseBody 的组合注解,是专门为前后端分离开发设计的。标注 @Controller 的类是传统控制器,方法返回值默认是视图名,会跳转页面;如果要返回 JSON 数据,需要额外加 @ResponseBody。标注 @RestController 的类,所有方法默认都会将返回对象转为 JSON 格式,直接响应给前端,不会跳转页面。@Controller 适合传统的页面开发项目,@RestController 适合 RESTful API、前后端分离的微服务项目,是现代 Web 开发的主流选择。

Spring MVC中的HandlerMapping是什么

HandlerMapping 是 Spring MVC 的核心组件,负责请求路径与 Controller 方法的映射匹配。容器启动时,它会扫描所有 Controller 的路径注解(@RequestMapping 等),建立路径和处理方法的映射关系表。当 DispatcherServlet 接收到客户端请求时,会交给 HandlerMapping,根据请求的 URL 查找对应的 Controller 和处理方法,找到后封装成 HandlerExecutionChain 对象返回。它是请求分发的关键,没有它,DispatcherServlet 就无法找到对应的业务处理器,是连接请求和 Controller 的桥梁。

Spring MVC中如何实现文件上传

Spring MVC 文件上传基于 Apache Commons FileUpload 或 Servlet3.0 原生上传,配置简单。首先引入文件上传依赖,然后在配置类中注册 MultipartResolver 文件上传解析器。前端表单设置 enctype="multipart/form-data",用 input type="file" 选择文件。后端 Controller 方法用 MultipartFile 类型接收上传的文件,通过 getOriginalFilename()获取文件名,transferTo() 方法将文件保存到服务器指定目录。支持单文件和多文件上传,框架自动封装文件流,无需手动处理 IO 操作,大幅简化了文件上传的开发流程。

Spring MVC中的国际化(i18n)支持是如何工作的

Spring MVC 的国际化支持多语言切换,核心是 LocaleResolver 和 MessageSource 组件。首先创建不同语言的配置文件(如中文、英文),存放对应语言的文案。MessageSource 加载这些配置文件,LocaleResolver 解析客户端的语言环境(从请求头、Session、Cookie 获取)。Controller 中通过 MessageSource 获取对应语言的文案,传递到前端页面。前端页面通过标签展示多语言文案,用户切换语言时,LocaleResolver 更新语言环境,自动加载对应配置文件,无需修改业务代码,快速适配多语言场景。

Spring MVC的异步请求处理是如何实现的

Spring MVC 异步请求用来解决高并发下的线程阻塞问题,提升服务器吞吐量。传统请求是同步的,一个请求占用一个线程直到处理完成。异步处理时,Controller 方法返回 Callable 或 DeferredResult 对象,Spring 会将业务逻辑交给新的线程执行,主线程立即释放,接收其他请求。业务线程处理完成后,会通知 Spring 容器返回响应。异步请求适合耗时操作(如调用第三方接口、批量处理数据),能有效利用服务器资源,提高高并发场景下的系统性能。

Spring MVC中的@PathVariable和@RequestParam的区别

两者都是获取请求参数的注解,核心区别在参数位置和用途。@PathVariable 获取URL 路径中的动态参数,格式为 /user/{id},是 RESTful 风格的参数,参数是 URL 的一部分,用于标识资源。@RequestParam 获取URL? 后拼接的参数,格式为 /user?id=1,用于过滤、查询资源。@PathVariable 适合获取资源唯一标识,@RequestParam 适合传递查询条件。两者不能混用,RESTful 接口优先用 @PathVariable,普通查询请求用 @RequestParam,是两种不同的参数传递规范。

Spring MVC中的数据验证(含表单验证)实现

Spring MVC 数据验证基于 JSR-380 校验规范(Hibernate Validator 实现),用来校验前端传递的参数合法性。在实体类的属性上添加校验注解(@NotBlank 非空、@Email 邮箱、@Length 长度等)。Controller 方法中,在实体类参数前加 @Valid 注解开启校验,并用 BindingResult 接收校验错误信息。如果校验不通过,BindingResult 会存储错误提示,后端可以将错误信息返回给前端。支持全局校验、分组校验,统一管理参数校验逻辑,避免在业务代码中编写大量的参数判断语句。

Spring MVC和Spring WebFlux的区别

Spring MVC 是同步阻塞式Web 框架,基于 Servlet API,一个请求对应一个线程,开发简单、生态成熟,适合传统 Web 项目、中小型应用。Spring WebFlux 是异步非阻塞式响应式框架,基于 Reactor,少量线程就能处理高并发请求,靠事件驱动实现高吞吐,适合高并发、微服务、网关等场景。MVC 兼容所有传统组件,学习成本低;WebFlux 编程模型不同,生态组件较少。常规业务开发用 Spring MVC,追求高并发、高性能的场景用 Spring WebFlux。

Spring MVC中的Flash属性(Flash Attributes)是什么

Flash 属性是 Spring MVC 中跨重定向请求传递数据的解决方案,用 RedirectAttributes 对象实现。重定向是两次请求,Request 域的数据会丢失,无法传递提示信息(如“提交成功”)。Flash 属性会将数据临时存放在 Session 中,重定向后的请求获取到数据后,立即清除,保证数据只使用一次。它专门解决重定向时的数据传递问题,适合表单提交后重定向到列表页,并展示成功 / 失败提示信息的场景,无需手动操作 Session,使用简洁安全。

Spring MVC中的"约定优于配置"原则

约定优于配置是 Spring MVC 的简化开发原则,核心是框架预设通用的配置规则,开发者无需手动配置,遵循约定即可开发。比如约定 Controller 放在 controller 包、视图放在 views 目录、表单参数名对应实体类属性名、请求路径匹配注解值等。框架按照这些默认约定自动处理逻辑,减少了 XML 或注解的配置量。如果需要特殊需求,再自定义配置。该原则大幅降低了开发门槛,让开发者专注业务逻辑,而非繁琐的配置,是 Spring MVC 易用性的核心体现。

Spring MVC中模型(Model)、视图(View)、控制器(Controller)的交互流程

三者是 Spring MVC 的核心组件,交互流程清晰。客户端发送请求,Controller(控制器) 接收请求,调用 Service 层处理业务逻辑,将处理结果存入Model(模型) 中,同时指定要展示的View(视图)。Controller 将 Model 和 View 返回给 DispatcherServlet,Servlet 通过视图解析器找到 View 页面。最后View(视图) 从 Model 中取出数据,渲染成 HTML 页面返回给客户端。Controller 负责处理请求和业务调度,Model 负责存储数据,View 负责展示数据,三者分离,实现了业务逻辑、数据、页面的解耦。