提升自己,想进入大型互联网公司。欢迎关注我的微信公众号 ,搜索微信公众号:"一起写程序" ,会分享系列文章,希望大家能一起学习。
目录
问题1)方法参数选择Integer包装类还是int类型?... 1
问题)数据绑定?
前端输入和后端的数据对应。
问题1)方法参数选择Integer包装类还是int类型?
- 如果参数使用int非封装类型,而不传值,就报500错误。
@Controller
@RequestMapping("/test/")
public class test {
@RequestMapping("check.do")
@ResponseBody
public String check(int age){
return "age:"+age;
}
}
- 使用Integer类型,就不需要必须传值。
默认值是null。
@RequestMapping("check01.do") @ResponseBody public String check01(Integer age){ return "age:"+age; }
- 使用int作为参数类型,也可以用@RequestParam,设置默认值。
RequestParam有3个参数: value是别名,defaultValue是默认值,required是否必须传入值默认为true是必须传值。
@Controller @RequestMapping("/test/") public class test { @RequestMapping("check.do") @ResponseBody public String check(@RequestParam(value = "age",defaultValue = "0",required = false) int age){ return "age:"+age; } }
问题2)数组的数据绑定?
/** * 不传值会报错。 *http://localhost:8088/test/array.do?name=jia&name=cui */ @RequestMapping("array.do") @ResponseBody public String arrays(String [] name){ StringBuilder stringBuilder = new StringBuilder(); for (String item : name){ stringBuilder.append(item).append(" "); } return stringBuilder.toString(); }
问题3)简单对象绑定,和多层对象绑定?
/** * 传入简单对象。user对象中不包含info参数。 * http://localhost:8088/test/user.do?name=jia&age=10 */ @RequestMapping("user.do") @ResponseBody public String user(user user){ return user.toString(); } /** * 传入多个对象,user对象包含info对象。 *http://localhost:8088/test/users.do?name=jia&age=10&info.phone=12345&info.add=%E5%8C%97%E4%BA%AC */ @RequestMapping("users.do") @ResponseBody public String users(user use){ return use.toString(); }
问题4)多对象,相同的参数名称?
* 1,如果 不用bind绑定。通过 use.name & adm.name ,都不会赋值,都为null.
* http://localhost:8088/test/auser.do?use.name=jia&age=10&adm.name=kkk
*2,使用@InitBinder,可以实现多对象,相同参数。
http://localhost:8088/test/auser.do?use.age=10&adm.age=4
*/ @RequestMapping("auser.do") @ResponseBody public String douUser(user use,admin adm){ return use.toString()+adm.toString(); } @InitBinder("user") public void initUser(WebDataBinder binder){ binder.setFieldDefaultPrefix("use."); } @InitBinder("admin") public void initAdmin(WebDataBinder binder){ binder.setFieldDefaultPrefix("adm."); }
问题5)list的数据绑定?
Springmvc收集数据要有指定的对象。通过对象的下一级直接赋值。
例如user对象中有一个name属性,url中直接使用name = 值就好,只有多个对象的时候才会加类名。
/** * 注意: * 1,list接收的时候,得有一个接收对象,参数不能是List<user> user。而是要自定义的userList * 2,传入的参数数组下标要连续,不连续的数据会被传入null这样会连服资源。 * http://localhost:8088/test/listuser.do?user[0].name=jia&user[1].name=shaokun * * 1,在输入的时候,数组的地址要连续,要不然会产生很多空的对象。 * http://localhost:8088/test/listuser.do?user[0].name=jia&user[5].name=shaokun */ @RequestMapping("listuser.do") @ResponseBody public String listUser(userList userlist){ return userlist.toString(); }
自定义接收前端数据的list.不能用List<user>直接接收前端的数据。
public class userList { private List<user> user; public List<com.mall.common.user> getUser() { return user; } public void setUser(List<com.mall.common.user> user) { this.user = user; } @Override public String toString() { return "userList{" + "user=" + user + '}'; } }
问题6)set数据的绑定?
Set的是使用:
- set需要先初始化,list不需要先初始化。没有初始化会抛出异常。
- set主要的用途就是去除重复的对象或数据。
- 一般使用set就需要重写比较对象的equal和hashcode方法。
- 如果使用的set集合下标越界,也会报错。初始化多少个,就用多少个set.
- 当重写了equal和hashcode方法,直接在set中添加,new 对象。如果对象相等,会只保留一份。
- 传入两个参数会报错,因为下面的创建两个对象创建的时候是直接new student()。
http://localhost:8088/test/set.do?students[0].name=jia&students[1].name=shaokun
7,传入一个参数才是正确的。
http://localhost:8088/test/set.do?students[0].name=jia
- @RequestMapping("set.do") @ResponseBody public String setStudent(userSet userset){ return userset.toString(); }
接收前端数据集合:
public class userSet { private Set<student> students; /** * 因为set需要初始化。超过下标会报错。 */ private userSet(){ students = new LinkedHashSet<student>(); students.add(new student()); students.add(new student()); } public Set<student> getStudents() { return students; } public void setStudents(Set<student> students) { this.students = students; } @Override public String toString() { return "userSet{" + "students=" + students + '}'; } }
public class student { String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "student{" + "name='" + name + '\'' + ", age=" + age + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; student student = (student) o; if (age != student.age) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; return result; } }
问题7)map的数据绑定?
1,map是做键值对的,前端可以传入键值对方式。
/** * * http://localhost:8088/test/map.do?map['x'].name=jia&map['x'].age=10 */ @RequestMapping("map.do") @ResponseBody public String mapStudent(userMap map){ return map.toString(); }
public class userMap { Map<String,student> map; public Map<String, student> getMap() { return map; } public void setMap(Map<String, student> map) { this.map = map; } @Override public String toString() { return "userMap{" + "map=" + map + '}'; } }