接下来学习SpringMVC的数据绑定,本篇主要介绍SpringMVC数据绑定的原理及如何使用。那么什么是数据绑定呢?如果之前学过Vue等框架时,就应该不陌生了,但是可能此处的效果和Vue中的有些区别。此处的数据绑定是指:将Http请求中的参数绑定到Handler业务方法中作为参数。

在没有接触SpringMVC之前,你还会发现servlet中的doGet或者doPost方法中都会有httpRequest和httpResponse,同时由于从request中获取的数据类型都是String类型,因此如果需要获取Integer类型,还需要进一步的转换。遇到前台form表单的时候,需要借助于request.getParameter("name属性值")来逐一获取信息,然后在业务方法中将这些参数封装成一个对象,其实这个过程挺复杂的。

在入门章节里面就说明使用SpringMVC,只需在业务方法中定义对应的形参即可(如需要获取Integer类型的Id,只需在形参中定义Integer类型的Id即可),SpringMVC会自动将httpRequest请求中的参数取出来并绑定到业务方法的形参当中。

SpringMVC数据绑定流程原理

SpringMVC常用的数据绑定类型

SpringMVC常用的数据绑定类型包括:基本数据类型、包装类、数组、对象、集合(List/Set/Map)以及JSON。接下来通过代码的方式分别介绍各种数据类型应当如何绑定,使用Maven新建一个webapp项目,名称为springmvc_databind。第一步,配置pom.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<dependencies>
<!--springmvc相关-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>

<!--servlet相关-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

<!--jstl标签库-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<!--Junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

第二步,配置web.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--处理中文乱码-->
<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>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!--让SpringMVC放开css访问控制,设置访问静态资源-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<!--让SpringMVC放开js访问控制,设置访问静态资源-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>


<!--所有的请求都会被SpringMVC进行拦截-->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置SpringMVC文件所在的位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

第三步,配置springmvc.xml文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!--开启包自动扫描-->
<context:component-scan base-package="com.envy"></context:component-scan>

<!--配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--配置前缀-->
<property name="prefix" value="/"></property>
<!--配置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>

第四步,新建对应的文件夹,如图所示:

基本数据类型

