目录:
- 1.JSON 数据交互
- 1.1 JSON概述
- 1.2 JSON的“数据结构”
- 对象结构
- 数组结构
- 1.3 JSON的“数据转换” (JSON交互)
作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!
该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!(侵权可联系我,进行删除,如果雷同,纯属巧合)
SpringMVC 在数据绑定的过程中,需要对传递数据的格式和类型进行转换,它既可以转换String 类型的数据,也能够转换 JSON 等其他类型的数据。
1.JSON 数据交互
JSON 是近几年才流行的一种新的数据格式,它与 XML 非常相似,都是用于存储数据的;但 JSON 相对于 XML来说,解析速度更快,占用空间更小。因此在实际开发中,使用JSON 格式的数据进行前后台的数据交互是很常见的。
1.1 JSON概述
JSON ( JavaScript Object Notation ,JS对象标记 ) 是一种 轻量级 的 数据交换格式 。它是 基于 JavaScript 的一个 子集 ( JSON 是 JavaScript 的子集 ),使用了 C、C++、C#、Java、JavaScript、Perl、Python 等其他语言的约定,采用 完全独立于编程语言的文本格式来存储和表示数据。这些特性使 JSON 成为理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成。
与 XML 一样,JSON 也是基于纯文本的数据格式。可以使用 JSON 传输一个简单的String、Number、Boolean,也可以传输一个数组或者一个复杂的 Object 对象。
1.2 JSON的“数据结构”
JSON 有如下 两种数据结构 :
①对象结构 ②数组结构
对象结构
对象结构 以 “{” 开始,以 “}” 结束。中间部分 由0个或多个以英文逗号 “,” 分隔的 name/value对 构成,name 和 value 之间以英文冒号 “:” 分隔。 (以 { }开始和结束,中间由0个或多个 name:value,name:value 对构成,name 和value之间用 : 分隔 )
例子如 :
{“id”:111,“name”:“张三”} ,这个就是 JSON的“数据结构” 中的 对象结构”。(name必须为String类型,value就不限制一定得是String类型。)JSON “对象结构” 的“存储形式” 下图所示 :
JSON “对象结构” 的语法结构代码如下 :
{key1:value1,key2:value2,... } ps : key必须为String类型,value不一定得是String类型
其中关键字 (key )必须为String 类型,值( value )可以是 String、Number、Object、Array等数据类型。例如,一个address 对象包含城市、街道、邮编等信息,使用JSON的表示形式如下 :
{ "city":"beijing","street":"Xisanqi","postcode":10096}
数组结构
数组结构以 “[” 开始,以 “]” 结束。中间部分 由0个或多个以英文逗号 “,” 分隔的 值的列表组成。
(value 值 之间用英文逗号 , 进行 分隔 )JSON “数组结构” 的“存储形式” 下图所示 :
JSON “数组结构” 的语法结构代码如下 :
[value1,value2,... ] ps1 : value可以是Spring、Number、Boolean、null等数据类型 ps2 : value之间用英文逗号, 进行分隔
value 可以是Spring、Number、Boolean、null等数据类型,例如 :
["abc",123,flase,null]
上述 两种 数据结构 ( 对象结构、数组结构 )也可以分别组合构成更为复杂的数据结构。例如 : 一个
person对象包含 name、hobby 和 address 对象 ,其代码表现形式如下 :
(要实现这个例子中的JSON数据表示,要用到数据结构中的 “对象结构” 和 “数组结构” 这两种数据结构)//“对象结构”中嵌套了“数组结构” 和 “对象结构” {"name":"张三","hobby":["唱","跳","rap"],"address":{"city":"Beijing,"street","Xisanqi","postcode":10096} }
需要注意的是,如果使用 JSON存储单个数据 (如 “abc”),一定要使用 数组结构 的形式,不要使用 对象结构,因为 对象结构 必须是“ 名称:值 ”的形式。
1.3 JSON的“数据转换” (JSON交互)
为了实现浏览器与 控制器类(Controller) 之间的数据交互,Spring 提供了一个 HttpMessageConverter<T>接口 来完成此项工作。该接口主要用于将请求信息中的数据 “转换”为一个类型为 T 的对象,并将类型为 T 的对象绑定到请求方法的 参数 中,或者将 对象 转换为 响应信息 传递给 浏览器显示。
Spring 为 HttpMessageConverter<T>接口提供了很多实现类,这些实现类可以对不同类型的数据进行信息转换。其中MappingJackson2HttpMessageConverter 是SpringMVC 默认处理JSON 格式请求响应的 实现类。该实现类利用 Jackson 开源包读写 JSON 数据,将Java对象转换为JSON对象和 XML 文档,同时也可以将JSON 对象和 XML文档转换为 Java对象。
要使用MappingJackson2HttpMessageConverter对数据进行转换,就需要使用Jackson的开源包 ( 需要JAR ) :
① jackson-annotations.jar : JSON转换注解包。
② jackson-core.jar : JSON转换核心包。
③ jackson-databind.jar : JSON 转换的数据绑定包。JSON数据转换中的Jackson所需JAR (百度网盘)
也可通过 “http://mvnrepository.com/artifact/com.fasterxml.jackson.core” 地址自行下载JAR。
在使用 注解式开发 时,需要用到两个重要的 JSON 格式转换注解,分别为 @RequestBody 和 @ResponseBody,两个与“JSON格式转换”有关的注解描述如下 :
注解 说明 @RequestBody 用于将 请求体 中的 数据绑定 到 方法的形参 中。该注解 用在方法 的 形参 上。
ps :
该注解用在 “方法的形参” 上。@ResponseBody 用于 直接返回return 对象。该注解用在 方法 上。 JSON数据转换 例子如 : (前端传递JSON数据给后端,后端响应JSON格式数据给“前端”) :
第一步、导入依赖 :
JSON交互中的所需的各种JAR)
第二步、编写JSON数据交互的各种文件 :
该 JSON数据交互 的“项目结构” :
web.xml :
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!-- 配置前端控制器 --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置springmvc-config.xml文件的位置 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-config.xml</param-value></init-param><!-- 配置服务器启动时立刻加载此配置文件,立刻加载此servlet --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>
springmvc-config.xml :
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 配置组件扫描,进行根包扫描,让注解生效 --><context:component-scan base-package="com.myh.controller"/><!-- 配置“视图解析器” --><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><!-- 配置注解驱动 --><!-- 此注解会自动注册 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 这两个bean --><mvc:annotation-driven/></beans>
User.java :
package com.myh.po;public class User {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +'}';} }
userController.java :
package com.myh.controller;import com.myh.po.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;@Controller public class UserController {/*** 接收页面请求的“JSON数据”,并返回JSON格式结果* 接收和返回JSON数据,要用到“@RequestBody注解” 和 @ResponseBody注解*/@RequestMapping("/testJson")@ResponseBody //此@ResponseBody用于返回User对象 (当返回POJO对象时,会默认转换为“JSON格式数据”进行响应)//@RequestBody注解 : 用于将“前端请求体”中的JSON格式数据绑定到User对象中public User testJson(@RequestBody User user) {//打印从前端中获得的数据System.out.println(user);//响应JSON格式数据给前端return user;}}
index.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>测试JSON交互</title><script>function submitForm_JSON() {var form = document.getElementById('myForm');var data = {};for (var i = 0; i < form.elements.length; i++) {var field = form.elements[i];if (field.name && field.value) {data[field.name] = field.value;}}var jsonData = JSON.stringify(data);var xhr = new XMLHttpRequest();xhr.open("POST", "http://localhost:8080/testJson", true);xhr.setRequestHeader("Content-Type", "application/json");xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {console.log("(前端传递JSON数据给后端成功,同时后端也响应JSON格式数据给前端)Success:", xhr.responseText);}};xhr.send(jsonData);}</script> </head><body> <form id="myForm"><input type="text" name="username" placeholder="username"></br><input type="password" name="password" placeholder="password"></br><input type="button" value="测试JSON交互" onclick="submitForm_JSON()"> </form> </body> </html>
配置tomcat,且启动项目成功后,自动跳转index.jsp页面,填写数据后,前端将JSON格式数据传递给后端
后端控制台输出效果 :
从上面的控制台输出结果可以看出,编写的代码已经正确==实现了JSON数据交互==,可以将JSON格式的请求数据转换为方法中的Java对象,也可以将Java对象转换为JSON格式的响应数据。
- index.jsp 代码中的 传递JSON数据给后端 可以用AJAX来实现 :
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>测试JSON交互 (ajax方式)</title><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"><script type="text/javascript" src="${pageContext.request.contextPath}/jquery-3.7.1.js"></script><script type="text/javascript">function testJson() {//获取用户的“用户名” 和 “密码”var username = $("#username").val();var password = $("#password").val();//执行ajax操作$.ajax({url: "/testJson",type: "post",//data表示发送的“数据”data : JSON.stringify({username:username, password:password}),//定义发送请求的数据格式为:JSON字符串contentType: "application/json;charset=UTF-8",//定义回调响应的数据格式为: JSON字符串,该属性可以省略dataType : "json",//成功响应的结果success : function (data) {if (data != null) {alert("你输入的用户名为: " + data.username + "密码为: " + data.password);}}});}</script> </head><body> <form>用户名: <label for="username"></label><input type="text" name="username" id="username"><br/>密码: <label for="password"></label><input type="password" name="password" id="password"><br/><input type="button" value="测试JSON交互" onclick="testJson()"> </form></body> </html>