示例 @RequestBody接收JSON格式的数据
创建一个RequestBodyTest
项目,在WebContent
目录下创建一个js
目录,加入jQuery
和json2
的js
文件,在WEB-INF/lib
目录中加入Jackson
的jar
文件。
项目结构
展开/折叠
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
| D:\Desktop\随书源码\Spring+Mybatis企业应用实战(第2版)\codes\03\RequestBodyTest ├─src\ │ └─org\ │ └─fkit\ │ ├─controller\ │ │ └─BookController.java │ └─domain\ │ └─Book.java └─WebContent\ ├─index.jsp ├─js\ │ ├─jquery-1.11.0.min.js │ ├─jquery-migrate-1.2.1.min.js │ └─json2.js ├─META-INF\ │ └─MANIFEST.MF └─WEB-INF\ ├─lib\ │ ├─commons-logging-1.2.jar │ ├─jackson-annotations-2.9.2.jar │ ├─jackson-core-2.9.2.jar │ ├─jackson-databind-2.9.2.jar │ ├─spring-aop-5.0.1.RELEASE.jar │ ├─spring-aspects-5.0.1.RELEASE.jar │ ├─spring-beans-5.0.1.RELEASE.jar │ ├─spring-context-5.0.1.RELEASE.jar │ ├─spring-context-indexer-5.0.1.RELEASE.jar │ ├─spring-context-support-5.0.1.RELEASE.jar │ ├─spring-core-5.0.1.RELEASE.jar │ ├─spring-expression-5.0.1.RELEASE.jar │ ├─spring-instrument-5.0.1.RELEASE.jar │ ├─spring-jcl-5.0.1.RELEASE.jar │ ├─spring-jdbc-5.0.1.RELEASE.jar │ ├─spring-jms-5.0.1.RELEASE.jar │ ├─spring-messaging-5.0.1.RELEASE.jar │ ├─spring-orm-5.0.1.RELEASE.jar │ ├─spring-oxm-5.0.1.RELEASE.jar │ ├─spring-test-5.0.1.RELEASE.jar │ ├─spring-tx-5.0.1.RELEASE.jar │ ├─spring-web-5.0.1.RELEASE.jar │ ├─spring-webflux-5.0.1.RELEASE.jar │ ├─spring-webmvc-5.0.1.RELEASE.jar │ └─spring-websocket-5.0.1.RELEASE.jar ├─springmvc-config.xml └─web.xml
|
index.jsp
RequestBodyTest\WebContent\index.jsp1 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
| <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>测试接收JSON格式的数据</title> <script type="text/javascript" src="js/jquery-1.11.0.min.js"></script> <script type="text/javascript" src="js/json2.js"></script> <script type="text/javascript"> $(document).ready(function() { testRequestBody(); }); function testRequestBody() { $.ajax( "${pageContext.request.contextPath}/json/testRequestBody", { dataType : "json", type : "post", contentType : "application/json", data : JSON.stringify({ id : 1, name : "一本书的名字" }), async : true, success : function(data) { console.log(data); $("#id").html(data.id); $("#name").html(data.name); $("#author").html(data.author); }, error : function() { alert("数据发送失败"); } }); } </script> </head> <body> 编号: <span id="id"></span> <br> 书名: <span id="name"></span> <br> 作者: <span id="author"></span> <br> </body> </html>
|
index.jsp
页面代码分析如下:
(1)页面使用jQuery
发送JSON
数据,在页面的<head>
部分,引入了jQuery
和json2
的js
文件。
(2)页面载入时调用testRequestBody
函数。
(3)testRequestBody
函数的
- 第一个参数表示要请求的
URL
是:"json/testRequestBody"
,
- 第二个参数是这次请求相关的一些设置选项,这些选项解释如下:
contentType
选项:contentType:"application/json",
,其表示发送的内容编码格式为JSON
data
选项:data : JSON.stringify({id : 1,name : "一本书的名字"}),
表示发送一个JSON
数据;
success
选项表示:如果请求成功则将接到的JSON
数据设置到页面的<span>
当中
BookController.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 25 26 27 28 29 30 31 32 33 34
| package org.fkit.controller;
import javax.servlet.http.HttpServletResponse; import org.fkit.domain.Book; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import com.fasterxml.jackson.databind.ObjectMapper;
@Controller @RequestMapping("/json") public class BookController { @RequestMapping(value = "/testRequestBody") public void setJson(@RequestBody Book book, HttpServletResponse response) throws Exception { ObjectMapper mapper = new ObjectMapper(); System.out.println(mapper.writeValueAsString(book)); book.setAuthor("小明"); response.setContentType("text/html;charset=UTF-8"); response.getWriter().println(mapper.writeValueAsString(book)); } }
|
setJson
方法中的
- 第一个参数
@RequestBody Book book
表示,使用@RequestBody
注解获取JSON
数据后,将JSON
数据设置到对应的Book
对象的属性当中。
- 第二个参数是
HttpServletResponse
对象,用来输出响应数据到客户端。
向前台JSP
页面的JSON
数据中传入了id
和name
,为了测试接收数据,使用System.out.println(mapper.writeValueAsString(book));
代码将接收到的JSON
数据中的book
对象打印在控制台上。
为了测试传递数据到JSP
页面,在该方法中还给book
对象的author
对象设置了个值,并将其写出到客户端.
Book.java
RequestBodyTest\src\org\fkit\domain\Book.java1 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
| package org.fkit.domain;
import java.io.Serializable;
public class Book implements Serializable { private static final long serialVersionUID = 1L; private Integer id; private String name; private String author; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book [id=" + id + ", name=" + name + ", author=" + author + "]"; } }
|
在Book
类中定义了3个属性:id
、name
和author
,用于接收向JSP
页面传入的JSON
数据toString
方法用来输出获取的数据对象信息.
springmvc-config.xml
RequestBodyTest\WebContent\WEB-INF\springmvc-config.xml1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <?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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 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-4.3.xsd">
<context:component-scan base-package="org.fkit.controller" /> <mvc:annotation-driven /> <mvc:default-servlet-handler /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/content/" p:suffix=".jsp" /> </beans>
|
在引入静态文件,例如jQuery.js
时,需要加入<mvc:default-servlet-handler />
从而使用默认的Servlet
来响应静态文件。如果没有加入该配置,则执行时页面会报404错误,而控制台会提出警告:
测试
部署RequestBodyTest
这个Web
应用,在浏览器中输入如下URL
来测试应用:
1
| http://localhost:8080/RequestBodyTest/
|
载入index.jsp
页面时会发送Ajax
请求,并传递JSON
数据, BookController
接收到请求后,@RequestBody
注解会将接收到的JSON
数据设置到Book
形式参数对应的属性当中。控制台输出如下:
1
| {"id":1,"name":"一本书的名字","author":null}
|
可以看到,JSON
数据传递的id
和name
被赋值到Book
对象的属性中。接下来, setJson
方法给Book
对象的author
属性设置了值,并将Book
对象转换成JSON
写出到客户端。
此时客户端显示效果如下:
1 2 3
| 编号: 1 书名: 一本书的名字 作者: 小明
|
这表示Spring MVC
成功将Book
对象被以JSON
数据格式成功写到客户端了。
个人总结
使用JSON
交换的步骤:
- 使用
jQuery
发送ajax
请求,并将数据以JSON
格式发送.
- 引入
Jackson
的jar
包,使用@RequstBody
接收数据,该注解可以解析请求体中的JSON
数据,并设置到其后面的对象上。
- 使用
Jackson
包中的ObjectMapper
对象.writeValueAsString(Java对象)
方法,将Java
对象转为JSON
字符串.
- 使用
HttpServletResponse
写到客户端即可.
- 使用
jQuery
根据接收到的JSON
数据操作DOM
即可。