杰瑞科技汇

Java文件如何处理request请求?

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

Java文件如何处理request请求?-图1
(图片来源网络,侵删)

这个对象的全称是 HttpServletRequest,它封装了客户端(通常是浏览器)发送给服务器的所有 HTTP 请求信息。


request 对象是什么?

当你使用浏览器访问一个网站,http://example.com:8080/myapp/user?id=123,浏览器会向服务器发送一个 HTTP 请求,服务器(如 Tomcat、Jetty)接收到这个请求后,会解析它,然后创建一个 HttpServletRequest 对象,这个对象就包含了这次请求的所有信息。

服务器会根据你访问的 URL,找到对应的 Servlet(一个 Java 类),并调用它的 service() 方法,同时将这个 HttpServletRequest 对象作为参数传递进去。

在你的 Servlet 代码中,你就可以通过这个 request 参数来获取客户端发来的各种数据。

Java文件如何处理request请求?-图2
(图片来源网络,侵删)

如何获取 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

Java文件如何处理request请求?-图3
(图片来源网络,侵删)
方法 描述
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>");
    }
}

部署和测试

  1. 将编译后的 InfoServlet.class 文件放到你的 Web 应用(ROOTmyapp)的 WEB-INF/classes 目录下。
  2. 启动 Tomcat 服务器。
  3. 在浏览器中访问:http://localhost:8080/info?name=test&age=25
  4. 你会看到一个页面,详细显示了这次请求的所有信息,包括 URL 中的 nameage 参数。

特性 描述
本质 一个由 Web 服务器(如 Tomcat)创建的 HttpServletRequest 接口的实例。
作用 封装了客户端发送的 HTTP 请求的所有信息。
获取方式 ServletdoGet()doPost() 方法中由容器作为参数传入。
核心功能 获取请求行、请求头、请求体(参数、数据)、客户端信息等。
生命周期 与单个 HTTP 请求/响应周期绑定,用完即毁。
用途 是 Java Web 开发中实现动态内容、处理用户输入、进行业务逻辑判断的基础。
分享:
扫描分享到社交APP
上一篇
下一篇