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

  • 自动配置:减少了大量样板配置
  • 简化开发:通过注解简化控制器开发
  • 灵活扩展:可以轻松覆盖默认配置
  • 集成测试:提供强大的测试支持
  • 生产就绪:内置健康检查、指标
相关推荐
仍然.4 小时前
Spring MVC(1)---介绍Spring MVC 和 请求数据
java·spring·mvc
摇滚侠2 天前
Spring MVC 不是一个单独的框架,是 Spring 框架的一个模块
java·spring·mvc
我登哥MVP3 天前
Spring Boot 从“会用”到“精通”:SpringBoot MVC 请求处理全流程
java·spring boot·后端·spring·mvc·maven·intellij-idea
摇滚侠5 天前
JavaWeb 全套教程 MVC 模式 93
mvc
代码的小搬运工5 天前
【iOS】MVC架构
ios·架构·mvc
qq_2518364577 天前
基于MVC的学校食堂点餐管理系统的设计与实现
mvc
故渊at7 天前
系列一:架构思想进阶 | 第1篇 Android 架构演进实录:从 MVC 的“万能类”到 MVVM 的数据驱动
android·架构·mvc
RR13357 天前
Spring MVC and Spring Gateway 的差异,以及报错处理
spring·gateway·mvc
gCode Teacher 格码致知8 天前
AspNet Mvc教学:Route路由切换-由Deepseek产生
mvc
gCode Teacher 格码致知9 天前
Asp.net Mvc教学: Url.Encode及Html.Encode的区别和联系-由Deepseek产生
asp.net·mvc