基础概念
什么是Spring MVC?
Spring MVC 是 Spring Framework 提供的一个基于 Servlet 的 Web 框架,属于 MVC(Model-View-Controller)架构的一种实现。它通过 DispatcherServlet 作为前端控制器,对请求进行分发和调度,实现请求控制逻辑与业务逻辑、视图渲染的解耦。
Spring MVC 的核心组件有哪些?
Spring MVC 的核心组件包括:
DispatcherServlet:前端控制器,接收所有请求,统一调度处理流程。
HandlerMapping:根据 URL 找到对应的 Controller 方法。
Controller:业务控制器,处理请求逻辑并返回模型数据或视图名。
ModelAndView:封装模型数据和视图信息。
ViewResolver:视图解析器,负责将逻辑视图名解析为实际视图(如 JSP 文件)。
View:最终负责渲染页面给客户端。
HandlerAdapter:用于执行不同类型的处理器方法。
Spring MVC 的请求流程是怎样的?
简要流程如下:
浏览器发送请求被 DispatcherServlet 接收。
DispatcherServlet 调用 HandlerMapping 找到对应的处理器(Controller)。
调用 HandlerAdapter 执行处理器方法。
控制器返回 ModelAndView。
DispatcherServlet 调用 ViewResolver 解析视图。
渲染视图并响应给客户端。
请求处理
@RequestMapping 和 @GetMapping 有什么区别?
@RequestMapping
是一个通用的映射注解,可以指定请求方法、路径、参数、头信息等。@GetMapping
是@RequestMapping(method = RequestMethod.GET)
的语法糖,专用于处理 GET 请求。
Spring 4.3 后引入了 @GetMapping
、@PostMapping
等注解,更加语义化和简洁。
如何接收请求参数?
Spring MVC 提供多种方式:
@RequestParam:接收 URL 参数或表单参数。
@PathVariable:接收路径中的变量。
@RequestBody:接收 JSON 请求体并反序列化为 Java 对象。
@ModelAttribute:接收表单提交的参数并封装为 Java Bean。
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 如何实现跨域?
注解方式:在 Controller 上添加
@CrossOrigin
全局配置:通过实现
WebMvcConfigurer
配置 CORS 映射过滤器方式:实现
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 或函数式 |