SpringBoot中的mvc怎么用

发布时间:2022-02-18 14:14:09 作者:小新
来源:亿速云 阅读:179
# SpringBoot中的MVC怎么用

## 一、Spring MVC概述

Spring MVC是Spring框架提供的Web模块,基于经典的MVC(Model-View-Controller)设计模式。在SpringBoot中,通过自动配置简化了传统Spring MVC的配置流程。

### 1.1 核心组件
- **DispatcherServlet**:前端控制器,统一处理请求
- **HandlerMapping**:请求到处理器的映射
- **Controller**:业务逻辑处理器
- **ViewResolver**:视图解析器
- **Model**:数据模型载体

### 1.2 工作流程
1. 用户发起HTTP请求
2. DispatcherServlet接收请求
3. HandlerMapping找到对应的Controller
4. Controller处理业务并返回ModelAndView
5. ViewResolver解析视图
6. 渲染视图返回响应

## 二、快速搭建SpringBoot MVC项目

### 2.1 创建项目
使用Spring Initializr创建项目时勾选:
- Spring Web(包含Spring MVC)
- Thymeleaf(可选模板引擎)

```xml
<!-- pom.xml关键依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

2.2 基础配置

# application.properties
server.port=8080
spring.mvc.view.prefix=/templates/
spring.mvc.view.suffix=.html

三、控制器(Controller)开发

3.1 基本控制器示例

@Controller
@RequestMapping("/demo")
public class DemoController {
    
    @GetMapping("/hello")
    public String sayHello(Model model) {
        model.addAttribute("message", "Hello Spring MVC!");
        return "hello"; // 对应templates/hello.html
    }
}

3.2 常用注解

注解 说明
@Controller 声明为控制器
@RestController 控制器+@ResponseBody
@RequestMapping 请求映射基础注解
@GetMapping GET请求映射
@PostMapping POST请求映射
@PathVariable 路径变量
@RequestParam 请求参数
@RequestBody 请求体绑定
@ModelAttribute 模型属性

3.3 参数绑定示例

@PostMapping("/user")
public String createUser(
    @RequestParam String username,
    @RequestParam(defaultValue = "18") int age,
    @RequestBody UserDTO user) {
    // 处理逻辑
    return "result";
}

四、视图技术集成

4.1 Thymeleaf模板

<!-- templates/hello.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Demo Page</title>
</head>
<body>
    <h1 th:text="${message}">Default Message</h1>
</body>
</html>

4.2 返回JSON数据

@RestController
@RequestMapping("/api")
public class ApiController {
    
    @GetMapping("/data")
    public Map<String, Object> getData() {
        return Map.of(
            "status", 200,
            "data", "Some API Data"
        );
    }
}

五、异常处理机制

5.1 全局异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception e) {
        return ResponseEntity
            .status(HttpStatus.INTERNAL_SERVER_ERROR)
            .body("Error: " + e.getMessage());
    }
}

5.2 自定义异常

@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
    public ResourceNotFoundException(String message) {
        super(message);
    }
}

六、RESTful API开发

6.1 标准REST控制器

@RestController
@RequestMapping("/api/users")
public class UserController {
    
    @GetMapping
    public List<User> listUsers() {
        // 返回用户列表
    }
    
    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        // 返回单个用户
    }
    
    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public User createUser(@RequestBody User user) {
        // 创建用户
    }
    
    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, 
                         @RequestBody User user) {
        // 更新用户
    }
    
    @DeleteMapping("/{id}")
    @ResponseStatus(HttpStatus.NO_CONTENT)
    public void deleteUser(@PathVariable Long id) {
        // 删除用户
    }
}

6.2 常用响应状态码

七、高级特性

7.1 文件上传

@PostMapping("/upload")
public String handleUpload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        // 保存文件逻辑
        return "Upload success";
    }
    return "Upload failed";
}

7.2 拦截器实现

public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        // 认证逻辑
        return true; // 返回false则中断请求
    }
}

// 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor())
                .addPathPatterns("/admin/**");
    }
}

7.3 跨域支持

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .maxAge(3600);
    }
}

八、最佳实践

  1. 分层清晰:Controller只负责路由和参数处理,业务逻辑放在Service层
  2. 统一响应格式:使用ResponseEntity或自定义Result类
  3. 参数校验:结合Hibernate Validator进行验证
  4. 接口文档:集成Swagger或OpenAPI
  5. 全局异常处理:避免直接抛出原生异常

九、常见问题解决

  1. 404错误

    • 检查@RequestMapping路径
    • 确认静态资源位置正确
    • 查看是否被拦截器拦截
  2. 模板引擎不生效

    • 检查thymeleaf依赖
    • 确认模板文件放在templates目录
    • 检查视图解析器配置
  3. POST请求接收不到参数

    • 检查是否缺少@RequestBody
    • 确认Content-Type为application/json
    • 检查参数名是否匹配

十、总结

SpringBoot通过自动配置极大简化了Spring MVC的使用,开发者只需: 1. 添加spring-boot-starter-web依赖 2. 创建@Controller或@RestController 3. 定义@RequestMapping方法 4. 处理业务逻辑并返回结果

结合Thymeleaf等模板引擎可以快速开发传统Web应用,而@RestController则适合构建RESTful API。合理运用拦截器、异常处理等机制可以构建健壮的Web应用程序。 “`

(全文约2150字,涵盖SpringBoot MVC核心用法和实用技巧)

推荐阅读:
  1. MVC3中辅助方法怎么用
  2. ASP.NET MVC中SignalR怎么用

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot mvc

上一篇:ApacheWeb如何配置多站点

下一篇:如何配置高可用RabbitMQ集群

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》