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 支持提供了以下主要优势:

  • 自动配置:减少了大量样板配置
  • 简化开发:通过注解简化控制器开发
  • 灵活扩展:可以轻松覆盖默认配置
  • 集成测试:提供强大的测试支持
  • 生产就绪:内置健康检查、指标
相关推荐
budingxiaomoli3 天前
Spring Web MVC 知识总结
spring·mvc
虾米Life4 天前
MVC与MVVM 架构
架构·mvc·mvvm
笛卡尔的心跳6 天前
Spring MVC 注解
java·spring·mvc
小松加哲6 天前
Spring MVC 核心原理全解析
java·spring·mvc
那个失眠的夜7 天前
RESTful 语法规范 核心注解详解
java·spring·mvc·mybatis
羌俊恩7 天前
Centos环境django项目部署过程
django·flask·centos·mvc·mtv·web项目框架
Foreer黑爷9 天前
Spring MVC原理与源码:从请求到响应的全流程解析
java·spring·mvc
曹牧10 天前
Spring MVC中使用HttpServletRequest和HttpServletResponse
java·spring·mvc
曹牧10 天前
Spring MVC配置文件
java·spring·mvc
CPUOS201010 天前
嵌入式C语言高级编程之MVC设计模式
c语言·设计模式·mvc