Skip to content

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");
    }
}

总结

  1. 工作流程:DispatcherServlet → HandlerMapping → Controller → ViewResolver
  2. 接收参数:@PathVariable、@RequestParam、@RequestBody
  3. 响应处理:返回 JSON、视图、重定向
  4. 异常处理:@ExceptionHandler、@ControllerAdvice
  5. 拦截器:HandlerInterceptor

基于 VitePress 构建