面试篇:Spring MVC

发布于:2025-05-13 ⋅ 阅读:(20) ⋅ 点赞:(0)

基础概念

什么是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)
所属框架 Spring Servlet
执行时机 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 MVC Spring WebFlux
编程模型 基于 Servlet、阻塞 IO 响应式、非阻塞
最小依赖 Servlet API Reactor Core
适用场景 大多数同步 Web 应用 高并发、低延迟服务
Controller风格 @Controller @RestController 或函数式