请求接收与参数绑定
SpringMVC通过参数绑定机制将请求数据自动映射到控制器方法参数。
参数绑定原理
SpringMVC使用HandlerAdapter调用控制器方法,通过HandlerMethodArgumentResolver解析参数:
Java
HTTP请求 → DispatcherServlet → HandlerAdapter → ArgumentResolver → 方法参数
支持的参数类型
Servlet API
Java
@RequestMapping("/servlet")
public String servlet(HttpServletRequest request,
HttpServletResponse response,
HttpSession session) {
return "success";
}
基本类型
Java
@RequestMapping("/basic")
public String basic(Integer id, String name, Boolean active) {
return "success";
}
POJO对象
Java
@RequestMapping("/pojo")
public String pojo(User user) {
return "success";
}
数组与集合
Java
@RequestMapping("/array")
public String array(@RequestParam("id") Integer[] ids,
@RequestParam("name") List<String> names) {
return "success";
}
路径变量
Java
@RequestMapping("/path/{id}")
public String path(@PathVariable Integer id) {
return "success";
}
请求体
Java
@RequestMapping("/body")
public String body(@RequestBody User user) {
return "success";
}
参数绑定注解
| 注解 | 来源 | 说明 |
|---|---|---|
| @RequestParam | 请求参数 | Query String参数 |
| @PathVariable | URL路径 | RESTful路径变量 |
| @RequestHeader | 请求头 | HTTP Header |
| @CookieValue | Cookie | Cookie值 |
| @RequestBody | 请求体 | JSON/XML数据 |
| @ModelAttribute | 模型 | 表单绑定对象 |
默认参数绑定
SpringMVC自动绑定以下类型,无需注解:
| 类型 | 说明 |
|---|---|
| HttpServletRequest | 请求对象 |
| HttpServletResponse | 响应对象 |
| HttpSession | 会话对象 |
| Model/ModelMap | 模型数据 |
| Principal | 认证主体 |
| Locale | 区域信息 |
| InputStream/Reader | 请求体流 |
| OutputStream/Writer | 响应体流 |
综合示例
text
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/users/{id}")
public User getUser(
@PathVariable Integer id,
@RequestParam(required = false) String name,
@RequestHeader("User-Agent") String userAgent
) {
User user = new User();
user.setId(id);
user.setName(name);
return user;
}
@PostMapping("/users")
public User createUser(
@RequestBody User user,
HttpServletRequest request,
HttpSession session
) {
user.setCreateTime(new Date());
return userService.save(user);
}
}
数据绑定流程
- 解析请求参数名
- 查找匹配的方法参数
- 类型转换
- 数据校验(如有@Valid)
- 绑定到方法参数
参数名与请求参数名一致时可省略注解,不一致时需使用注解指定。
要点总结
- 参数绑定自动将请求数据映射到方法参数
- @RequestParam绑定请求参数,@PathVariable绑定路径变量
- POJO自动绑定同名属性
- Servlet API类型自动注入
📝 发现内容有误?点击此处直接编辑