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

目录:

    • 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/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>

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

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

相关文章

HUAWEI Pocket 2外屏实时查看App动态,小小窗口大便捷

当我们点外卖、等候飞机时&#xff0c;不少人习惯频繁点亮手机查看外卖配送进度、值机时间。 这时候&#xff0c;手机亮屏、解锁、打开对应App查看状态对于我们来说就显得非常繁琐。而华为Pocket 2结合HarmonyOS 4系统的实况窗功能&#xff0c;与常显外屏的搭配使用&#xff0…

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(五):分布式搜索 ES-下

文章目录 一、数据聚合1.1 聚合种类1.2 DSL实现聚合1.3 RestAPI实现聚合1.4 演示&#xff1a;多条件聚合 二、自动补全2.1 拼音分词器2.2 自定义分词器2.3 DSL自动补全查询2.5 实现酒店搜索框自动补全2.5.1 修改酒店索引库数据结构2.5.2 RestAPI实现自动补全查询2.5.3 实战 三、…

CSS案例-2.简单版侧边栏练习

效果 知识点 标签显示模式 块级元素 block-level 常见元素:<h1>~<h6>、<p>、<div>、<ul>、<ol>、<li>等。 特点: 独占一行长度、宽度、边距都可以控制宽度默认是容器(父级宽度)的100%是一个容器及盒子,里面可以放行内或者…

Docker部署TeamCity来完成内部CI、CD流程

使用TeamCity来完成内部CI、CD流程 本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。至于完整的DevOps&#xff0c;我们后续独立探讨。 一个简单的CI、CD流程 以下分享一个简单的CI、CD流程&#xff08;仅供参考&#xff09;&#…

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现RIME-TCN-BiGRU-Attention霜冰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程…

DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection

摘要 与前代类似&#xff0c; DEYOv2 采用渐进式推理方法 来加速模型训练并提高性能。该研究深入探讨了一对一匹配在优化器中的局限性&#xff0c;并提出了有效解决该问题的解决方案&#xff0c;如Rank 特征和贪婪匹配 。这种方法使DEYOv2的第三阶段能够最大限度地从第一和第二…

Pytorch环境下基于Transformer模型的滚动轴承故障诊断

注意力机制是深度学习中的重要技术之一&#xff0c;正日益受到重视关注。注意力机制作为一种信息贡献筛选的方法被提出&#xff0c;它可以帮助神经网络更多地关注与任务相关的特征&#xff0c;从而减少对任务贡献较小信息的影响。因此&#xff0c;利用注意机制可以提高神经网络…

ArcGIS巧思制作3D景观地图

John Nelson 又制作了一个制图教程视频,我原以为只是一个简单的局部场景DEM夸张实现的3D地图。 不过细看以后…… 还就是比较简单的3D场景地图,操作不难,但是 John Nelson 就是天才。 为什么? 他使用 ArcGIS Pro,在普通的3D地图中,不仅仅是图层混合制作地形效果,还巧妙的…

51-32 CVPR’24 | 3DSFLabelling,通过伪自动标注增强 3D 场景流估计

24 年 2 月&#xff0c;鉴智机器人、剑桥大学和上海交通大学联合发布CVPR24工作&#xff0c;3DSFLabelling: Boosting 3D Scene Flow Estimation by Pseudo Auto-labelling。 提出 3D 场景自动标注新框架&#xff0c;将 3D 点云打包成具有不同运动属性的 Boxes&#xff0c;通过…

【光伏监控系统的相关产品有哪些】Acrel-1000DP分布式光伏监控系统

光伏发电系统是指无需通过热过程直接将光能转变为电能的发电系统。通常由光伏方阵、蓄电池组&#xff08;蓄电池控制器&#xff09;、逆变器、交流配电柜和太阳跟踪控制系统等设备组成。其特点是可靠性高、使用寿命长、不污染环境、能独立发电又能并网运行。 分布式光伏监控系…

高防服务器秒解是什么意思

高防服务器秒解是指高防服务器在遭受大规模的DDoS攻击时&#xff0c;能够迅速解决问题或应对攻击。DDoS攻击是指攻击者通过向目标服务器发送大量的请求&#xff0c;使服务器资源耗尽或无法正常响应其他合法用户的请求&#xff0c;从而导致服务不可用。高防服务器通过具备高性能…

upload-labs-pass01

1.安装好环境进入关卡&#xff08;记得打开小皮&#xff09; 2.可以看到第一关是要求上传图片&#xff0c;但是同时限制了图片类型&#xff0c;那么如果我们将木马写入图片&#xff0c;但是类型又不在白名单&#xff0c;就要想办法绕过 3.可以看到这里的要求是有check&#xff…

数据结构:栈「详解」

目录 一&#xff0c;栈的定义 二&#xff0c;栈的基本操作 1&#xff0c;顺序栈 1.1顺序栈的基本概念 1.2顺序栈的基本操作 2&#xff0c;链栈 2.1链栈的基本概念 2.2链栈的种类 2.3链栈的基本操作 三&#xff0c;栈的应用 1&#xff0c;函数递归调用 2&#xff0c;…

基于支持向量机(svm)的人脸识别

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 数据集加载与可视化 from sklearn.datasets import fetch_lfw_people faces fetch_lfw_people(min_faces_per_person60) # Check out sample…

REDHAWK——连接(续)

文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接…

优化选址问题 | 基于节约算法求解考虑碳排放及带时间窗的物流选址问题附matlab代码

目录 问题代码问题 节约算法(Savings Algorithm)通常用于解决车辆路径问题(Vehicle Routing Problem, VRP),特别是当需要考虑如何有效地组织车辆的路线以最小化总行驶距离时。然而,当问题扩展到包括碳排放和带时间窗的物流选址问题时,算法需要相应的调整。 在这个扩展…

VSCode创建用户代码片段-案例demo

示例 - 在线生成代码片段 Vue3代码片段 {"vue3": {scope": "javascript,typescript,html,vue","prefix": "vue3","body": ["<template>","$1","</template>",""…

webpack5零基础入门-11处理html资源

1.目的 主要是为了自动引入打包后的js与css资源&#xff0c;避免手动引入 2.安装相关包 npm install --save-dev html-webpack-plugin 3.引入插件 const HtmlWebpackPlugin require(html-webpack-plugin); 4.添加插件&#xff08;通过new方法调用&#xff09; /**插件 *…

Coursera上Golang专项课程3:Concurrency in Go 学习笔记(完结)

Concurrency in Go 本文是 Concurrency in Go 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Concurrency in GoMODULE 1: Why Use Concurrency?Learning Objectives M1.1.1 - Parallel ExecutionM1.1.2 - Von Neumann BottleneckM1.1.3 - Power W…

K8S POD 启动探针 startupProbe 的使用

当我们启动一个POD 时&#xff0c; 当k8s detect 里面的容器启动成功时&#xff0c; 就会认为这个POD 启动完成了&#xff0c; 通常就会在状态里表示 ready 1/1 … 例如 rootk8s-master:~# kubectl get pods NAME READY STATUS RESTARTS AGE bq-api-demo 1…