• 【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内容如下:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>org.examplegroupId>
    7. <artifactId>ServletartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <maven.compiler.source>8maven.compiler.source>
    11. <maven.compiler.target>8maven.compiler.target>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. properties>
    14. <dependencies>
    15. <dependency>
    16. <groupId>javax.servletgroupId>
    17. <artifactId>javax.servlet-apiartifactId>
    18. <version>3.1.0version>
    19. <scope>providedscope>
    20. dependency>
    21. <dependency>
    22. <groupId>com.fasterxml.jackson.coregroupId>
    23. <artifactId>jackson-databindartifactId>
    24. <version>2.15.0version>
    25. dependency>
    26. dependencies>
    27. <packaging>warpackaging>
    28. <build>
    29. <finalName>ServletfinalName>
    30. build>
    31. 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方法

    现约定请求格式如下:

    1. POST /json
    2. Content-Type: application/json
    3. {
    4. username:"zhangsan",
    5. password:"123"
    6. }

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

    1. {
    2. ok: true
    3. }

    .java文件内容如下:

    1. import com.fasterxml.jackson.databind.ObjectMapper;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. class Request{
    9. public String username;
    10. public String password;
    11. }
    12. class Response{
    13. public boolean ok;
    14. }
    15. @WebServlet("/Json")
    16. public class JsonParameterServlet extends HttpServlet {
    17. @Override
    18. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    19. throws ServletException, IOException {
    20. // 1. 获取请求body,并将其按照json格式解析为请求java对象
    21. ObjectMapper objectMapper = new ObjectMapper();
    22. Request request = objectMapper.readValue(req.getInputStream(), Request.class);
    23. System.out.println("username: "+ request.username);
    24. System.out.println("password: "+ request.password);
    25. // 2. 构造响应java对象,并将其转为json格式字符串
    26. Response response = new Response();
    27. response.ok =true;
    28. String respJson = objectMapper.writeValueAsString(response);
    29. resp.setContentType("application/json; charset=utf8");
    30. resp.getWriter().write(respJson);
    31. }
    32. }

    使用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修饰:

    1. class Request{
    2. public String username;
    3. public String password;
    4. }

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

    否则Jackson只会处理public属性;

    3.4 关于writeValueAsString

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

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

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

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

  • 相关阅读:
    车载多媒体没法显示歌词的解决办法 —— 修改 LRC 文件的编码格式为 UTF-8
    git命令行操作
    非零基础自学Java (老师:韩顺平) 第4章 运算符 4.21 二进制转八进制等 && 4.27 原码、反码、补码 && 4.28 位运算符
    @RequestBody、 @RequestParam 、 @PathVariable 和 @Vaild 注解
    virtuoso环形振荡器
    信息安全实验四:Ip包监视程序实现
    VS2019 error LNK2001: 无法解析的外部符号 解决方法
    jvm笔记
    车载激光雷达标定板在无人驾驶中的作用
    java计算机毕业设计ssm的“萨丁”留学资讯网的设计与实现
  • 原文地址:https://blog.csdn.net/m0_63299495/article/details/136286577