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

  • 自动配置:减少了大量样板配置
  • 简化开发:通过注解简化控制器开发
  • 灵活扩展:可以轻松覆盖默认配置
  • 集成测试:提供强大的测试支持
  • 生产就绪:内置健康检查、指标
相关推荐
低客的黑调1 小时前
Spring MVC 全面详解:原理、组件、实战与高级特性
java·spring·mvc
STARFALL0011 小时前
spring mvc 自定义Converter 设置
java·spring·mvc
哈哈~haha1 天前
ui5_Walkthrough_Step 7:JSON Model
json·mvc·module·ui5
好好研究3 天前
SSM整合(一)
java·spring·mvc·mybatis·db
凌波粒3 天前
Springboot基础教程(4)--Thymeleaf模板引擎/MVC自动装配原理
spring boot·后端·mvc
老神在在0013 天前
MyBatis02
后端·spring·java-ee·mvc·mybatis
就叫飞六吧4 天前
Spring MVC 接口命名为什么会有 *.do/actions等身影?
java·spring·mvc
我是好小孩7 天前
【Android】常见的架构模式:MVC, MCP, MVVM
android·架构·mvc
想不明白的过度思考者9 天前
Spring Boot/Spring MVC核心注解深度解析
spring boot·spring·mvc