request 对象是 Java Web 开发中的核心概念,但它本身并不是一个 Java 文件(.java),而是一个在运行时由服务器创建并传递给 Servlet 的 Java 对象。

这个对象的全称是 HttpServletRequest,它封装了客户端(通常是浏览器)发送给服务器的所有 HTTP 请求信息。
request 对象是什么?
当你使用浏览器访问一个网站,http://example.com:8080/myapp/user?id=123,浏览器会向服务器发送一个 HTTP 请求,服务器(如 Tomcat、Jetty)接收到这个请求后,会解析它,然后创建一个 HttpServletRequest 对象,这个对象就包含了这次请求的所有信息。
服务器会根据你访问的 URL,找到对应的 Servlet(一个 Java 类),并调用它的 service() 方法,同时将这个 HttpServletRequest 对象作为参数传递进去。
在你的 Servlet 代码中,你就可以通过这个 request 参数来获取客户端发来的各种数据。

如何获取 request 对象?
request 对象是在 Servlet 的生命周期方法中由容器(服务器)自动注入的,你不需要自己创建它。
最常见的方式是在 doGet() 或 doPost() 方法中直接接收它:
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;
@WebServlet("/user") // 这个注解表示这个 Servlet 处理 /user 路径的请求
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request 对象已经由 Tomcat 创建并传入了
// 你可以直接使用它来获取请求信息
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 同样,在 doPost 中也可以使用 request
}
}
request 对象的核心功能(常用方法)
HttpServletRequest 接口提供了大量方法来获取请求信息,以下是最常用的一些功能分类:
A. 获取请求行信息
请求行是 HTTP 请求的第一行,GET /myapp/user?id=123 HTTP/1.1

