SpringMVC | SpringMVC中的“JSON数据交互“ 和“RESTful支持“

news2024/11/13 12:57:33

目录:

    • 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 NotationJS对象标记 ) 是一种 轻量级数据交换格式 。它是 基于 JavaScript 的一个 子集 ( JSONJavaScript子集 ),使用了 CC++C#JavaJavaScriptPerlPython 等其他语言的约定,采用 完全独立编程语言文本格式存储和表示数据。这些特性使 JSON 成为理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成

  • XML 一样,JSON 也是基于纯文本数据格式。可以使用 JSON 传输一个简单的StringNumberBoolean,也可以传输一个数组或者一个复杂的 Object 对象

1.2 JSON的“数据结构”

  • JSON 有如下 两种数据结构

    ①对象结构 ②数组结构

对象结构
  • 对象结构{ 开始,以 } 结束中间部分0个或多个英文逗号 “,” 分隔的 name/value对 构成,namevalue 之间以英文冒号 “:” 分隔。 (以 { }开始结束,中间由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 )可以是 StringNumberObjectArray等数据类型。例如,一个address 对象包含城市街道邮编等信息,使用JSON表示形式如下

    { "city":"beijing","street":"Xisanqi","postcode":10096}
    
数组结构
  • 数组结构“[ 开始,以 “]” 结束中间部分0个或多个英文逗号 “,” 分隔的 列表组成。
    value 值
    之间用英文逗号 , 进行 分隔

  • JSON “数组结构” 的“存储形式下图所示 :
    在这里插入图片描述

  • JSON “数组结构”语法结构代码如下 :

    [
      value1,
      value2,
      ...
    ]
    ps1 : value可以是Spring、Number、Boolean、null等数据类型
    ps2 : value之间用英文逗号, 进行分隔
    

    value 可以是SpringNumberBooleannull数据类型,例如 :

    ["abc",123,flase,null]
    
  • 上述 两种 数据结构 ( 对象结构数组结构 )也可以分别组合构成更为复杂的数据结构例如 : 一个
    person对象包含 namehobbyaddress 对象 ,其代码表现形式如下 :
    (要实现这个例子中的
    JSON数据表示
    ,要用到数据结构中的 对象结构” 和 “数组结构两种数据结构

    //“对象结构”中嵌套了“数组结构” 和 “对象结构”
    {
      "name":"张三",
      "hobby":["唱","跳","rap"],
      "address":{
         "city":"Beijing,
          "street","Xisanqi",
          "postcode":10096
       }
    }
    

    需要注意的是,如果使用 JSON存储单个数据 (如 “abc”),一定要使用 数组结构 的形式,不要使用 对象结构,因为 对象结构 必须是“ 名称:值 ”的形式。

1.3 JSON的“数据转换” (JSON交互)

  • 为了实现浏览器控制器类(Controller) 之间的数据交互Spring 提供了一个 HttpMessageConverter<T>接口完成此项工作接口主要用于将请求信息中的数据 “转换”为一个类型为 T 对象,并将类型为 T对象绑定请求方法参数 中,或者将 对象 转换为 响应信息 传递给 浏览器显示

  • SpringHttpMessageConverter<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/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
	http://www.springframework.org/schema/mvc
	http://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;
 }

 @Override
 public 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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527867.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、C#选择排序算法

简介 选择排序算法的基本思想是每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后放到已排序序列…

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列三:Faster R-CNN图文详解

【目标检测经典算法】R-CNN、Fast R-CNN和Faster R-CNN详解系列二&#xff1a;Fast R-CNN图文详解 概念预设 感受野 感受野(Receptive Field) 是指特征图上的某个点能看到的输入图像的区域。 神经元感受野的值越大表示其能接触到的原始图像范围就越大&#xff0c;也意味着它…

工业AMR机器人如何实现规模化的柔性生产

在当下高度复杂的工业生产环境中&#xff0c;机器人如何实现规模化的柔性生产&#xff0c;已成为业界关注的焦点。特别是在追求高效率、高质量的生产过程中&#xff0c;团队协作的重要性愈发凸显。富唯智能一体化AMR控制系统&#xff0c;作为机器人的核心指挥部&#xff0c;犹如…

VMware安装Centos 6.5系统

文章目录 镜像下载地址1.在vmware中新建虚拟机2.选择标准典型步骤进行安装3.选择以后再放入光盘4.选择准备安装的系统类型5.为虚拟机指定名称并指定位置6.磁盘空间20G默认下一步&#xff1b;7.将无用的硬件删除掉8.点击打开虚拟机&#xff1b;9.选择第一个回车进行全新安装&…

蓝桥杯刷题(十一)

1.卡片 反向思考&#xff0c;看k种卡片可以分给几位同学 代码 n int(input()) k 1 while k*(k1)<2*n:k1 print(k)2.美丽的2 代码 def f(x)->bool:while x:if x%102:return Truex//10return False cnt 0 for i in range(1,2021):if f(i):cnt1 print(cnt)3.单词分析 …

Pytorch详细应用基础(全)

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 1.安装pytorch以及anaconda配置 尽量保持默认的通道&#xff0c;每次写指令把镜像地址写上就行。 defaults优先级是最低的&#…