基本数据类型以int类型为例,在controller包中新建一个DataBindController类,接着定义一个baseType方法(在里面使用了@ResponseBody这个注解就是将返回的对象转换为json格式的字符串,并通过response响应给客户端):

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class DataBindController {

@Autowired
private CourseDao courseDao;

//基本数据类型,以int为例
@RequestMapping(value = "/baseType")
@ResponseBody //@ResponseBody这个注解就是将返回的对象转换为json格式的字符串,并通过response响应给客户端
public String baseType(@RequestParam(value = "id")int id){
return "this baseType id is "+id;
}
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/baseType?id=1,你会发现页面显示this baseType id is 1;注意参数只能是int类型,如果传入id="abc",访问http://localhost/baseType?id=abc,会报400参数异常; 还有当设置参数为int类型时,那么key是必传的,如果不传入,访问http://localhost:8080/baseType?id,会报500内部错误异常。

包装类类型

包装类类型以Integer类型为例,新建packageType方法:

1
2
3
4
5
6
//包装类,以Integer为例
@RequestMapping(value = "/packageType")
@ResponseBody
public String packageType(@RequestParam(value = "id")Integer id){
return "this packageType id is "+id;
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/packageType?id=1,你会发现页面显示this packageType id is 1;注意参数只能是int类型,如果传入id="abc",访问http://localhost/packageType?id=abc,会报400参数异常; 还有当设置参数为Integer类型时,那么key是可以不传的,如果不传入,访问http://localhost:8080/packageType?id,页面显示this packageType id is nul。因为包装类本质上是一个对象,对于可能为空的数据,最好使用包装类型。还有一点就是int型的默认值为0,Integer的默认值为null,如果数据库某字段允许NULL值,使用int型的话,存入的是0而不是NULL。

数组类型

数组类型,以String类型的数组为例,新建arrayType方法:

1
2
3
4
5
6
7
8
9
10
 //数组类型,以String类型的数组为例
@RequestMapping(value = "/arrayType")
@ResponseBody
public String arrayType(String[] name){ //此处的name即为参数的名称
StringBuffer stringBuffer = new StringBuffer();
for(String item:name) {
stringBuffer.append(item).append(" ");
}
return stringBuffer.toString();
}

本方法就是将name数组中的信息依次添加到一个新的字符串中,然后运行项目,在浏览器地址栏中输入http://localhost:8080/arrayType?name=zhangsan&name=lisi,你会发现页面显示zhangsan lisi ;注意此处必须是name为键的键值对。SpringMVC可以将同一个字段key的多个值映射到一个数组中,那自然也能映射到List中。将参数String[] name改成List<String> name,完全没问题。

对象及多层级对象

对象以及多层级对象比前面的稍微复杂一些,我们以讲师和课程为例进行介绍。第一步,在entity包中新建Course.javaAuthor.java文件:

1
2
3
4
5
6
7
8
9
10
**************Course.java***********
private int id;
private String name;
private double price;
private Author author;
//setter和getter方法
**************Author.java***********
private int id;
private String name;
//setter和getter方法

第二步,新建add.jsp页面(注意action="pojoType",这是表单提交后交由哪个Servlet去处理的,也就是后面controller中方法的访问路径,当然一般路径和名称是一致的,因此也就是后面的方法名称):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>add</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
body{
overflow-x:hidden;
}
#main{
width:1200px;
height:600px;
margin-left:500px;
}
</style>
</head>
<body>

<div id="main">
<!-- 标题 -->
<div class="row">
<div class="col-md-12">
<h1>添加课程</h1>
</div>
</div>

<form class="form-horizontal" role="form" action="pojoType" method="post">
<div class="form-group">
<label class="col-sm-1 control-label">课程编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="id" placeholder="请输入课程编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="name" placeholder="请输入课程名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="price" placeholder="请输入课程价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="author.id" placeholder="请输入讲师编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="author.name" placeholder="请输入讲师姓名">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
</div>
</body>
</html>

第三步,在dao包中新建CourseDao.java类,这个类用于保存用户提交的信息,类似于数据库的作用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.envy.dao;

import com.envy.entity.Course;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@Repository
public class CourseDao {
//使用Map来替代数据库
private Map<Integer, Course> courses = new HashMap<>();

//将pojoType方法中传递的model保存到map中
public void add(Course course){
courses.put(course.getId(), course);
}

//将map中所有的信息进行返回
public Collection<Course> getAll(){
return courses.values();
}
}

第四步,新建index.jsp页面,用于展示所添加的信息(注意只要后面所有方法中返回的ModelAndView中添加的对象名称是courses,那么本页面可作为公共页面使用):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>课程列表</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

<!-- 标题 -->
<div class="row">
<div class="col-md-12">
<h1>课程管理</h1>
</div>
</div>
<!-- 显示表格数据 -->
<div class="row">
<div class="col-md-12">
<table class="table table-hover" id="emps_table">
<thead>
<tr>
<th>
<input type="checkbox" id="check_all"/>
</th>
<th>编号</th>
<th>课程名</th>
<th>价格</th>
<th>讲师</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${courses}" var="course">
<tr>
<td><input type='checkbox' class='check_item'/></td>
<td>${course.id}</td>
<td>${course.name}</td>
<td>${course.price}</td>
<td>${course.author.name}</td>
<td>
<button class="btn btn-primary btn-sm edit_btn">
<span class="glyphicon glyphicon-pencil">编辑</span>
</button>&nbsp;&nbsp;
<button class="btn btn-danger btn-sm delete_btn">
<span class="glyphicon glyphicon-trash">删除</span>
</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>

</div>
</body>
</html>

第五步,新建pojoType方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
//对象,以课程和讲师为例
@RequestMapping(value = "/pojoType")
public ModelAndView pojoType(Course course){
//保存前端页面提交信息
courseDao.add(course);
//装载模型数据和视图解析
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("courses", courseDao.getAll());
//设置视图名称
modelAndView.setViewName("index");
return modelAndView;
}

SpringMVC可以将表单的字段与Controller方法参数中对象的属性进行映射,前提是两者的名称和类型一致。比如表单中传入name=ssm&price=100,方法参数中的Course对象也恰好有String namedouble price属性,SpringMVC将完成字段 –> 对象属性的映射并将数据绑定到Cours对象的对应属性上。SpringMVC将我们输入字段的类型、名称与方法参数中User对象中的属性一一对比,如果吻合将会自动映射过去并封装成对象,如果某些字段和对象的属性不能匹配,那么封装成的对象中该属性为null。

然后运行项目,在浏览器地址栏中输入http://localhost:8080/add.jsp,填写课程信息后提交发现url变为http://localhost:8080/pojoType,同时将你刚才添加的课程信息进行了展示。

List

List类型,注意Controller中的方法内不能直接传参数List<Course> courses,因为它无法完成绑定(只能绑定单一类),只能借助于包装类,在包装类中定义List集合的属性,然后给这个包装类的属性进行绑定。

第一步,新建CourseList类,并将List<Course> courses设置为它的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.envy.entity;

import java.util.List;

public class CourseList {
private List<Course> courses; //属性名称

public List<Course> getCourses() {
return courses;
}

public void setCourses(List<Course> courses) {
this.courses = courses;
}
}

第二步,新建addList.jsp页面(注意表单中的字段应如何设置,前面说过是字段与其属性进行关联,我们给CourseList类设置的属性为courses,它是一个List,但是我们可以通过下标来完成对象的获取,第一个为courses[0],依次类推。对于课程讲师的属性设置需要使用courses[0].author来获取):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>add</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<style type="text/css">
body{
overflow-x:hidden;
}
#main{
width:1200px;
height:600px;
margin-left:500px;
}
</style>
</head>
<body>

