在使用SpringMVC创建web应用时,需要将界面的控件的元素的属性将后台基本类型或对象属性进行绑定,从而实现界面与后台的一个交互。因此,这是在学习使用SpringMVC完成web开发过程中一个比较重要的知识点。本文只介绍数据的绑定,至于创建相应的项目或者完成相应的配置,可以看前面的博客。
1.基本类型的绑定
我们都知道Java数据类型中有八大基本类型,这八大基本类型的绑定特点都是一致的,都需要明确的指出key/value值。例如,我们使用int来做一个实例,写下如下方法:
//基本类型绑定,必须输入相应的key/value值
//http://localhost:8080/SpringMVCDataBind/type?num=12 可行:num:12
//http://localhost:8080/SpringMVCDataBind/type? 不可行,报错
@RequestMapping(value="type")
@ResponseBody
public String type(int num)
{
return "num:"+num;
}
首先需要用@RequestMapping(value="")来注解,其中value的值表示子路径uri,而@ResponseBody注释则表示该结果显示在ResponseBody区域中。由上面的注释中可以看出,同时又key=value形式时,会输出相应结果,否则报错。
2.包装类型的绑定
基本类型对应的包装类型的绑定稍有不同,由于String类型的绑定与包装类型的绑定特点一致,所以放在一起讲解。接下来举一个Double包装类和String类型的例子,如下所示:
//包装类型数据绑定,输入url时,可以不输入key/value值
//http://localhost:8080/SpringMVCDataBind/wrapperType? 可行,输出:d:null
//http://localhost:8080/SpringMVCDataBind/wrapperType?3.14 可行,输出:d:null
//http://localhost:8080/SpringMVCDataBind/wrapperType?d=3.14 可行,输出d:3.14
@RequestMapping(value="wrapperType")
@ResponseBody
public String wrapperType(Double d)
{
return "d:"+d;
}
//String类型绑定与包装类型绑定一致
//http://localhost:8080/SpringMVCDataBind/stringType?abc 可行,输出:s:null
//http://localhost:8080/SpringMVCDataBind/stringType?s=abc 可行,输出:s:abc
@RequestMapping(value="stringType")
@ResponseBody
public String stringType(String s)
{
return "s:"+s;
}
可以输入url来进行验证:
3.数组类型的绑定
数组绑定,与基本类型绑定的不同在于,数组名作为key值可能被用多次,并被赋予value值,每一对key/value之间用&符号连接,示例如下:
//数组类型的绑定,将数组名作为key值,并赋予value值,每对key/value之间用&符号连接
//http://localhost:8080/SpringMVCDataBind/arrayType?array=abc&array=cde&array=efg&array=fgh
@RequestMapping(value="arrayType")
@ResponseBody
public String arrayType(String[] array)
{
StringBuffer sBuffer=new StringBuffer();
for(String s:array)
{
sBuffer.append(s).append(" ");
}
return sBuffer.toString();
}
输入相应的url得到如下结果:
4.对象类型的绑定
如果是简单对象的绑定,则是只需要将对相应的属性赋值即可,如果没有赋值,数字类型默认为0,字符串类型默认为null。以下是一个Student类,只有name,uid两个属性,所以只需要直接赋值即可。
public class Student {
public String name;
public int uid;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
@Override
public String toString() {
return "Student [name=" + name + ", uid=" + uid + "]";
}
}
具体绑定如下:
//对象类型的绑定
//http://localhost:8080/SpringMVCDataBind/studentType?name=carson&uid=10086 Student [name=carson, uid=10086]
@RequestMapping(value="studentType")
@ResponseBody
public String studentType(Student student)
{
return student.toString();
}
5.list类型的绑定
现在介绍的是list类型的绑定,它的绑定可能之前那些类型的绑定较复杂。需要对list的名称作为一个数组类型的名称,并对其下标对应参数赋值,并且list类型是赋值开辟空间型的,即如果一个list名为a,a[0]=1,则说明开辟了一个地址空间。接下来的示例是对Student元素的list数组。
import java.util.*;;
public class StudentList {
List<Student> students;
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
@Override
public String toString() {
return "StudentList [students=" + students + "]";
}
}
以下是绑定代码:
//list类型的绑定
//http://localhost:8080/SpringMVCDataBind/listType?students[0].name=carson&students[0].uid=10000&students[1].name=alice&students[1].uid=10010
//输出:list size:2 list contents:StudentList [students=[Student [name=carson, uid=10000], Student [name=alice, uid=10010]]]
@RequestMapping(value="listType")
@ResponseBody
public String listType(StudentList list)
{
return "list size:"+list.getStudents().size()+" list contents:"+list.toString();
}
6.set类型绑定
set的绑定与list的绑定很相似却又有大不同,前面说过list是在赋值时开辟空间,而set类型需要在初始化时便申明开辟空间,否则无法正常绑定。两者相似的地方就是赋值的时候差不多相同。
以下创建一个元素为Student类型的set类:
import java.util.LinkedHashSet;
import java.util.Set;
public class StudentSet {
Set<Student> students;
public StudentSet()
{
students=new LinkedHashSet<>();
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 "StudentSet [students=" + students + "]";
}
}
具体绑定示例如下:
//set类型的绑定
//http://localhost:8080/SpringMVCDataBind/setType? 输出:list size:2 list contents:StudentSet [students=[Student [name=null, uid=0], Student [name=null, uid=0]]]
//http://localhost:8080/SpringMVCDataBind/setType?students[0].name=Tom&students[1].name=Jack&students[0].uid=10010
//输出:list size:2 list contents:StudentSet [students=[Student [name=Tom, uid=10010], Student [name=Jack, uid=0]]]
@RequestMapping(value="setType")
@ResponseBody
public String setType(StudentSet list)
{
return "list size:"+list.getStudents().size()+" list contents:"+list.toString();
}
说到这里,我们来比较一下list和set的区别:
首先,list不需要初始化,而set需要初始化,并且需要申明元素个数。如下图所示:
比较以下两种情况可以看出,不对set赋值,但仍有元素,是因为初始化时开辟的空间元素个数;只有对list赋值,才会开辟空间。注意,可以对set不赋值,但如果对list不赋值会报错。
其次,就是连续开辟空间的能力,list具有连续开辟空间的能力,而set初始化之后空间便已经定了。如图所示:
以下可以看出,list开辟空间取决于赋值下标的最大值,而set赋值下标的最大值取决于初始化的元素个数大小。
7.map类型绑定
map类型的赋值与list有相似之处,只不过list赋值的下标是整数,而map是键值。以下是Map值为Student类型的类:
import java.util.Map;
public class StudentMap {
Map<String, Student> students;
public Map<String, Student> getStudents() {
return students;
}
public void setStudents(Map<String, Student> students) {
this.students = students;
}
@Override
public String toString() {
return "StudentMap [students=" + students + "]";
}
}
以下是map数据绑定的实例:
//http://localhost:8080/SpringMVCDataBind/mapType?students['x'].name=Carson&students['x'].uid=10010&students['Y'].name=Alice&students['Y'].uid=10000
//输出:mapsize:2 mapcontet:StudentMap [students={Y=Student [name=Alice, uid=10000], x=Student [name=Carson, uid=10010]}]
//注意:map赋值时,key值中的引号使用单引号,否则报错。
@RequestMapping(value="mapType")
@ResponseBody
public String MapType(StudentMap map)
{
return "mapsize:"+map.getStudents().size()+" mapcontet:"+map.toString();
}
测试:
需要注意的是,如果key值为string类型的,引号用单引号表示,否则会报错。
以上便是一些基本类型包装类以及一些常见数据结构的数据绑定。