【JavaEE】_前端POST请求使用json向后端传参

目录

1. 关于json

2.  通过Maven仓库,将Jackson下载导入到项目中

3. 使用Jackson

3.1 关于readValue方法

3.2 关于Request.class类对象

3.3 关于request对象的属性类型

3.4 关于writeValueAsString


前端向后端传递参数通常有三种方法:

第一种:

【JavaEE】_前端使用GET请求的queryString向后端传参-CSDN博客

第二种:

【JavaEE】_前端POST请求借助form表单向后端传参-CSDN博客

第三种:

使用POST请求的body部分向后端传参,且body格式为json格式;

本篇介绍第三种方法;

1. 关于json

1. body部分的格式就是json

此时请求报头部分有:Content - Type : application / json

2. 对于通过GET请求的query string部分传参和通过POST请求的body的form表单格式传参,是servlet天然支持的,但是对于POST请求的body使用json格式传参,servlet本身并不支持,需要引入额外的第三方库

3. json本质也是键值对,但规则和form表单不同,解析方式也不同。且json支持嵌套,手写解析json并不容易;

4. json的第三方库非常丰富,本专栏使用jackson。(spring官方推荐jackson,被spring集成)

代码编写详情如下:

2.  通过Maven仓库,将Jackson下载导入到项目中

选择Jackson Databind版本:

复制并粘贴至pom.xml中:

,引入依赖后,pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>Servlet</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.15.0</version></dependency></dependencies><packaging>war</packaging><build><finalName>Servlet</finalName></build></project>

如果导入缓慢或失败,可以点击Maven面板的刷新按钮,此处不再赘述,若对导入依赖仍有疑问,请查看本专栏Servlet程序编写方法一文,链接如下:

【JavaEE】_Servlet程序的编写方法-CSDN博客

3. 使用Jackson

1. Jackson的重点为:一个对象和两个方法;

一个对象:ObjectMapper类;

两个方法:readValue方法WriteAsString方法;

2. 使用一个ObjcectMapper类(对象映射器),可以把json字符串映射为一个Java对象,或把一个java对象映射成json字符串;

网络传输中,使用的是json字符串

实现业务逻辑的java代码中,使用的是java对象

站在服务器角度,就需要把获取到的请求(json字符串)先映射为java对象,

再进行一系列业务逻辑处理。

处理完毕后,还需要把处理完的java对象再映射回json字符串,通过响应返回;

3. json字符串向java对象的映射:json字符串——>java对象:使用readValue方法

    java对象向json字符串的映射:java对象——>json字符串:使用writeValueAsString方法

现约定请求格式如下:

POST /json
Content-Type: application/json{username:"zhangsan",password:"123"
}

约定响应格式如下:(也按照json来组织)

{ok: true
}

.java文件内容如下:

import com.fasterxml.jackson.databind.ObjectMapper;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
class Request{public String username;public String password;
}
class Response{public boolean ok;
}
@WebServlet("/Json")
public class JsonParameterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 1. 获取请求body,并将其按照json格式解析为请求java对象ObjectMapper objectMapper = new ObjectMapper();Request request = objectMapper.readValue(req.getInputStream(), Request.class);System.out.println("username: "+ request.username);System.out.println("password: "+ request.password);// 2. 构造响应java对象,并将其转为json格式字符串Response response = new Response();response.ok =true;String respJson = objectMapper.writeValueAsString(response);resp.setContentType("application/json; charset=utf8");resp.getWriter().write(respJson);}
}

使用postman构造一个POST请求发送:

获取到的响应如下:

在服务器日志端也可获取到前端的参数:

3.1 关于readValue方法

1. 把body的流对象(方法的第一个参数)直接传给readValue,这个方法内部就会读取InputStream中的所有数据(HTTP请求中的body,即json字符串);

2. 尝试把json字符串解析成Map(键值对);

3. 把Map转换成java对象(方法的第二个参数);

readValue内部就可以通过反射API创建出Request.class实例,并且根据Request.class提供的属性的名字(username和password)来查询上述Map,把得到的结果(zhangsan和123)赋值给对应的属性(username和password),从而获取到了一个完整的Request对象;

请注意反射属于非常规操作,除非万不得已,在开发中不要随便使用反射;

3.2 关于Request.class类对象

对于一个java代码,会被javac编译成.class文件(二进制),这个文件包含了.java源代码中的核心信息,比如类的名称、属性及其类型、方法及其参数与类型、父类、实现的接口、注解等等;

当java进程启动,就会读取.class文件,把这些二进制内容读到内存并进行解析,这个过程称为类加载

类加载完毕后,就会在内存中获取到一个类对象

故而.class文件中的所有信息也都在类对象中了。

可以将类对象理解为一个类的图纸,后续要构造这个类的实例都是基于类对象来进行展开的;

3.3 关于request对象的属性类型

在本例中,Request对象的两个属性均使用public修饰:

class Request{public String username;public String password;
}

如果要将属性被private修饰,必须提供对应的Getter和Setter方法,

否则Jackson只会处理public属性;

3.4 关于writeValueAsString

可以将writeValueAsString视为readValue的反向操作,这个方法可以把一个java对象映射成json字符串;

1. 通过传入的参数获取到类对象,通过反射获取到属性(ok);

2. 根据属性名获取属性值(true);

