SpringMVC中JSON数据的设置、RestFul风格
Java知识点总结:想看的可以从这里进入
目录
- 3.4、JSON数据
- 3.4.1、前端使用
- 3.4.2、后端使用
- 1、Jackson
- 2、fastjson
- 3.5、RestFul风格
- 3.5.1、简介
- 3.5.2、使用
3.4、JSON数据
3.4.1、前端使用
前端在JavaScript中有封装的JSON对象,可以直接用来操作JSON数据。
-
将对象转化成JSON数据
JSON.stringify(对象名);
-
将JSON转化为对象:
JSON.parse(JSON数据名);
3.4.2、后端使用
前端可以直接使用,但是在后端使用JSON数据,需要引入第三方来实现快捷的操作,比如:Jackson、fastjson等,在使用前需要先导入相应的依赖。
1、Jackson
这种方式最好是创建一个专门的Util类,来辅助我们使用JSON数据
-
添加依赖
<!--Jackson的依赖--> <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.4</version> </dependency>
-
创建Util类
public class JSONUtil {public static String getJSON(Object o) throws JsonProcessingException {return getJSON(o,"yyyy-MM-dd hh:mm:ss");}//将对象封装成JSON格式的数据public static String getJSON(Object o,String dateFormat) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);mapper.setDateFormat(sdf);return mapper.writeValueAsString(o);} }
-
测试
@RequestMapping("f1") @ResponseBody public String JSONTest() throws JsonProcessingException {User user1 = new User(1,"张三");User user2 = new User(2,"李四");List<User> userList = new ArrayList<>();userList.add(user1);userList.add(user2);return JSONUtil.getJSON(userList); }

当然除了创建Util帮助类外,还可以利用Spring的消息转换机制 配置 MappingJackson2HttpMessageConverter,他会自动将返回的对象转化为JSON格式数据。
<!--配置JSON格式的转换器-->
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="supportedMediaTypes"><list><value>application/json;charset-UTF-8</value></list></property>
</bean><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><ref bean="jsonConverter"/></list></property>
</bean>

2、fastjson
fastjson有三个重要的类:JSONObject(代表JSON对象),JSONArray(代表JSON数组),JSON(JSONObject和JSONArray的转化),
-
添加依赖
<!--fastjson的依赖--> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version> </dependency>
-
测试
//List对象转化成JSON字符串 JSON.toJSONString(userList); //对象转化成JSON字符串 JSON.toJSONString(user1); //JSON转化成List List<User> userList1 = JSON.parseArray(s, User.class); //JSON转化成对象 User user = JSON.parseObject(s1, User.class);
3.5、RestFul风格
3.5.1、简介
RestFul(Representational State Transfer,表现层资源状态转移。)风格是一种当前比较流行的互联网软件架构模式,它利用HTTP 协议的特性,规定了一套资源获取的方式,,它可以使软件更简洁,更有层次,易于实现缓存等机制。
在 web开发中,Rest使用HTTP协议连接器来标识对资源的操作,用 HTTP GET标识获取查询资源,HTTP POST标识创建资源,HTTP PUT标识修改资源,HTTP DELETE标识删除资源,这样就构成了 Rest风格数据处理的核心,它的增删改查在在Controller中通过四种注解来区分(也可以用@RequestMapping的属性method):
资源操作 | 对应注解 | HTTP 请求方式 |
---|---|---|
获取资源(SELECT) | @GetMapping、 @RequestMapping(value = “”,method = RequestMethod.GET) | GET |
新增资源(INSERT) | @PostMapping @RequestMapping(value = “”,method = RequestMethod.POST) | POST |
修改资源(UPDATE) | @PutMapping @RequestMapping(value = “”,method = RequestMethod.PUT) | PUT |
删除资源(DELETE) | @DeleteMapping @RequestMapping(value = “”,method = RequestMethod.DELETE) | DELETE |
-
传统的资源操作是通过 ? & 等符号将参数拼接起来的,如果要区分提交、删除等操作,是用不同的请求路径完成的
获取:http://localhost:8080/getUserById?id=1
修改:http://localhost:8080/updateUser?id=1
新增:http://localhost:8080/insertUser?id=1
删除:http://localhost:8080/deleteUserById?id=1
@Controller public class RestfulController {@RequestMapping("getUserById")public String getUserById(int id, Model model){}@RequestMapping("updateUser")public String updateUser(int id, Model model){}@RequestMapping("insertUser")public String insertUser(int id, Model model){}@RequestMapping("deleteUserById")public String deleteUserById(int id, Model model){} }
-
RestFul 是将参数作为 URL 的一部分发送到服务器中,它的增删改查的路径可以是一样的
http://localhost:8080/user/1
@Controller public class RestfulController {@GetMapping("/user/{id}")public String getUserById(@PathVariable("id")int id, Model model){}@PostMapping("/user/{id}")public String updateUser(@PathVariable("id")int id, Model model){}@PutMapping("/user/{id}")public String insertUser(@PathVariable("id")int id, Model model){}@DeleteMapping("/user/{id}")public String deleteUserById(@PathVariable("id")int id, Model model){} }
3.5.2、使用
我们知道表单提交只要2 种方式:get和post,那么put和delete的提交怎么实现呢?
在Spring中提供了一个过滤器:HiddenHttpMethodFilter,它可以对请求进行过滤,可以将请求转换成HTTP方式,但是它的转换是有一定条件的:
- 只能将Post的请求转换成 put 或 delete
- 必须携带一个name为: _method 的参数。
在满足了以上条件后,HiddenHttpMethodFilter 过滤器就会根据请求参数 _method 的值,改变请求的方式,即请求参数 _method 的值才是最终的请求方式,因此我们需要在 POST 请求中携带一个名为 _method 的参数,参数值为 DELETE 或 PUT。
这个过滤器需要在 web.xml中进行配置:
<!-- Rest风格,URL路径映射(需要将这个过滤器配置在字符编码的过滤器之后才行)-->
<filter><filter-name>hiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping><filter-name>hiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
在配置好过滤器后进行测试:
-
测试POST转为Put提交(测试Delete将_method的值改为DELETE即可)
<form action="${pageContext.request.contextPath}/putTest" method="post"><!--用来将POST转为Put--><input type="hidden" name="_method" value="PUT"/><!--用来将POST转为DELETE--><!--<input type="hidden" name="_method" value="DELETE"/>-->姓名:<input class="" id="name" name="name" size="50" type="text" value=""/>住址:<input class="" id="title" name="address" size="50" value="" type="text"/>年龄:<input class="" name="age" size="50" value="" type="text"/>介绍:<textarea name="information" class="" id="content" rows="10"/><input class="" value="提交" type="submit"/><input class="" onclick="history.go(-1)" value="返回" type="button"/> </form>
//put提交就意味着要修改资源,所以在实际操作中,会去service和dao中进行修改的操作 @PutMapping("putTest") @ResponseBody public String putTest(User user, Model model){return String.format("姓名:%s,地址:%s,年龄:%s,介绍:%s",user.getName(),user.getAddress(),user.getAge(),user.getInformation()); }
相关文章:

SpringMVC中JSON数据的设置、RestFul风格
Java知识点总结:想看的可以从这里进入 目录3.4、JSON数据3.4.1、前端使用3.4.2、后端使用1、Jackson2、fastjson3.5、RestFul风格3.5.1、简介3.5.2、使用3.4、JSON数据 3.4.1、前端使用 前端在JavaScript中有封装的JSON对象,可以直接用来操作JSON数据。…...

Clion连接Docker,使用HElib库
文章目录需求Clion连接服务器内的DockerDockerCLionDocker内配置HElib库参考需求 HElib库是用C编写的同态加密开源库,一般在Linux下使用为了不混淆生产环境,使用Docker搭建HElib运行环境本地在Windows下开发,使用的IDE为Clion,本…...

go网络编程-websocket
1. WebSocket编程 文章目录1. WebSocket编程1.1.1. webSocket是什么1.1.2. 举个聊天室的小例子server.go文件代码hub.go文件代码data.go文件代码local.html文件代码1.1.1. webSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之…...

Microsoft designer 使用教程
继各种ai绘图软件诞生之后 dell 2 playground.... 微软自己研发的重量级产品 Microsoft designer 上线了 Microsoft Designer 是微软公司推出的一款设计工具,主要用于快速创建Web和移动应用程序的原型设计。它提供了一系列的工具和模板,可以帮助用户…...
《Docker系列》Docker容器修改配置文件后,重启失败,如何修改配置并启动容器?
Docker容器修改配置文件后,重启失败,如何修改配置并启动容器? docker部署的MySQL容器,修改了my.cnf配置文件,重启的时候导致无法启动 通过查日志发现,配置文件中的binlog-db-dbhw写错了,应该是…...
遇到多个构造器参数时要考虑使用构建器
静态工厂和构造器有个共同的局限性:他们都不能很好地扩展到大量的可选参数。比如用一个类表示包装食品外面显示的营养成分标签(包括必选域和可选域)。 重叠构造器 对于这样的类一般习惯采用重叠构造器(telescoping constructor&…...

【Storm】【五】Storm集成Kafka
Storm集成Kafka 一、整合说明二、写入数据到Kafka三、从Kafka中读取数据一、整合说明 Storm 官方对 Kafka 的整合分为两个版本,官方说明文档分别如下: Storm Kafka Integration : 主要是针对 0.8.x 版本的 Kafka 提供整合支持;Storm Kafka …...

GVRP-LNP-VCMP讲解
目录 GVRP讲解 动态创建Vlan并将端口加入Vlan GVRP消息类型 GVRP工作原理 LNP讲解 动态修改接口链路类型 VCMP讲解 动态创建Vlan 相关概念 Vlan同步 VCMP与GVRP的区别 GVRP讲解 动态创建Vlan并将端口加入Vlan GVRP(GARR Vlan Registration Protocol…...

28个精品Python爬虫实战项目
先来说说Python的优势!然后给大家看下这28个实战项目的实用性!Python跟其他语言相比,有以下优点:1. 简单Python是所有编程语言里面,代码量最低,非常易于读写,遇到问题时,程序员可以把…...

相信人还是相信ChatGPT,龙测首席AI专家给出了意料之外的答案
最近,关于ChatGPT的话题太火了!各大社交软件都是他的消息!从去年12月份ChatGPT横空出世,再到近期百度文心一言、复旦Moss的陆续宣布,点燃了全球对AIGC(内容人工智能自动生成)领域的热情…...

安卓逆向_5 --- jeb 和 AndroidStudio 动态调试 smali
Jeb 工具的使用 :https://www.52pojie.cn/forum.php?modviewthread&tid742250:https://zhuanlan.zhihu.com/p/302856081动态调试 smali 有两种方法: Jeb 调试AndroidStudio smalidea 插件动态调试。1、Jeb 动态调试 smali JEB是一个…...
docker-容器命令
1.新建启动 docker run options image command [arg..] options: --name"容器新名字" -d:后台运行程序 -it:交互式运行 -P: 随机端口 -p: 指定端口 docker run -it ubuntu /bin/bash docker run -it ubuntu:v1 /bin/bash docker run -it 1c352…...

Spring——是什么?作用?内容?用到的设计模式?
目录 什么是spring? spring是为了解决什么问题而衍生的?(历史)Spring解决了实际生产中的什么问题? spring包含了哪些部分?(组成) Spring的特点是什么? spring框架中…...

Qt交叉编译环境搭建
环境及版本: 编译机:Deepin 20.3 Qt 5.12.9 arm编译工具: gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-gnueabihf.tar.xz 运行机:创龙335X开发板 1.下载arm编译工具: gcc-linaro-6.5.0-2018.12-x86_64_arm-linux-…...
Java switch case 语句
Java 的 switch case 语句是一种常用的控制流语句,用于基于不同的输入值执行不同的操作。本文将详细介绍 Java switch case 语句的作用、用法以及在实际工作中的应用。 一、switch case 语句的作用 switch case 语句是一种多分支条件语句,它基于不同的输…...

Linux下MQTT客户端消息订阅与发布实现
MQTT(消息队列遥测传输)是一个基于客户端-服务器的消息发布/订阅传输协议。它基于TCP协议,默认端口号为1883,为此,它也需要一个消息中间件 。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下…...

代码规范----编程规约(下)
目录 四、OOP规约 五、日期时间 六、集合处理 四、OOP规约 (1)、避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可 (2)、所有的覆写方法࿰…...

c++连接mysql
开始想用mysql connector/c8.0 来操作数据库cmake加上配置后一直编译错误 我这里也没有截屏编译错误大概意思是driver.h里面声明的一个check_lib函数里面用了一个未定义的check找遍了资料都没有找到解决办法最后还是用了原始API如果有人有解决办法请留个位置先上在用的cmake配置…...

CentOS7操作系统安装nginx实战(多种方法,超详细)
文章目录前言一. 实验环境二. 使用yum安装nginx2.1 添加yum源2.1.1 使用官网提供的源地址(方法一)2.1.2 使用epel的方式进行安装(方法二)2.2 开始安装nginx2.3 启动并进行测试2.4 其他的一些用法:三. 编译方式安装ngin…...

【测绘程序设计】——空间直角坐标转换
测绘工程中经常遇到空间直角坐标转换——比如,北京54(或西安80)空间直角坐标转换成CGCS2000(或WGS-84)空间直角坐标,常用转换模型包括:①布尔沙模型(国家级及省级范围);②莫洛坚斯基模型(省级以下范围);③三维四参数(小于22局部区域) 等。 本文分享了基于布…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...