SpringMVC面经

📅 发布时间:2026/7/5 14:09:58 👁️ 浏览次数:
SpringMVC面经
Spring MVC 作为 Spring 框架的 Web 核心模块是 Java 后端面试的重中之重。本文聚焦 Spring MVC 核心考点从基础架构、核心组件、请求流程、注解使用到高级特性整理了高频面试题及详细解析帮你彻底吃透 Spring MVC。一、Spring MVC 基础概念1. 什么是 Spring MVC核心优势是什么解析Spring MVC 是基于 Spring 框架的 MVCModel-View-Controller设计模式的 Web 框架用于开发灵活、松耦合的 Java Web 应用核心是DispatcherServlet前端控制器统一处理请求实现请求与响应的解耦。核心优势轻量级基于 Spring 生态无需额外依赖配置灵活注解 / XML松耦合MVC 分层设计控制器Controller、模型Model、视图View职责分离易扩展支持自定义拦截器、视图解析器、参数解析器等适配性强兼容 RESTful 风格、多种视图技术JSP、Thymeleaf、JSON与 Spring 无缝整合可直接使用 Spring 的 IoC、AOP、事务管理等功能。2. Spring MVC 的核心设计思想MVC是什么解析MVC 是分层设计模式Spring MVC 中各层职责明确Model模型封装业务数据和业务逻辑对应 JavaBean、POJO、Service/DAO 层负责数据处理View视图展示数据对应 JSP、Thymeleaf、HTML 等仅负责渲染页面不处理业务逻辑Controller控制器接收客户端请求调用 Model 处理数据将结果传递给 View是请求的 “中转站”核心解耦点Controller 不直接与 View 耦合通过 Model 传递数据便于单独维护各层。二、Spring MVC 核心组件3. Spring MVC 的核心组件有哪些各自的作用是什么解析Spring MVC 的核心组件构成了请求处理的完整链路各组件职责如下表格组件核心作用DispatcherServlet前端控制器核心接收所有 HTTP 请求分发到对应组件统一管理请求生命周期HandlerMapping处理器映射器根据请求 URL / 参数匹配对应的 HandlerController 方法HandlerAdapter处理器适配器适配并执行 Handler处理不同类型的 Handler如注解式、XML 配置式HandlerController处理器实际处理请求的业务逻辑如Controller标注的类 / 方法ModelAndView封装处理结果Model 数据 View 视图名是 Controller 与 View 的交互载体ViewResolver视图解析器根据视图名解析出具体 View如将index解析为/WEB-INF/views/index.jspHandlerExceptionResolver异常解析器处理请求过程中抛出的异常统一异常处理LocaleResolver本地化解析器支持多语言 / 国际化处理4. DispatcherServlet 的作用是什么它的初始化过程是怎样的解析核心作用DispatcherServlet 是 Spring MVC 的 “大脑”所有请求都先经过它核心职责接收请求并解析通过 HandlerMapping 找到对应的 Handler通过 HandlerAdapter 执行 Handler获取 ModelAndView通过 ViewResolver 解析视图渲染响应处理异常、国际化等附加逻辑。初始化过程基于 Servlet 规范Web 容器启动时加载 DispatcherServlet 并调用init()方法创建 WebApplicationContextSpring MVC 的 IoC 容器加载配置注解 / XML初始化核心组件HandlerMapping、HandlerAdapter、ViewResolver 等完成初始化等待接收请求。三、Spring MVC 请求处理流程5. Spring MVC 的完整请求处理流程执行步骤是什么解析Spring MVC 处理 HTTP 请求的核心流程经典面试题建议记熟客户端发送 HTTP 请求至 DispatcherServletDispatcherServlet 调用 HandlerMapping根据请求信息URL、请求方式匹配 HandlerHandlerMapping 返回 HandlerExecutionChain包含 Handler 和拦截器给 DispatcherServletDispatcherServlet 调用 HandlerAdapter适配并执行 HandlerController 方法Handler 执行业务逻辑返回 ModelAndViewModel 为数据View 为视图名DispatcherServlet 将 ModelAndView 传递给 ViewResolver解析出具体 ViewViewResolver 返回 View 对象给 DispatcherServletDispatcherServlet 调用 View 的render()方法渲染 Model 数据到视图DispatcherServlet 将渲染后的响应返回给客户端。6. 拦截器Interceptor的执行时机和流程是什么解析拦截器用于在请求处理前后添加通用逻辑如登录校验、日志记录核心执行流程预处理preHandle()——Handler 执行前调用返回true则继续执行返回false则中断请求后处理postHandle()——Handler 执行后、View 渲染前调用可修改 ModelAndView完成处理afterCompletion()——View 渲染完成后调用通常用于资源清理如关闭流。注意多个拦截器时preHandle()按配置顺序执行postHandle()和afterCompletion()按逆序执行拦截器与过滤器Filter的区别拦截器基于 Spring 框架仅拦截 DispatcherServlet 处理的请求过滤器基于 Servlet 规范拦截所有请求。四、核心注解与参数处理7. Spring MVC 的核心注解有哪些各自的作用是什么解析Spring MVC 通过注解简化配置核心注解如下注解作用Controller标注类为 Spring MVC 的控制器接收并处理请求RestController组合注解Controller ResponseBody返回 JSON/XML 而非视图RequestMapping映射请求 URL / 方式到 Controller 方法可标注在类 / 方法上GetMapping/PostMapping/PutMapping/DeleteMappingRequestMapping 的简化版分别映射 GET/POST/PUT/DELETE 请求RequestParam绑定请求参数到方法参数如RequestParam(id) Integer idPathVariable绑定 URL 路径参数到方法参数如GetMapping(/user/{id})中的idRequestBody接收请求体中的 JSON/XML 数据绑定到 JavaBean 对象ResponseBody将方法返回值转为 JSON/XML直接写入响应体不跳转视图RequestHeader绑定请求头信息到方法参数CookieValue绑定 Cookie 值到方法参数ModelAttribute绑定请求参数到 Model或在方法执行前初始化 Model 数据8. RequestMapping 的常用属性有哪些如何支持 RESTful 风格解析RequestMapping 核心属性value/path指定请求 URL如value /usermethod指定请求方式如method RequestMethod.GETparams限制请求必须携带指定参数如params id!1headers限制请求必须包含指定请求头如headers Content-Typeapplication/jsonconsumes指定接收的请求体类型如consumes application/jsonproduces指定返回的响应体类型如produces application/json;charsetUTF-8。支持 RESTful 风格RESTful 通过 URL 请求方式表示资源操作Spring MVC 通过GetMapping/PostMapping等注解实现RestController RequestMapping(/user) public class UserController { // 查询用户GET GetMapping(/{id}) public User getUser(PathVariable Integer id) { ... } // 创建用户POST PostMapping public Result addUser(RequestBody User user) { ... } // 更新用户PUT PutMapping(/{id}) public Result updateUser(PathVariable Integer id, RequestBody User user) { ... } // 删除用户DELETE DeleteMapping(/{id}) public Result deleteUser(PathVariable Integer id) { ... } }9. 如何处理请求参数常见的参数绑定方式有哪些解析Spring MVC 支持多种参数绑定方式覆盖不同场景简单参数绑定通过RequestParam绑定基本类型String、Integer 等支持默认值GetMapping(/query) public ListUser queryUser(RequestParam(required false, defaultValue 1) Integer pageNum) { ... }路径参数绑定通过PathVariable绑定 URL 中的动态参数RESTful 风格JavaBean 绑定自动将请求参数如usernamezhangsanage20绑定到 JavaBean 的属性PostMapping(/add) public Result addUser(User user) { ... } // User包含username、age属性JSON 参数绑定通过RequestBody绑定请求体中的 JSON 数据到 JavaBean文件上传绑定通过MultipartFile接收上传文件PostMapping(/upload) public Result uploadFile(RequestParam(file) MultipartFile file) { ... }数组 / 集合绑定绑定多个同名参数如ids1ids2到数组 / ListGetMapping(/batch) public Result batchQuery(RequestParam ListInteger ids) { ... }10. RequestBody 和 RequestParam 的区别是什么解析维度RequestBodyRequestParam数据来源请求体Body通常是 JSON/XML 格式请求参数Query String/Form Data适用场景POST/PUT 请求传递复杂对象GET/POST 请求传递简单参数数据类型支持复杂 JavaBean、集合支持基本类型、String、简单数组编码处理需指定consumes如 application/json自动处理 URL 编码如 UTF-8可选性默认必填可配requiredfalse默认必填可配requiredfalse/ 默认值五、视图与响应处理11. Spring MVC 支持哪些视图技术如何配置视图解析器解析支持的视图技术服务器端视图JSP、FreeMarker、Thymeleaf、Velocity客户端视图JSON、XML通过ResponseBody返回其他PDF、Excel自定义视图。配置视图解析器以 Thymeleaf 为例Configuration EnableWebMvc public class WebConfig implements WebMvcConfigurer { // 配置Thymeleaf视图解析器 Bean public ThymeleafViewResolver thymeleafViewResolver() { ThymeleafViewResolver resolver new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding(UTF-8); return resolver; } Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine engine new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); return engine; } Bean public ClassLoaderTemplateResolver templateResolver() { ClassLoaderTemplateResolver resolver new ClassLoaderTemplateResolver(); resolver.setPrefix(templates/); // 视图文件路径 resolver.setSuffix(.html); // 视图后缀 resolver.setCharacterEncoding(UTF-8); resolver.setTemplateMode(TemplateMode.HTML); return resolver; } }12. 如何返回 JSON 格式的响应常见问题有哪些解析核心方式方法标注ResponseBody或类标注RestController引入 JSON 解析依赖如 Jackson、FastJSONSpring MVC 自动将返回值转为 JSON示例RestController RequestMapping(/user) public class UserController { GetMapping(/{id}) public User getUser(PathVariable Integer id) { return new User(id, 张三, 20); // 自动转为JSON } }常见问题及解决返回 JSON 乱码配置produces application/json;charsetUTF-8或全局配置消息转换器日期格式错误通过JsonFormat(pattern yyyy-MM-dd)标注日期字段字段脱敏 / 忽略通过JsonIgnore忽略指定字段JsonProperty重命名字段。六、高级特性与问题排查13. 如何实现统一异常处理解析Spring MVC 提供ControllerAdvice ExceptionHandler实现全局异常处理避免每个 Controller 单独捕获异常// 全局异常处理器 ControllerAdvice public class GlobalExceptionHandler { // 处理自定义业务异常 ExceptionHandler(BusinessException.class) ResponseBody public Result handleBusinessException(BusinessException e) { return Result.fail(e.getCode(), e.getMessage()); } // 处理所有未捕获的异常 ExceptionHandler(Exception.class) ResponseBody public Result handleException(Exception e) { log.error(系统异常, e); return Result.fail(500, 服务器内部错误); } }14. 如何解决跨域问题解析跨域CORS是浏览器的同源策略限制Spring MVC 有 3 种解决方式注解方式在 Controller / 方法上标注CrossOriginRestController CrossOrigin(origins http://localhost:8080, maxAge 3600) public class UserController { ... }全局配置推荐实现WebMvcConfigurer重写addCorsMappingsConfiguration public class WebConfig implements WebMvcConfigurer { Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping(/**) // 所有接口 .allowedOrigins(*) // 允许所有源生产环境指定具体域名 .allowedMethods(GET, POST, PUT, DELETE) // 允许的请求方式 .allowedHeaders(*) // 允许的请求头 .maxAge(3600); // 预检请求缓存时间 } }过滤器方式配置CorsFilter适用于 Spring Boot。15. Spring MVC 常见性能优化手段有哪些解析启用视图缓存对 Thymeleaf/JSP 等视图开启缓存避免重复解析静态资源优化将静态资源JS/CSS/ 图片交给 Nginx 处理或通过EnableWebMvc配置静态资源缓存减少拦截器范围拦截器仅作用于必要接口避免全局拦截参数校验优化使用ValidBindingResult提前校验参数避免业务层重复校验异步请求使用Callable/DeferredResult实现异步处理提高吞吐量序列化优化使用高性能 JSON 解析器如 FastJSON2减少序列化耗时。