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

  • 自动配置:减少了大量样板配置
  • 简化开发:通过注解简化控制器开发
  • 灵活扩展:可以轻松覆盖默认配置
  • 集成测试:提供强大的测试支持
  • 生产就绪:内置健康检查、指标
相关推荐
旧物有情3 天前
游戏开发常用架构 #MVP,MVC
游戏·unity·架构·mvc
sun03226 天前
【笔记】Spring MVC 相关介绍
java·spring·mvc
Qredsun6 天前
RAG 系统 Embedding 流程分析与自托管 API 适配
mvc·embedding
月落星还在10 天前
Spring MVC 与 Spring Boot:从“手动挡”到“自动驾驶”的进化论,兼谈前后端分离的哲学
spring boot·spring·云原生·mvc
wang090714 天前
自己动手写一个spring之MVC_3
java·spring·mvc
shepherd12614 天前
一次把 Spring MVC 文件上传参数“查没了”的排查:multipart、Filter 与 request body 的连环坑
java·后端·spring·mvc
阿pin14 天前
Android随笔-MVC/MVP/MVVM/MVI
android·mvc·mvvm·mvp·mvi
李燚16 天前
Go 项目怎么组织:DDD 4 层 vs MVC vs 脚本式
开发语言·golang·mvc·ddd·agent框架·eino
帅气的冬天17 天前
在ASP.NET MVC中对表进行通用的增删改
后端·asp.net·mvc
正儿八经的少年18 天前
Spring MVC 框架
java·spring·mvc