3. 把上述属性名与属性值按照json格式构造成字符串(reqJson)作为返回值;

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

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

相关文章

Android和Linux的开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

Redis之一: 简介及环境安装搭建

什么是NoSQL? NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 NoSQL用于超大规模数据的存储。&#xff08;例如谷歌或Facebook每天为他们的用户收集万亿比特的数据&#xf…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

【postgresql】数据表id自增与python sqlachemy结合实例

需求&#xff1a; postgresql实现一个建表语句&#xff0c;表名&#xff1a;student,字段id,name,age&#xff0c; 要求&#xff1a;每次添加一个数据id会自动增加1 在PostgreSQL中&#xff0c;您可以使用SERIAL或BIGSERIAL数据类型来自动生成主键ID。以下是一个创建名为stude…

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

数学建模资料分享

1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构&#xff0c;格式&#xff0c;思路等等。 链接&#xff1a;https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码&#xff1a;nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先&#xff0c;来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型&#xff0c;分别是 &#xff1a; & string 字符串类型&#xff1b; & list 列表类型&#xff1b; & set 集合类型&#xff1b; & sorted set 有序集合类型&…

[leetcode] 37. 解数独

文章目录 题目描述解题方法dfsjava代码复杂度分析 相似题目 题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3…

RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

Stable Diffusion 3 发布及其重大改进

1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后&#xff0c;Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说&#xff0c;我们快来看看吧&#xff01; 2. 什么是Stable Diffusion…

事件循环解析

浏览器的进程模型 何为进程&#xff1f; 程序运行需要有它自己专属的内存空间&#xff0c;可以把这块内存空间简单的理解为进程 每个应用至少有一个进程&#xff0c;进程之间相互独立&#xff0c;即使要通信&#xff0c;也需要双方同意。 何为线程&#xff1f; 有了进程后&…

SSM项目集成Spring Security 4.X版本 之 加入DWZ,J-UI框架实现登录和主页菜单显示

目录 前言 一、加入DWZ J-UI框架 二、实现登录页面 三、实现主页面菜单显示 前言 大家好&#xff01;写文章之前先列出几篇相关文章。本文内容也在其项目中接续实现。 一. SSM项目集成Spring Security 4.X版本&#xff08;使用spring-security.xml 配置文件方式&#xff…

MCU多核异构通信原理

摘要&#xff1a; 本文结合瑞萨RZ/G2L 多核处理器&#xff0c;给大家讲述一下多核异构设计及通信的原理。 随着电子技术的不断发展&#xff0c;以及市场需求的日益增长&#xff0c;嵌入式系统不仅要求执行复杂的控制任务&#xff0c;还需要实时地采集和处理数据。 为了满足这…

python 基础知识点(蓝桥杯python科目个人复习计划51)

今日复习计划&#xff1a;做复习题 例题1&#xff1a;大石头的搬运工 问题描述&#xff1a; 在一款名为“大石头的搬运工”的游戏中&#xff0c;玩家需要 操作一排n堆石头&#xff0c;进行n - 1轮游戏。 每一轮&#xff0c;玩家可以选择一堆石头&#xff0c;并将其移动到任…

使用Node.js开发一个文件上传功能

在现代 Web 应用程序开发中&#xff0c;文件上传是一个非常常见且重要的功能。今天我们将通过 Node.js 来开发一个简单而强大的文件上传功能。使用 Node.js 来处理文件上传可以带来许多好处&#xff0c;包括简单的代码实现、高效的性能和灵活的配置选项。 首先&#xff0c;我们…

【Pytorch深度学习开发实践学习】Pytorch实现LeNet神经网络(1)

1.model.py import torch.nn as nn import torch.nn.functional as F引入pytorch的两个模块 关于这两个模块的作用&#xff0c;可以参考下面 Pytorch官方文档 torch.nn包含了构成计算图的基本模块 torch,nn.function包括了计算图中的各种主要函数&#xff0c;包括&#…

爬虫入门五(Scrapy架构流程介绍、Scrapy目录结构、Scrapy爬取和解析、Settings相关配置、持久化方案)

文章目录 一、Scrapy架构流程介绍二、Scrapy目录结构三、Scrapy爬取和解析Scrapy的一些命令css解析xpath解析 四、Settings相关配置提高爬取效率基础配置增加爬虫的爬取效率 五、持久化数据1.在items中新建类2.在解析中&#xff0c;得到item对象&#xff0c;并且yield3.配置文件…

LabVIEW开发FPGA的高速并行视觉检测系统

LabVIEW开发FPGA的高速并行视觉检测系统 随着智能制造的发展&#xff0c;视觉检测在生产线中扮演着越来越重要的角色&#xff0c;尤其是在质量控制方面。传统的基于PLC的视觉检测系统受限于处理速度和准确性&#xff0c;难以满足当前生产需求的高速和高精度要求。为此&#xf…

Tomcat线程池原理(上篇:初始化原理)

文章目录 前言正文一、从启动脚本开始分析二、ProtocolHandler 的启动原理三、AbstractEndPoint 的启动原理四、创建默认线程池五、参数配置原理5.1 常规的参数配置5.2 自定义线程池5.3 测试自定义线程 前言 在Java Web的开发过程中&#xff0c;Tomcat常用的web容器。SpringBo…