3、MVC的支持

Spring Boot 中的 Spring MVC 支持提供了快速构建高效、灵活 Web 应用的便捷方式。其优点包括:自动配置简化了开发流程,减少 XML 配置;内嵌 Tomcat/Jetty 等服务器实现开箱即用;与 Spring 生态无缝集成(如数据访问、安全);支持 RESTful 风格和多种视图技术(Thymeleaf、JSON 等);通过注解(如 @RestController@RequestMapping)轻松定义路由和逻辑;提供全局异常处理、参数校验等增强功能;依赖管理通过 Starter 模块一键引入;同时兼容传统 Servlet 和响应式编程,兼顾高性能与可扩展性,显著提升开发效率。


1、Spring MVC的自动配置

Spring Boot 自动配置了以下 Spring MVC 功能:

  • 自动注册 DispatcherServlet
  • 自动配置 ViewResolver (包括 ContentNegotiatingViewResolver, BeanNameViewResolver)
  • 静态资源支持 (classpath 下的 /static, /public, /resources, /META-INF/resources)
  • 自动注册 Converter, GenericConverter, Formatter beans
  • 支持 HttpMessageConverters (用于 JSON, XML 等)
  • 自动注册 MessageCodesResolver
  • 静态 index.html 支持
  • 自定义 Favicon 支持
  • 自动使用 ConfigurableWebBindingInitializer

基本控制器:

java 复制代码
@RestController
@RequestMapping("/api")
public class HelloController {
    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, Spring Boot MVC!";
    }
}

2. 请求映射

Spring MVC 提供了多种注解来处理不同类型的 HTTP 请求:

基本请求映射:

java 复制代码
@RestController
@RequestMapping("/products")
public class ProductController {
    // GET /products
    @GetMapping
    public List<Product> getAllProducts() {
        // 返回所有产品
    }
    // GET /products/1
    @GetMapping("/{id}")
    public Product getProductById(@PathVariable Long id) {
        // 根据ID返回产品
    }
    // POST /products
    @PostMapping
    public Product createProduct(@RequestBody Product product) {
        // 创建新产品
    }
    // PUT /products/1
    @PutMapping("/{id}")
    public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
        // 更新产品
    }
    // DELETE /products/1
    @DeleteMapping("/{id}")
    public void deleteProduct(@PathVariable Long id) {
        // 删除产品
    }
}

请求参数处理:

java 复制代码
@GetMapping("/search")
public List<Product> searchProducts(
        @RequestParam(required = false) String name,
        @RequestParam(defaultValue = "0") double minPrice,
        @RequestParam(defaultValue = "1000") double maxPrice) {
    // 根据参数搜索产品
}

3、请求和响应处理

请求体绑定

java 复制代码
@PostMapping("/orders")
public ResponseEntity<Order> createOrder(@Valid @RequestBody Order order) {
    Order savedOrder = orderService.save(order);
    return ResponseEntity.created(URI.create("/orders/" + savedOrder.getId())).body(savedOrder);
}

响应处理:

java 复制代码
@GetMapping("/orders/{id}")
public ResponseEntity<?> getOrder(@PathVariable Long id) {
    return orderService.findById(id)
            .map(order -> ResponseEntity.ok(order))
            .orElse(ResponseEntity.notFound().build());
}

4、异常处理

Spring MVC 提供了多种方式来处理异常:

控制器级别的异常处理:

java 复制代码
@RestController
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(ProductNotFoundException.class)
    public ResponseEntity<ErrorResponse> handleProductNotFound(ProductNotFoundException ex) {
        ErrorResponse error = new ErrorResponse(
            "NOT_FOUND",
            ex.getMessage(),
            LocalDateTime.now()
        );
        return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
    }
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationExceptions(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
                .getFieldErrors()
                .stream()
                .map(error -> error.getField() + ": " + error.getDefaultMessage())
                .toList();

        ErrorResponse error = new ErrorResponse(
            "VALIDATION_FAILED",
            "Validation failed",
            LocalDateTime.now(),
            errors
        );
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }
}

5、文件上传

Spring MVC 提供了简单的文件上传支持:

java 复制代码
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
    if (file.isEmpty()) {
        return "redirect:/uploadStatus?error=empty";
    }

    try {
        byte[] bytes = file.getBytes();
        Path path = Paths.get("uploads/" + file.getOriginalFilename());
        Files.write(path, bytes);
        return "redirect:/uploadStatus?success";
    } catch (IOException e) {
        return "redirect:/uploadStatus?error=io";
    }
}

6、其他高级功能

异步请求处理:

java 复制代码
@GetMapping("/async")
public Callable<String> asyncProcessing() {
    return () -> {
        // 长时间运行的任务
        Thread.sleep(2000);
        return "Async result";
    };
}

CORS 支持:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("http://example.com")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

或者使用注解方式:

java 复制代码
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
public class MyController {
    // ...
}

内容协商:

Spring Boot 自动支持基于扩展名和 Accept 头的内容协商:

java 复制代码
@GetMapping(value = "/product/{id}", produces = { 
    MediaType.APPLICATION_JSON_VALUE, 
    MediaType.APPLICATION_XML_VALUE 
})
public Product getProduct(@PathVariable Long id) {
    // ...
}

总结

Spring Boot 的 Spring MVC 支持提供了以下主要优势:

  • 自动配置:减少了大量样板配置
  • 简化开发:通过注解简化控制器开发
  • 灵活扩展:可以轻松覆盖默认配置
  • 集成测试:提供强大的测试支持
  • 生产就绪:内置健康检查、指标
相关推荐
xiaolyuh1232 天前
Spring MVC Bean 参数校验 @Validated
java·spring·mvc
heartbeat..3 天前
Spring MVC 全面详解(Java 主流 Web 开发框架)
java·网络·spring·mvc·web
自在极意功。3 天前
简单介绍SpringMVC
java·mvc·springmvc·三层架构
威桑4 天前
深入理解 MVC 模式的优缺点
系统架构·mvc
alonewolf_994 天前
Spring MVC启动与请求处理全流程解析:从DispatcherServlet到HandlerAdapter
java·spring·mvc
廋到被风吹走4 天前
【Spring】Spring MVC核心原理与RESTful最佳实践详解
spring·mvc·restful
alonewolf_995 天前
Spring MVC重点功能底层源码深度解析
java·spring·mvc
撩得Android一次心动7 天前
Android 架构模式的演变(MVC、MVP、MVVM、MVI)
android·架构·mvc·mvvm·mvp
小信丶7 天前
Spring MVC 配置器:WebMvcConfigurer 详解、应用场景和示例代码
java·spring·mvc
柒.梧.8 天前
深度解析SpringMVC实战项目:从配置到请求处理全流程
java·spring·mvc