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

目录

[1. 关于json](#1. 关于json)

[2. 通过Maven仓库,将Jackson下载导入到项目中](#2. 通过Maven仓库,将Jackson下载导入到项目中)

[3. 使用Jackson](#3. 使用Jackson)

[3.1 关于readValue方法](#3.1 关于readValue方法)

[3.2 关于Request.class类对象](#3.2 关于Request.class类对象)

[3.3 关于request对象的属性类型](#3.3 关于request对象的属性类型)

[3.4 关于writeValueAsString](#3.4 关于writeValueAsString)


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

第一种:

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

第二种:

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

第三种:

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

本篇介绍第三种方法;

1. 关于json

  1. body部分的格式就是json

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

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

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

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

代码编写详情如下:

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

选择Jackson Databind版本:

复制并粘贴至pom.xml中:

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

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方法;

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

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

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

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

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

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

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

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

现约定请求格式如下:

XML 复制代码
POST /json
Content-Type: application/json

{
    username:"zhangsan",
    password:"123"
}

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

XML 复制代码
{
    ok: true
}

.java文件内容如下:

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 {
    @Override
    protected 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修饰:

java 复制代码
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)作为返回值;

相关推荐
garmin Chen6 分钟前
从 Transformer 到 Agent:大模型技术全景解析
java·人工智能·python·深度学习·transformer
愚公移码12 分钟前
蓝凌EKP18产品:流程引擎技术篇之流程核心概念模型
java·人工智能·流程引擎·蓝凌
Full Stack Developme19 分钟前
Apache Tika 教程
java·开发语言·python·apache
鹅城剑仙33 分钟前
Java线程池完全指南
java
李白的天不白35 分钟前
SmartAdmin(基于 Spring Boot 框架)中配置跨域请求 VUE3 设置请求头
java·前端
橙子进阶之路37 分钟前
Java线程(CompletableFuture)
java·开发语言
鹅城剑仙1 小时前
Java CompletableFuture 异步编程完全指南
java
2601_961875241 小时前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
重生之我是Java开发战士1 小时前
【Java SE】多线程(三):单例模式,阻塞队列,线程池与定时器
java·javascript·单例模式
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第115题】【并发篇】第15题:说一下悲观锁和乐观锁的区别?
java·开发语言·面试