【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)作为返回值;

相关推荐
所待.38312 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood16 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-20 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟40 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生1 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
郑祎亦1 小时前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea