重点: 能够熟练使用数据绑定的相关注解
难点: 掌握注解方式的数据绑定
什么是数据绑定: 数据绑定就是处理器收集请求参数的方式
绑定不同类型的数据
- 简单对象
- 自定义对象
- 复合对象
- 集合对象
简单对象的绑定
- 基本类型
- 包装类型
相同点:
- request.getParameter() 获取
- 通过参数进行注入
区别:
- 基本类型不传会报参数不存在的异常
- 包装类型不报错,初始值为 null
@Controller("simpleController")
@RequestMapping("/simple")
public class SimpleController {
//基本数据类型绑定
@RequestMapping("/bindBase1.do")
public String bindBaseType1(HttpServletRequest request){
String parameter = request.getParameter("kgc");
System.out.println("获取到的参数是:"+parameter);
return "success";
}
@RequestMapping("/bindBase2.do")
public String bindBaseType2(int age){
System.out.println("获取到的年龄是:"+age);
return "success";
}
@RequestMapping("/bindWrap.do")
public String bindWropType(Integer age){
System.out.println("获取到的包装类型参数是:"+age);
return "success";
}
}
复合对象绑定
通过参数注入方式进行数据绑定
请求参数与自定义对象写法略有区别
提供一个符合对象:
public class ClassModel{
private Long classId;
private String className;
//学生对象
private StudentModel student;
}
请求参数: student.studentId=123&student.studentName=kgc
@Controller
@RequestMapping("/complex")
public class ComplexController {
// 绑定方法 访问路径:http://localhost:8080/DataBind/complex/bindComplex.do
// ?classId=10&className=309&student.studentId=15&student.studentName=zhangsan
@RequestMapping("/bindComplex.do")
public String bindComplex(ClassModel clazz){
System.out.println("获取到的参数"+clazz);
return "success";
}
}
集合对象绑定
集合参数绑定 ·提供一个数据对象来进行参数收集,否则不生效
List集合
Set集合
Map集合
List 集合
提供一个模型对象
public class StudentList{
private List<StudentModel> students;
Setter getter;
}
请求参数: student[0].studentId=123&student[0].studentName=kgc
List的大小是可以弹性增加的
Set 集合
提供模型对象
private Set<StudentModel> studentSet;
public StudentSet() {
studentSet = new HashSet<StudentModel>();
studentSet.add(new StudentModel());
studentSet.add(new StudentModel());
}
请求参数: students[0].studentId=123&students.studentName=kgc
注: 与List 不同,Set 的大小需要在初始化时指定,否则报越界错误
Map
提供一个模型对象
public class ClassMap {
private Map<String,ClassModel> classMap;
}
请求参数: classMap[x].classId=1&classMap[x].className=%27SpringMVC%27&classMap[x].student.studentId=10&classMap[x].student.studentName=kgc
/**
* 集合参数绑定的示例
* @author Administrator
*
*/
@Controller
@RequestMapping("/collection")
public class CollectionController {
//错误的写法
@RequestMapping("/bindError.do")
public String bindError(List<String> testList){
System.out.println(testList);
return "success";
}
// list 参数绑定
@RequestMapping("/bindList.do")
public String bindList(StudentList studentList){
System.out.println(studentList);
return "success";
}
// Set 参数绑定
@RequestMapping("/bindSet.do")
public String bindSet(StudentSet studentSet){
System.out.println(studentSet);
return "success";
}
// map参数绑定 请求路径: http://localhost:8080/DataBind/collection/bindMap.do
// ?classMap[x].classId=1&classMap[x].className=%27SpringMVC%27&classMap[x].student.studentId=10&classMap[x].student.studentName=kgc
@RequestMapping("bindMap.do")
public String bindMap(ClassMap classMap){
System.out.println(classMap);
return "success";
}
// 数组的参数绑定 请求路径:http://localhost:8080/DataBind/collection/bindArr.do?student
// 真实项目中,一般使用:?studentIds=1,2,3,4,5,6 string split();
@RequestMapping("/bindArr.do")
public String bindArr(StudentArray students){
System.out.println(students);
return "success";
}
}
数组对象 具体实现 ↑
数组(不常用)
数组作为参数时,需要提供一个绑定类,并且初始化时需要指定数组长度
-public class StudentArray{
- private String[] ids = new String[3];
}
注:在正式项目中一般不使用数组,通过特殊字符分词的方式更方便。
数据绑定注解 ·重难点
·@RequestParam 绑定单个请求数据
·@PathVariable 绑定URL模版变量值
·@ModelAttribute 取model中存的值
注解的使用
·@RequestParam
完整形式: @RequestParam(value=”参数名”,required=true,defaultValue=”为空时默认值”)
作用: 可以将请求中指定的参数名映射到方法中的参数
注: value 中可为空,为空值参数名和方法中的参数名相同
·@PathVariable
完整形式: @PathVariable(value=”参数名”)
作用: 将URL 中占位符所对应变量映射到参数
比如: @RequestMapping(value=”/detail/{变量}”
注:@PathVariable(value=”参数名”)中value 的值要和占位符/{参数名} 大括号中的值一致
·@ModelAttribute (不常用,比较鸡肋)
完整形式: @ModelAttribute(value=”参数名”);
作用: 可以加在方法上,表示将方法返回值封装在Model对象当中;
可以加在方法的参数前,表示将获取到的对象,绑定具体的参数上;
可以配合表单标签使用,表示在请求中获取参数对象
/**
* 数据绑定注解示例控制器
* @author Administrator
*
*/
@Controller
@RequestMapping("/anotation")
public class AnotationController {
// 验证RequestParam
@RequestMapping("checkRp.do")
public String checkRequestP(@RequestParam(value="asd", required=true, defaultValue="课工场")String kgcName){
// 注: value 中可为空,为空值参数名和方法中的参数名相同
System.out.println(kgcName);
return "success";
}
// 验证PathVarible
@RequestMapping("checkPvb/{kgcName}")
public String checkPathVb(
@PathVariable(value="kgcName")String kgcName){
System.out.println(kgcName);
return "success";
}
@ModelAttribute("dataKey")
public StudentModel initData(){
StudentModel student = new StudentModel();
student.setStudentId(15);
student.setStudentName("zhangsan");
return student;
}
@RequestMapping("/getData.do")
public String getModelData(@ModelAttribute("dataKey")StudentModel student){
System.out.println("model中的参数是"+student);
return "success";
}
@RequestMapping("/getFormData.do")
public String getFormData(@ModelAttribute("class")ClassModel clazz){
System.out.println("获取的表单对象是"+clazz);
return "success";
}
}