← 返回首页

第2章: 数据绑定

掌握请求参数绑定与数据转换

数据绑定概述

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"; } }

POJO 对象绑定

实体类

public class User { private Long id; private String username; private String email; private Integer age; private Date birthday; // getter/setter }

Controller

@PostMapping("/save") public String save(User user) { // SpringMVC 自动将表单数据绑定到 User 对象 userService.save(user); return "redirect:/user/list"; } // 表单: // username=张三&email=zhangsan@example.com&age=25

嵌套对象绑定

public 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

List

@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=30

日期类型转换

方式1:@DateTimeFormat

public class User { @DateTimeFormat(pattern = "yyyy-MM-dd") private Date birthday; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; }

方式2:自定义转换器

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()); } }

JSON 数据绑定

接收 JSON

@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 // }

返回 JSON

@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"; }

本章小结

← 上一章 下一章 →