| 方法 | 描述 |
|---|---|
String getMethod() |
获取 HTTP 请求方法,如 GET, POST, PUT, DELETE |
String getRequestURI() |
获取请求的 URI,如 /myapp/user |
String getContextPath() |
获取上下文路径(项目名),如 /myapp |
String getQueryString() |
获取请求 URL 中的查询字符串(?后面的部分),如 id=123 |
String getProtocol() |
获取协议版本,如 HTTP/1.1 |
示例:
String method = request.getMethod(); // "GET" String uri = request.getRequestURI(); // "/myapp/user" String contextPath = request.getContextPath(); // "/myapp" String queryString = request.getQueryString(); // "id=123"
B. 获取请求头信息
请求头包含了关于客户端、请求本身或期望响应的元数据,如 User-Agent, Accept, Content-Type 等。
| 方法 | 描述 |
|---|---|
String getHeader(String name) |
根据头名称获取头值 |
Enumeration<String> getHeaderNames() |
获取所有请求头的名称枚举 |
int getIntHeader(String name) |
获取指定头的整数值 |
示例:
// 获取浏览器的 User-Agent
String userAgent = request.getHeader("User-Agent");
// 获取 Accept-Language
String acceptLanguage = request.getHeader("Accept-Language");
// 遍历所有请求头
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
System.out.println(headerName + ": " + request.getHeader(headerName));
}
C. 获取请求体信息
请求体通常用于 POST 请求,包含了要提交给服务器的数据,如表单数据、JSON、XML 等。
| 方法 | 描述 |
|---|---|
String getParameter(String name) |
根据参数名获取参数值(用于表单数据) |
Map<String, String[]> getParameterMap() |
获取所有参数的键值对映射 |
Enumeration<String> getParameterNames() |
获取所有参数名的枚举 |
String[] getParameterValues(String name) |
获取同名参数的所有值(用于复选框) |
BufferedReader getReader() |
获取请求体的字符输入流(用于读取 JSON/XML 等文本数据) |
ServletInputStream getInputStream() |
获取请求体的字节输入流 |
示例 1:获取表单数据 假设 HTML 表单:
<form action="/user" method="post">
<input type="text" name="username" value="john">
<input type="password" name="password">
<input type="checkbox" name="hobby" value="reading"> Reading
<input type="checkbox" name="hobby" value="sports"> Sports
<button type="submit">Submit</button>
</form>
在 Servlet 中获取:
// 在 doPost 方法中
String username = request.getParameter("username"); // "john"
String password = request.getParameter("password"); // 用户输入的密码
// 获取复选框的所有值
String[] hobbies = request.getParameterValues("hobby"); // 可能是 ["reading"] 或 ["reading", "sports"]
示例 2:获取 JSON 数据
如果前端通过 POST 请求发送 JSON 数据,你需要用 getReader() 来读取。
// 在 doPost 方法中
StringBuilder sb = new StringBuilder();
BufferedReader reader = request.getReader();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
String jsonBody = sb.toString(); // 得到如 {"name":"Alice", "age":30} 的字符串
System.out.println("Received JSON: " + jsonBody);
D. 获取其他信息
| 方法 | 描述 |
|---|---|
String getRemoteAddr() |
获取客户端的 IP 地址 |
String getServerName() |
获取服务器的主机名 |
int getServerPort() |
获取服务器的端口号 |
request 的作用域
request 对象的生命周期非常短暂,它只存在于一次 HTTP 请求和响应的周期内,当服务器处理完这次请求并生成响应返回给客户端后,request 对象就会被销毁。
这意味着,你不能用 request 来在多个请求之间共享数据,如果需要跨请求共享数据,你需要使用:
ServletContext:整个 Web 应用的全局作用域。HttpSession:单个用户的会话作用域(通常基于 Cookie)。
完整的 Servlet 示例
这是一个完整的、现代的 Servlet 示例,它接收一个 GET 请求,并返回一个包含请求信息的 HTML 响应。
创建 InfoServlet.java
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;
import java.io.PrintWriter;
import java.util.Enumeration;
@WebServlet("/info") // 映射到 /info 路径
public class InfoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 设置响应内容类型和字符编码,防止中文乱码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 2. 构建 HTML 响应
out.println("<!DOCTYPE html>");
out.println("<html><head><title>Request Info</title></head><body>");
out.println("<h1>HTTP Request Information</h1>");
out.println("<ul>");
// 3. 获取并显示请求行信息
out.println("<li><b>Method:</b> " + request.getMethod() + "</li>");
out.println("<li><b>Request URI:</b> " + request.getRequestURI() + "</li>");
out.println("<li><b>Context Path:</b> " + request.getContextPath() + "</li>");
out.println("<li><b>Query String:</b> " + request.getQueryString() + "</li>");
out.println("<li><b>Protocol:</b> " + request.getProtocol() + "</li>");
out.println("<li><b>Client IP:</b> " + request.getRemoteAddr() + "</li>");
// 4. 获取并显示请求头信息
out.println("<li><b>Request Headers:</b></li>");
out.println("<ul>");
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
out.println("<li>" + headerName + ": " + request.getHeader(headerName) + "</li>");
}
out.println("</ul>");
out.println("</ul>");
out.println("</body></html>");
}
}
部署和测试
- 将编译后的
InfoServlet.class文件放到你的 Web 应用(ROOT或myapp)的WEB-INF/classes目录下。 - 启动 Tomcat 服务器。
- 在浏览器中访问:
http://localhost:8080/info?name=test&age=25 - 你会看到一个页面,详细显示了这次请求的所有信息,包括 URL 中的
name和age参数。
| 特性 | 描述 |
|---|---|
| 本质 | 一个由 Web 服务器(如 Tomcat)创建的 HttpServletRequest 接口的实例。 |
| 作用 | 封装了客户端发送的 HTTP 请求的所有信息。 |
| 获取方式 | 在 Servlet 的 doGet() 或 doPost() 方法中由容器作为参数传入。 |
| 核心功能 | 获取请求行、请求头、请求体(参数、数据)、客户端信息等。 |
| 生命周期 | 与单个 HTTP 请求/响应周期绑定,用完即毁。 |
| 用途 | 是 Java Web 开发中实现动态内容、处理用户输入、进行业务逻辑判断的基础。 |
