一、数据绑定概述
将HTTP请求中的表单数据自动映射到Controller方法的参数中,支持多种数据类型绑定。
二、自动绑定数据类型
2.1 基本数据类型绑定
支持类型
- 基本类型:
int
,double
等 - 包装类:
Integer
,Double
等 String
类型
实现步骤
- 创建表单(JSP)
<form action="/demo01/demo01" method="post">
<input type="text" name="id" placeholder="城市ID"/>
<input type="text" name="cityName" placeholder="城市名称"/>
<input type="text" name="GDP" placeholder="城市GDP"/>
<input type="text" name="capital" placeholder="是否是省会"/>
<input type="submit" value="提交"/>
</form>
- 编写Controller方法
@RequestMapping("/demo01")
public void demo01(Integer id, String cityName, Double GDP, Boolean capital,
HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("ID: " + id);
response.getWriter().write("City: " + cityName);
}
注意事项
- 表单字段名需与方法参数名一致
- 空值会绑定为
null
(包装类允许为空)
2.2 实体类绑定
实体类定义
@Data // Lombok注解,自动生成getter/setter
public class City {
private Integer id;
private String cityName; // 注意String首字母大写
private Double GDP;
private Boolean capital;
}
Controller实现
@RequestMapping("/demo02")
public void demo02(City city, HttpServletResponse response) throws IOException {
System.out.println(city); // 自动绑定表单数据到City对象
}
表单要求
字段名需与实体类属性名完全一致。
2.3 集合与数组绑定
2.3.1 数组绑定
Controller方法
@RequestMapping("/demo03")
public void demo03(Integer[] ids, HttpServletResponse response) throws IOException {
response.getWriter().write(Arrays.toString(ids));
}
表单示例
<input type="checkbox" name="ids" value="1">
<input type="checkbox" name="ids" value="2">
2.3.2 List/Set绑定(需注解)
Controller方法
@RequestMapping("/demo04")
public void demo04(@RequestParam List<Integer> ids, HttpServletResponse response) {
// 使用@RequestParam强制绑定集合
}
@RequestMapping("/demo05")
public void demo05(@RequestParam Set<Integer> ids, HttpServletResponse response) {
// Set自动去重
}
2.3.3 Map绑定(需注解)
Controller方法
@RequestMapping("/demo06")
public void demo06(@RequestParam Map<String, Object> params) {
// 参数名格式:map[key]=value
}
表单示例
<input type="text" name="map['key1']" value="value1">
<input type="text" name="map['key2']" value="value2">
三、内置数据绑定对象
3.1 常用对象
- Model:接口,数据存储在Request作用域
- ModelMap:类,功能类似Model
- ModelAndView:包含数据与视图路径
3.2 使用示例
@RequestMapping("/demo09")
public String demo09(Map<String,Object> map, Model model, ModelMap modelMap) {
map.put("mapMsg", "Hello Map");
model.addAttribute("modelMsg", "Hello Model");
modelMap.addAttribute("modelMapMsg", "Hello ModelMap");
return "forward:/demo09.jsp";
}
JSP显示数据
${requestScope.mapMsg}
${requestScope.modelMsg}
${requestScope.modelMapMsg}
四、乱码处理方案
4.1 配置过滤器
在web.xml
中添加:
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
4.2 注意事项
- 确保过滤器配置在
<servlet>
标签之前 - 同时处理请求和响应编码
五、关键问题总结
- 集合绑定
- List/Set必须使用
@RequestParam
- Map需特殊格式参数名
- List/Set必须使用
- 类型匹配
- 表单值需能转换为目标类型(如数字转Double)
- 命名规范
- 表单字段名与参数名/属性名严格一致
- 乱码处理优先级
- 推荐使用过滤器而非手动设置
request.setCharacterEncoding()
- 推荐使用过滤器而非手动设置