Matlab 双目相机标定(内置函数)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 相机标定的目的就是要找到从世界坐标转换为图像坐标所用到的投影P矩阵各个系数(即相机的内参与外参)。具体过程如下所述: 1、首先我们需要获取一个已知图形的图像(这里我们使用MATLAB所提供的数据)。 2、找到同…

Django templates 存放html目录

模板 一概述 模板由两部分组成&#xff0c;一部分是HTML代码&#xff0c;一部分是逻辑控制代码&#xff08;变量&#xff0c;标签&#xff0c;过滤器&#xff09; 作用&#xff1a;可以通过一些逻辑控制代码减少一些重复的操作更快速的生成HTML代码&#xff0c;并且实现简单的…

二叉树遍历(牛客网)

描述 编一个程序&#xff0c;读入用户输入的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。 例如如下的先序遍历字符串&#xff1a; ABC##DE#G##F### 其中“#”表示的是空格&#xff0c;空格字符代表空树。建立起此二叉树…

后端工程师快速使用vue和Element

文章目录 Vue1 Vue概述2 快速入门3 Vue指令3.1 v-bind和v-model3.2 v-on3.3 v-if和v-show3.4 v-for3.5 案例 4 生命周期 Element快速使用1 Element介绍2 快速入门3 当前页面中嵌套另一个页面案例代码案例截图 Vue 1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了…

Linux 文件系统:重定向、缓冲区

目录 一、重定向 1、输出重定向 2、输入重定向 3、追加重定向 4、dup2 系统调用 二、理性理解Linux系统下“一切皆文件” 了解硬件接口 三、缓冲区 1、为什么要有缓冲区? 2、刷新策略 3、缓冲模式改变导致发生写时拷贝 未创建子进程时 创建子进程时 使用fflush…

使用树莓派 结合Python Adafruit驱动OLED屏幕 显示实时视频

关于OLED屏幕的驱动&#xff0c;在之前我已经写过很多篇博文&#xff1a; IIC 协议 和 OLED_oled iic-CSDN博客 香橙派配合IIC驱动OLED & 使用SourceInsight解读源码_香橙派5 驱动屏幕-CSDN博客 这两篇博文都是通过模拟或调用IIC协议来使用C语言驱动OLED屏幕&#xff0c;现…

Sentinel加密锁的工作原理

Sentinel加密锁是一种先进的安全机制&#xff0c;它旨在提供强大的数据加密和访问控制功能&#xff0c;确保数据在传输和存储过程中的机密性、完整性和可用性。下面将详细介绍Sentinel加密锁的工作原理、优势以及在现实中的应用。 一、Sentinel加密锁的工作原理 Sentinel加密锁…

2024年腾讯云GPU服务器价格表_1小时费用_一个月价格和一年优惠

腾讯云GPU服务器怎么收费&#xff1f;GPU服务器1小时多少钱&#xff1f;一个月收费价格表和一年费用标准&#xff0c;腾讯云百科txybk.com分享腾讯云GPU服务器GPU计算型GN10Xp、GPU服务器GN7、GPU渲染型 GN7vw等GPU实例费用价格&#xff0c;以及NVIDIA Tesla T4 GPU卡和V100详细…

LiveGBS流媒体平台GB/T28181常见问题-如何订阅设备状态在线离线状态redis订阅设备或是通道状态subscribe device操作及示例

LiveGBS如何订阅设备状态在线离线状态redis订阅设备或是通道状态subscribe device操作及示例 1、如何监听设备状态2、device订阅2.1、设备上线消息2.2、设备离线消息2.2、通道上线消息2.2、通道离线消息 3、订阅示例3.1、连接REDIS3.2、订阅device示例3.3、设备上线示例3.3.1、…

解决微信录像帧率不足30fps

问题现象 使用工具检测录像帧率不足30fps 问题分析 1&#xff0c;抓取微信录像systrace 很明显camera provider很多线程处于Runnable状态&#xff0c;获取不到cpu原因&#xff0c;有两种可能原因&#xff1a;一是cpu频率很低&#xff1b;二是存在高负载应用。 先检查cpu频率…

使用RabbitMQ,关键点总结

文章目录 1.MQ的基本概念2.常见的MQ产品3.MQ 的优势和劣势3.1 优势3.2 劣势 4.RabbitMQ简介4.1RabbitMQ 中的相关概念 1.MQ的基本概念 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。…

【c++】内联-引用-重载

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;c_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.【c】内联函数 1.1 背景 1.2 内联函数的概念 1.3 内联函数的特性 1.4 宏和内联的小知识 宏的优缺点&#xff1f; C有哪些技术替代…

HTML静态网页成品作业(HTML+CSS)——宠物狗店网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

vue元素声明之后未使用的解决方法

错误情况&#xff1a;类似的这种元素声明未使用的情况 解决方法 方法一 将lintOnSave :false 改为lintOnSave:true 方法二 在项目中找到package.json........① 使用快捷键Ctrl F 搜索eslintconfig........② 找到eslintconfig..........③ 找到rules .........④ 添…