SpringBoot3.x入门到精通系列: 2.3 Web开发基础
SpringBoot 3.x Web开发基础
🌐 SpringBoot Web开发概述
SpringBoot提供了强大的Web开发支持,基于Spring MVC框架,可以快速构建RESTful API和传统的Web应用。
核心组件
- DispatcherServlet: 前端控制器,处理所有HTTP请求
- Controller: 控制器,处理具体的业务逻辑
- ViewResolver: 视图解析器,解析视图名称
- HandlerMapping: 处理器映射,将请求映射到处理器
🚀 快速开始
1. 添加Web依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
这个starter包含了:
- Spring MVC
- 嵌入式Tomcat服务器
- Jackson JSON处理
- 数据验证支持
2. 创建第一个Controller
package com.example.demo.controller;import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api/hello")
public class HelloController {@GetMappingpublic String hello() {return "Hello, SpringBoot 3.x Web!";}@GetMapping("/{name}")public Map<String, String> helloWithName(@PathVariable String name) {Map<String, String> response = new HashMap<>();response.put("message", "Hello, " + name + "!");response.put("timestamp", java.time.LocalDateTime.now().toString());return response;}@PostMappingpublic Map<String, Object> createGreeting(@RequestBody Map<String, String> request) {String name = request.getOrDefault("name", "World");Map<String, Object> response = new HashMap<>();response.put("greeting", "Hello, " + name + "!");response.put("status", "created");response.put("id", System.currentTimeMillis());return response;}
}
🎯 请求映射详解
1. HTTP方法映射
@RestController
@RequestMapping("/api/users")
public class UserController {// GET请求 - 获取所有用户@GetMappingpublic List<User> getAllUsers() {return userService.findAll();}// GET请求 - 根据ID获取用户@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.findById(id);}// POST请求 - 创建用户@PostMappingpublic User createUser(@RequestBody User user) {return userService.save(user);}// PUT请求 - 更新用户@PutMapping("/{id}")public User updateUser(@PathVariable Long id, @RequestBody User user) {return userService.update(id, user);}// PATCH请求 - 部分更新用户@PatchMapping("/{id}")public User patchUser(@PathVariable Long id, @RequestBody Map<String, Object> updates) {return userService.patch(id, updates);}// DELETE请求 - 删除用户@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.delete(id);return ResponseEntity.noContent().build();}
}
2. 请求参数处理
@RestController
@RequestMapping("/api/search")
public class SearchController {// 查询参数@GetMapping("/users")public List<User> searchUsers(@RequestParam(required = false) String name,@RequestParam(defaultValue = "0") int page,@RequestParam(defaultValue = "10") int size,@RequestParam(defaultValue = "id") String sortBy) {return userService.search(name, page, size, sortBy);}// 多个查询参数@GetMapping("/products")public List<Product> searchProducts(@RequestParam Map<String, String> params) {return productService.search(params);}// 路径变量@GetMapping("/category/{categoryId}/products/{productId}")public Product getProduct(@PathVariable Long categoryId,@PathVariable Long productId) {return productService.findByCategoryAndId(categoryId, productId);}// 请求头@GetMapping("/profile")public UserProfile getUserProfile(@RequestHeader("Authorization") String token,@RequestHeader(value = "User-Agent", required = false) String userAgent) {return userService.getProfile(token, userAgent);}
}
3. 请求体处理
@RestController
@RequestMapping("/api/orders")
public class OrderController {// JSON请求体@PostMappingpublic Order createOrder(@RequestBody @Valid OrderRequest request) {return orderService.create(request);}// 表单数据@PostMapping("/form")public Order createOrderFromForm(@RequestParam String customerName,@RequestParam String email,@RequestParam List<Long> productIds) {OrderRequest request = new OrderRequest(customerName, email, productIds);return orderService.create(request);}// 文件上传@PostMapping("/upload")public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("description") String description) {if (file.isEmpty()) {return ResponseEntity.badRequest().body("文件不能为空");}try {String fileName = fileService.store(file, description);return ResponseEntity.ok("文件上传成功: " + fileName);} catch (Exception e) {return ResponseEntity.status(500).body("文件上传失败: " + e.getMessage());}}
}
📝 数据验证
1. 使用Bean Validation
package com.example.demo.dto;import jakarta.validation.constraints.*;
import java.time.LocalDate;public class UserRequest {@NotBlank(message = "用户名不能为空")@Size(min = 2, max = 50, message = "用户名长度必须在2-50个字符之间")private String username;@NotBlank(message = "邮箱不能为空")@Email(message = "邮箱格式不正确")private String email;@NotNull(message = "年龄不能为空")@Min(value = 18, message = "年龄不能小于18岁")@Max(value = 100, message = "年龄不能大于100岁")private Integer age;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")private String phone;@Past(message = "生日必须是过去的日期")private LocalDate birthday;// 构造函数、getter和setter方法public UserRequest() {}public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }public Integer getAge() { return age; }public void setAge(Integer age) { this.age = age; }public String getPhone() { return phone; }public void setPhone(String phone) { this.phone = phone; }public LocalDate getBirthday() { return birthday; }public void setBirthday(LocalDate birthday) { this.birthday = birthday; }
}
🔗 下一篇
在下一篇文章中,我们将学习RESTful API的设计原则和最佳实践。
本文关键词: Web开发, Spring MVC, Controller, 请求映射, 数据验证, RESTful