Spring MVC
Spring MVC 是 Spring 的 Web 框架,实现了 MVC 模式,用于处理 Web 请求。
工作流程
请求 → DispatcherServlet → HandlerMapping → Controller → ViewResolver → 视图
↓
HandlerAdapter核心组件
| 组件 | 说明 |
|---|---|
| DispatcherServlet | 前端控制器 |
| HandlerMapping | 处理器映射 |
| Controller | 处理器 |
| ViewResolver | 视图解析器 |
| View | 视图 |
Controller 接收参数
java
@RestController
@RequestMapping("/api")
public class UserController {
// 路径变量
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// 请求参数
@GetMapping("/users")
public List<User> search(@RequestParam String name,
@RequestParam(required = false) Integer age) {
return userService.search(name, age);
}
// 请求头
@GetMapping("/test")
public String test(@RequestHeader("Authorization") String token) {
return token;
}
// Cookie
@GetMapping("/cookie")
public String cookie(@CookieValue("SESSION") String sessionId) {
return sessionId;
}
// 请求体
@PostMapping("/users")
public User create(@RequestBody User user) {
return userService.save(user);
}
// 表单数据
@PostMapping("/form")
public void submitForm(@RequestParam String username,
@RequestParam String password) {
// 处理表单
}
// 多参数封装
@PostMapping("/batch")
public void batch(@RequestBody List<User> users) {
userService.saveAll(users);
}
}数据绑定
java
// 实体类绑定
public class User {
private Long id;
private String name;
private Integer age;
private Date birthday;
private List<String> hobbies;
// getter/setter
}
// 表单自动绑定
@PostMapping("/user")
public void createUser(User user) {
// 表单字段自动绑定到 User 对象
}响应处理
java
// 返回 JSON
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// 返回视图
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("name", "World");
return "hello";
}
// 重定向
@GetMapping("/redirect")
public String redirect() {
return "redirect:/other";
}
// 重定向带参数
@GetMapping("/redirect")
public RedirectView redirect() {
RedirectView redirectView = new RedirectView("/other");
redirectView.setExposeModelAttributes(false);
return redirectView;
}
// Flash 属性
@PostMapping("/save")
public String save(@ModelAttribute("user") User user, RedirectAttributes ra) {
ra.addFlashAttribute("message", "保存成功");
return "redirect:/list";
}异常处理
java
// 局部异常处理
@ExceptionHandler(ValidationException.class)
public Map<String, String> handleValidation(ValidationException e) {
Map<String, String> errors = new HashMap<>();
errors.put("error", e.getMessage());
return errors;
}
// 全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Map<String, String> handle(Exception e) {
Map<String, String> result = new HashMap<>();
result.put("code", "500");
result.put("message", e.getMessage());
return result;
}
}拦截器
java
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("Authorization");
if (token == null) {
response.setStatus(401);
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView mav) {
// 请求处理之后调用
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler, Exception ex) {
// 整个请求完成后调用
}
}java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login");
}
}总结
- 工作流程:DispatcherServlet → HandlerMapping → Controller → ViewResolver
- 接收参数:@PathVariable、@RequestParam、@RequestBody
- 响应处理:返回 JSON、视图、重定向
- 异常处理:@ExceptionHandler、@ControllerAdvice
- 拦截器:HandlerInterceptor
