树码科技 | 技术博客

Spring MVC 面试题及参考答案

2026/04/05
30
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负责展示数据,三者分离,实现了业务逻辑、数据、页面的解耦。