【黑马程序员新版JavaWeb基础教程,Java web从入门到企业实战完整版】
HTTP请求数据总共分为三部分内容,分别是请求行、请求头、请求体
【获取请求行数据】
请求行包含三块内容,分别是请求方式、请求资源路径、HTTP协议及版本

对于这三部分内容,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 {
}
}
启动服务
测试接口

【获取请求头数据】
对于请求头的数据,格式为key: value

根据请求头名称获取对应值的方法为
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 {
}
}

【获取请求体数据】
浏览器在发送GET请求的时候是没有请求体的,所以需要把请求方式变更为POST,
请求体中的数据格

对于请求体中的数据,Request对象提供了如下两种方式来获取其中的数据
分别是:
获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
该方法可以获取字节
获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
[举个栗子]【当然其实也可以直接使用接口测试工具】
准备一个页面
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>

在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);
}
}
启动服务测试

注意:
BufferedReader流是通过request对象来获取的,当请求完成后request对象就会被销毁,
request对象被销毁后,BufferedReader流就会自动关闭,所以此处就不需要手动关闭流了。
【小结】
HTTP请求数据中包含了请求行、请求头和请求体,
针对这三部分内容,Request对象都提供了对应的API方法来获取对应的值:
请求行
请求头
请求体