掌握请求参数绑定与数据转换
SpringMVC 自动将 HTTP 请求参数绑定到 Controller 方法的参数上,支持简单类型、对象、集合等多种数据类型。
@Controller
@RequestMapping("/user")
public class UserController {
// 基本类型
@GetMapping("/detail")
public String detail(@RequestParam Long id, Model model) {
User user = userService.findById(id);
model.addAttribute("user", user);
return "user/detail";
}
// 多个参数
@GetMapping("/search")
public String search(@RequestParam String name,
@RequestParam(required = false) Integer age,
@RequestParam(defaultValue = "1") int page) {
// 处理逻辑
return "user/list";
}
}public class User {
private Long id;
private String username;
private String email;
private Integer age;
private Date birthday;
// getter/setter
}@PostMapping("/save")
public String save(User user) {
// SpringMVC 自动将表单数据绑定到 User 对象
userService.save(user);
return "redirect:/user/list";
}
// 表单:
// username=张三&email=zhangsan@example.com&age=25public class User {
private Long id;
private String username;
private Address address; // 嵌套对象
}
public class Address {
private String province;
private String city;
private String street;
}
// 表单参数:
// username=张三&address.province=北京&address.city=北京市&address.street=朝阳区@PostMapping("/delete")
public String delete(@RequestParam Long[] ids) {
userService.deleteByIds(ids);
return "redirect:/user/list";
}
// 请求:?ids=1&ids=2&ids=3@PostMapping("/batch")
public String batchUpdate(@RequestParam List<Long> ids) {
// 批量处理
return "success";
}public class UserForm {
private List<User> users;
// getter/setter
}
@PostMapping("/batchSave")
public String batchSave(UserForm form) {
List<User> users = form.getUsers();
userService.batchSave(users);
return "redirect:/user/list";
}
// 表单参数:
// users[0].username=张三&users[0].age=25
// users[1].username=李四&users[1].age=30public class User {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
}public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(source);
} catch (ParseException e) {
throw new RuntimeException("日期格式错误");
}
}
}
// 注册转换器
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToDateConverter());
}
}@PostMapping("/api/user")
@ResponseBody
public Result save(@RequestBody User user) {
// @RequestBody 将 JSON 转换为 User 对象
userService.save(user);
return Result.success();
}
// 请求体:
// {
// "username": "张三",
// "email": "zhangsan@example.com",
// "age": 25
// }@GetMapping("/api/user/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
// 或使用 @RestController
@RestController
@RequestMapping("/api/user")
public class UserApiController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"/> <!-- 10MB -->
<property name="defaultEncoding" value="UTF-8"/>
</bean>@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
if (!file.isEmpty()) {
try {
String fileName = file.getOriginalFilename();
String path = "/uploads/" + fileName;
file.transferTo(new File(path));
return "success";
} catch (IOException e) {
return "error";
}
}
return "error";
}@PostMapping("/batchUpload")
public String batchUpload(@RequestParam("files") MultipartFile[] files) {
for (MultipartFile file : files) {
if (!file.isEmpty()) {
// 保存文件
String fileName = file.getOriginalFilename();
// ...
}
}
return "success";
}