<div id="main">
<!-- 标题 -->
<div class="row">
<div class="col-md-12">
<h1>添加课程</h1>
</div>
</div>

<form class="form-horizontal" role="form" action="listType" method="post">
<!--第一个课程-->
<div class="form-group">
<label class="col-sm-1 control-label">课程1编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[0].id" placeholder="请输入课程1编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程1名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[0].name" placeholder="请输入课程1名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程1价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[0].price" placeholder="请输入课程1价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[0].author.id" placeholder="请输入讲师1编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[0].author.name" placeholder="请输入讲师1姓名">
</div>
</div>

<!--第二个课程-->

<div class="form-group">
<label class="col-sm-1 control-label">课程2编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[1].id" placeholder="请输入课程2编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程2名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[1].name" placeholder="请输入课程2名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程2价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[1].price" placeholder="请输入课程2价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[1].author.id" placeholder="请输入讲师2编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="courses[1].author.name" placeholder="请输入讲师2姓名">
</div>
</div>


<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
</div>
</body>
</html>

第三步,新建listType方法(注意后面遍历的是courseList中的属性即List对象,不是courseList本身):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RequestMapping(value = "/listType")
public ModelAndView listType(CourseList courseList){
//注意这里遍历的是courseList中的属性即List对象,不是courseList本身
for(Course course:courseList.getCourses()){
//保存前端页面提交信息
courseDao.add(course);
}
//装载模型数据和视图解析
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("courses", courseDao.getAll());
//设置视图名称
modelAndView.setViewName("index");
return modelAndView;
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/addList.jsp,填写课程信息后提交发现url变为http://localhost:8080/listType,同时将你刚才添加的课程信息进行了展示。

Map

Map类型,注意Controller中的方法内不能直接传参数Map<String,Course> courseMap,因为它无法完成绑定(只能绑定单一类),只能借助于包装类,在包装类中定义Map集合的属性,然后给这个包装类的属性进行绑定。

第一步,新建CourseMap类,并将Map<String,Course> courseMap设置为它的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.envy.entity;

import java.util.Map;

public class CourseMap {
private Map<String,Course> courseMap; //属性名称

public Map<String, Course> getCourseMap() {
return courseMap;
}

public void setCourseMap(Map<String, Course> courseMap) {
this.courseMap = courseMap;
}
}

第二步,新建addMap.jsp页面,这个页面和addList.jsp页面非常相似,只有对象获取的方式不同。对于List对象可以通过下标来完成对象的获取,第一个为courses[0],但是对于Map对象不能使用该方法,可以courseMap['one']courseMap['two']等方式。

第三步,新建mapType方法(注意后面遍历的是courseMap中的属性即Map对象,不是courseMap本身):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@RequestMapping(value = "/mapType")
public ModelAndView mapType(CourseMap courseMap){
//注意这里遍历的是courseMap中的属性即Map对象,不是courseMap本身
for(String key:courseMap.getCourseMap().keySet()){
Course course = courseMap.getCourseMap().get(key);
courseDao.add(course);
}
//装载模型数据和视图解析
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("courses", courseDao.getAll());
//设置视图名称
modelAndView.setViewName("index");
return modelAndView;
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/addMap.jsp,填写课程信息后提交发现url变为http://localhost:8080/mapType,同时将你刚才添加的课程信息进行了展示。

Set

Set类型,注意Controller中的方法内不能直接传参数Set<Course> courseSet,因为它无法完成绑定(只能绑定单一类),只能借助于包装类,在包装类中定义Set集合的属性,然后给这个包装类的属性进行绑定。

第一步,新建courseSet类,并将Set<Course> courseSet设置为它的属性,同时注意SpringMVC绑定set时必须初始化set且必须有两个对象,如果没有则报500错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.envy.entity;

import java.util.HashSet;
import java.util.Set;

public class CourseSet {
private Set<Course> courseSet = new HashSet<>(); //属性名称

public Set<Course> getCourseSet() {
return courseSet;
}

public void setCourseSet(Set<Course> courseSet) {
this.courseSet = courseSet;
}

//注意set中必须有两个对象,否则无法完成绑定
public CourseSet(){
courseSet.add(new Course());
courseSet.add(new Course());
}
}

第二步,新建addSet.jsp页面,这个页面和addList.jsp页面非常相似,对象获取的方式也是通过下标来完成对象的获取,第一个为courseSet[0],以此类推。

第三步,新建setType方法(注意后面遍历的是courseSet中的属性即Set对象,不是courseSet本身):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@RequestMapping(value = "/setType")
public ModelAndView setType(CourseSet courseSet){
//注意这里遍历的是courseSet中的属性即Set对象,不是courseSet本身
for(Course course:courseSet.getCourseSet()){
courseDao.add(course);
}
//装载模型数据和视图解析
ModelAndView modelAndView = new ModelAndView();
//添加模型数据
modelAndView.addObject("courses", courseDao.getAll());
//设置视图名称
modelAndView.setViewName("index");
return modelAndView;
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/addSet.jsp,填写课程信息后提交发现url变为http://localhost:8080/setType,同时将你刚才添加的课程信息进行了展示。

JSON格式

JSON格式,注意方法此时不需要通过视图解析,直接返回Json格式。SpringMVC无法完成json数据类型的绑定,但是可以借助于jackson-bind完成绑定。需要两个步骤:第一步,先导入jackson-bind的Maven依赖:

1
2
3
4
5
6
<!--添加jackson用于完成SpringMVC数据绑定json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>

第二步,在springmvc.xml中配置消息转换器,只有这两步才能将http请求参数转换成jso格式

1
2
3
4
5
6
<!--配置json转换器-->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>

接着通过一个json.jsp页面来模仿数据交互(使用ajax通过post方式发送数据):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>json类型数据绑定</title>
</head>
<body>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function () {
var course = {
id: "2",
name: "SpringMVC数据绑定",
price: "188"
};
$.ajax({
url:"jsonType",
data:JSON.stringify(course),
type:"post",
contentType: "application/json;charset=UTF-8",
dataType:"json",
success:function (data) {
alert(data.name+"-----"+data.price)
}
})
})
</script>
</body>
</html>

最后新建jsonType方法(这个方法仅仅对ajax发送过来的数据中的价格进行了加100操作,然后又以json形式进行了返回,注意需要使用@RequestBody这个注解用来接收前端传递给后端的json字符串中的数据(即请求体中的数据);):

1
2
3
4
5
6
7
8
//JSON,注意此时不需要通过视图解析,直接返回JSOn格式
//需要使用@RequestBody这个注解,这个注解主要用来接收前端传递给后端的json字符串中的数据(请求体中的数据);
@RequestMapping(value = "/jsonType")
@ResponseBody
public Course jsonType(@RequestBody Course course){
course.setPrice(course.getPrice()+100);
return course;
}

然后运行项目,在浏览器地址栏中输入http://localhost:8080/json.jsp,回车后立即发现url变为http://localhost:8080/jsonType,同时将价格进行加100操作后,弹出显示了288。

那么关于SpringMVC中的数据绑定就先介绍到这里,后续会退出一篇更完整的,同时也是基于Restlet Client,那样的话就不再出现jsp页面,可能效果会更好一些。