基础概念
什么是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 或函数式 |