• 【祝福伟大的祖国】Java Web 9.2 Request 对象 9.2.2 Request 获取请求数据


    Java Web

    【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】

    9 Request&Response

    9.2 Request 对象
    9.2.2 Request 获取请求数据

    HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体

    【获取请求行数据】

    请求行包含三块内容,分别是请求方式、请求资源路径、HTTP协议及版本

    在这里插入图片描述

    对于这三部分内容,request对象都提供了对应的API方法来获取

    • 获取请求方式 【GET】

      String getMethod()
      
      • 1
    • 获取虚拟目录(项目访问路径) 【/request-demo】

      String getContextPath()
      
      • 1
    • 获取URL(统一资源定位符): 【 http://localhost:8080/request-demo/req1】

      StringBuffer getRequestURL()
      
      • 1
    • 获取URI(统一资源标识符) 【/request-demo/req1】

    String getRequestURI()
    
    • 1
    • 获取请求参数(GET方式): 【username=zhangsan&password=123】

      String getQueryString()
      
      • 1

    [举个栗子]

    package com.dingjiaxing.web;
    
    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;
    
    /**
     * ClassName: RequestDemo1
     * date: 2022/9/12 9:28
     *
     * @author DingJiaxiong
     */
    
    @WebServlet("/req1")
    public class RequestDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取请求方式
            String method = req.getMethod();
            System.out.println(method);
            
            //获取虚拟目录(项目访问路径)
            String contextPath = req.getContextPath();
            System.out.println(contextPath);
            
            //获取URL(统一资源定位符)
            StringBuffer url = req.getRequestURL();
            System.out.println(url.toString());
            
            //获取URI(统一资源标识符)
            String uri = req.getRequestURI();
            System.out.println(uri);
            
            //获取请求参数
            String queryString = req.getQueryString();
            System.out.println(queryString);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    启动服务

    测试接口

    在这里插入图片描述

    【获取请求头数据】

    对于请求头的数据,格式为key: value

    在这里插入图片描述

    根据请求头名称获取对应值的方法为

    String getHeader(String name)
    
    • 1

    [举个栗子]

    package com.dingjiaxing.web;
    
    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;
    
    /**
     * ClassName: RequestDemo1
     * date: 2022/9/12 9:28
     *
     * @author DingJiaxiong
     */
    
    @WebServlet("/req1")
    public class RequestDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取请求头:user-agent:浏览器的版本信息
            String agent = req.getHeader("user-agent");
            System.out.println(agent);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    【获取请求体数据】

    浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,

    请求体中的数据格

    在这里插入图片描述

    对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据

    分别是:

    • 获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法

      ServletInputStream getInputStream()
      该方法可以获取字节
      
      • 1
      • 2
    • 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法

      BufferedReader getReader()
      
      • 1

    [举个栗子]【当然其实也可以直接使用接口测试工具】

    1. 准备一个页面

      DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>获取请求体数据title>
      head>
      <body>
      
      <form action="/tomcat-demo/req1" method="post">
          <input type="text" name="username">
          <input type="password" name="password">
          <input type="submit">
      form>
      body>
      html>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      在这里插入图片描述

    2. 在Servlet的doPost方法中获取数据

      调用getReader()或者getInputStream()方法,因为目前前端传递的是纯文本数据,所以采用getReader()方法来获取

      package com.dingjiaxing.web;
      
      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.BufferedReader;
      import java.io.IOException;
      
      /**
       * ClassName: RequestDemo1
       * date: 2022/9/12 9:28
       *
       * @author DingJiaxiong
       */
      
      @WebServlet("/req1")
      public class RequestDemo1 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              BufferedReader bufferedReader = req.getReader();
              //读取数据
              String line = bufferedReader.readLine();
              System.out.println(line);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
    3. 启动服务测试

      在这里插入图片描述

    注意:

    BufferedReader流是通过request对象来获取的,当请求完成后request对象就会被销毁,
    request对象被销毁后,BufferedReader流就会自动关闭,所以此处就不需要手动关闭流了。

    【小结】

    HTTP请求数据中包含了请求行、请求头和请求体,

    针对这三部分内容,Request对象都提供了对应的API方法来获取对应的值:

    • 请求行

      • getMethod()获取请求方式
      • getContextPath()获取项目访问路径
      • getRequestURL()获取请求URL
      • getRequestURI()获取请求URI
      • getQueryString()获取GET请求方式的请求参数
    • 请求头

      • getHeader(String name)根据请求头名称获取其对应的值
    • 请求体

      • 注意: 浏览器发送的POST请求才有请求体
      • 如果是纯文本数据:getReader()
      • 如果是字节数据如文件数据:getInputStream()
  • 相关阅读:
    12、设计模式之代理模式(Proxy)
    RocketMQ 消费者消息回发 解析——图解、源码级解析
    CSP 2022 复赛游记
    是机遇还是挑战?AI 2022五大预测
    38.cuBLAS开发指南中文版--cuBLAS中的Level-2函数her2()
    Djiango 模版系统详解(ORM数据模型-使用mysql数据库增删改查)
    优秀智慧园区案例 - 中建科技产业园(中建·光谷之星),万字长文解析先进智慧园区建设方案经验
    为什么选择Python作为AI开发语言
    电脑开机太慢?这5个方法瞬间提升你的电脑速度
    景联文科技:深度探究自动驾驶重要方向——车路协同
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127131445