示例 @RequestBody接收JSON格式的数据 创建一个RequestBodyTest
项目,在WebContent
目录下创建一个js
目录,加入jQuery
和json2
的js
文件,在WEB-INF/lib
目录中加入Jackson
的jar
文件。
index.jsp 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 <%@ 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)); } }
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 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 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
方法用来输出获取的数据对象信息.
1 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
接收到请求后,@Request body
注解会将接收到的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
即可。
原文链接: 示例 @RequestBody接收JSON格式的数据