Java Web

9 Request&Response


文章目录

  • Java Web
  • 9 Request&Response
  • 9.2 Request 对象
  • 9.2.2 Request 获取请求数据


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

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

【获取请求行数据】

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

java怎么获取hostname_数据

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

  • 获取请求方式 【GET】
String getMethod()
  • 获取虚拟目录(项目访问路径) 【/request-demo】
String getContextPath()
  • 获取URL(统一资源定位符): 【 http://localhost:8080/request-demo/req1】
StringBuffer getRequestURL()
  • 获取URI(统一资源标识符) 【/request-demo/req1】
String getRequestURI()
  • 获取请求参数(GET方式): 【username=zhangsan&password=123】
String getQueryString()

[举个栗子]

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 {
        
    }
}

启动服务

测试接口

java怎么获取hostname_java怎么获取hostname_02

【获取请求头数据】

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

java怎么获取hostname_java_03

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

String getHeader(String name)

[举个栗子]

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 {

    }
}

java怎么获取hostname_数据_04

【获取请求体数据】

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

请求体中的数据格

java怎么获取hostname_前端_05

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

分别是:

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

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

  1. 准备一个页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>获取请求体数据</title>
</head>
<body>
<!--
    action: form 表单提交的请求地址
    method:请求方式,指定为post
-->
<form action="/tomcat-demo/req1" method="post">
    <input type="text" name="username">
    <input type="password" name="password">
    <input type="submit">
</form>
</body>
</html>

java怎么获取hostname_java_06

  1. 在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. 启动服务测试

注意:

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

【小结】

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

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

  • 请求行
  • getMethod()获取请求方式
  • getContextPath()获取项目访问路径
  • getRequestURL()获取请求URL
  • getRequestURI()获取请求URI
  • getQueryString()获取GET请求方式的请求参数
  • 请求头
  • getHeader(String name)根据请求头名称获取其对应的值
  • 请求体
  • 注意: 浏览器发送的POST请求才有请求体
  • 如果是纯文本数据:getReader()
  • 如果是字节数据如文件数据:getInputStream()