前言

        HttpServletRequest对象是JAVA WEB开发中的一个核心接口,它代表客户端向服务器发送的HTTP请求,Servlet在收到请求后会创建一个HttpServletRequest实例,并把它作为参数传递给 Servlet 的 service()、doGet()、doPost() 等方法。

简单来说

HttpServletRequest对象代表一次 HTTP 请求,负责让开发者读取:

  • 请求行(方法、路径、协议)
  • 请求头(Headers)
  • 请求参数(query string + form data)
  • 请求体(JSON、文件、二进制)
  • Cookie、Session
  • 客户端信息(IP、User-Agent 等)
  • 请求域(一次请求范围的临时数据存储)

一、HttpServletRequest对象

1、获取请求行信息:

HttpServletRequest接口中获取请求行信息的常用方法:

方法 返回类型 作用(请求行中的对应部分) 示例(请求行:GET /app/user?id=123 HTTP/1.1)
getMethod() String 请求方法(HTTP method) "GET"
getRequestURI() String 请求资源路径(从协议后到 ? 前,不含查询字符串) "/app/user"
getQueryString() String 查询字符串(? 后面的全部内容,未解码) "id=123"
getRequestURL() StringBuffer 协议+主机+端口+URI(不含查询字符串) "http://example.com:8080/app/user"
getProtocol() String 协议版本 "HTTP/1.1"
getContextPath() String 上下文根路径(项目部署名) "/app"
getServletPath() String 匹配到的Servlet路径 "/user"
getPathInfo() String ServletPath之后的额外路径信息(可能为null) null 或 "/detail"

通过之前学习过的,我们创建一个包com.example.unit2_2,在包中创建一个类RequestLineServler,继承HttpServlet类。

package com.example.unit2_1;

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;

@WebServlet("/RequestLineServlet")

public class HelloServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getMethod();
        PrintWriter out =resp.getWriter();
        out.println("getMethod:" + req.getMethod() + "<br/>");
        out.println("getRequestURI:" + req.getRequestURI() + "<br/>");
        out.println("getQueryString"+req.getQueryString()+"<br/>");
        out.println("getProtocol"+req.getProtocol()+"<br/>");
        out.println("getContextPath"+req.getContextPath()+"<br/>");
        out.println("getServletPath"+req.getServletPath()+"<br/>");
        out.println("getRemoteAddr"+req.getRemoteAddr()+"<br/>");
        out.println("getRemoteHost"+req.getRemoteHost()+"<br/>");
        out.println("getRemotePort"+req.getRemotePort()+"<br/>");
        out.println("getLocalAddr"+req.getLocalAddr()+"<br/>");
        out.println("getLocalName"+req.getLocalName()+"<br/>");
        out.println("getLocalPort"+req.getLocalPort()+"<br/>");
        out.println("getServerName"+req.getServerName()+"<br/>");
        out.println("getServerPort"+req.getServerPort()+"<br/>");
        out.println("getScheme:" + req.getScheme() + "<br/>");
        out.println("getRequestURL:" + req.getRequestURL().toString() + "<br/>");


    }
}

上面的代码可以输出请求行中的多种信息,如请求类型、请求的URI、请求协议,上下文路径等。运行IDEA,在弹出的浏览器中地址栏填充注解的地址(@WebServlet后面的地址)即可访问:

快速对照表

你想得到什么 首选方法 备注
只关心请求方式 getMethod() GET/POST/PUT/DELETE...
想知道访问了哪个路径 getRequestURI() 最常用!
带了什么查询参数 getQueryString() 原始字符串;想拆分用 getParameter()

总结一句话: HttpServletRequest 获取请求行最核心的三个方法就是:getMethod() + getRequestURI() + getQueryString(),其他都是辅助。

2、获取请求头信息  

HttpServletRequest 获取请求头(Headers)信息是日常开发中最常用的功能之一(如日志记录、认证校验、限流、跨域处理等)。

HttpServletRequest 接口提供了以下核心方法来操作请求头

方法 返回类型 作用说明 示例场景 / 返回示例
getHeader(String name) String 获取指定名称的请求头值(最常用 request.getHeader("User-Agent") → "Mozilla/5.0 ..."
getHeaderNames() Enumeration<String> 获取所有请求头名称的枚举(遍历全部header必用) 用于打印/记录所有headers
getHeaders(String name) Enumeration<String> 获取指定名称的所有值(支持多值header,如 Accept、Cookie 等) Cookie 可能有多个值
getIntHeader(String name) int 获取指定header的值并转为 int(如 Content-Length) getIntHeader("Content-Length") → 1024
getDateHeader(String name) long 获取指定header的值并解析为 Date 的毫秒时间戳(常用于 If-Modified-Since) 用于缓存协商

示例:

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;

@WebServlet("/header")
public class SimpleHeaderServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/plain;charset=UTF-8");
        PrintWriter out = response.getWriter();

        // 最简单一行:取单个 header
        String ua = request.getHeader("User-Agent");

        out.println("User-Agent 来自浏览器:" + ua);

        // 如果想看更多 header(调试用)
        // out.println("Authorization: " + request.getHeader("Authorization"));
    }
}

在 IDEA 中快速创建

  1. 新建 → Module → Web Application(或已有 Web 项目)
  2. src → main → java → 右键 → New → Servlet
  3. 填类名 → Finish(IDEA 会自动生成模板)
  4. 修改成上面代码
  5. 配置 Tomcat(Edit Configurations → + → Tomcat Server → Local)
  6. 访问 http://localhost:8080/你的项目名/header

3、获取请求参数

        HttpServletRequest接口提供了多种方法来获取HTTP请求中的参数。这些参数通过GET请求的查询字符串或POST请求的表单数据传递的

下面直接对比几种最常见的方式,以及它们适用的典型场景

方法 返回类型 适用场景 是否自动处理 URL 编码 是否支持多值 备注 / 典型用法
getParameter(String name) String 表单提交、查询字符串、路径参数最常见用法 否(取第一个) 99% 情况下首选
getParameterValues(String name) String[] 一个参数可能有多个值(如 checkbox、多选) 多选框、爱好选择等
getParameterMap() Map<String, String[]> 需要一次性拿到所有参数时 日志、调试、转发全部参数
getParameterNames() Enumeration<String> 遍历所有参数名 很少单独用,通常配合 getParameter()
getQueryString() String 只想要原始的查询字符串(? 后面的全部内容) 否(原始,未解码) 签名校验、日志原始参数

示例:

HttpServletRequest对象获取请求参数。

在webapp项目下新建info.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>个人信息</title>
</head>
<body>
<form action="ParamServlet" method="GET">
    姓名:<input type="text" name="name"><br/>
    年龄:<input type="text" name="age"><br/>
    爱好:
    <input type="checkbox" name="hobby" value="sing"/>唱歌
    <input type="checkbox" name="hobby" value="swim"/>游泳
    <input type="checkbox" name="hobby" value="computer games"/>电脑游戏
    <br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

代码通过form表单来进行数据的提交,action属性为Servlet配置映射地址,提交方式为GET。表单通过文本框让用户输入姓名数据和年龄数据,通过复选框让用户选择爱好数据。

然后在java目录下,新建一个自定义名称的包,包中新建一个ParamServlet类,继承HttpServlet类,用来获取form表单获取的数据

package com.example.unit2_2;

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;

@WebServlet("/ParamServlet")
public class ParamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        String name=req.getParameter("name");
        int age=Integer.valueOf(req.getParameter("age"));
        String[]hobbys=req.getParameterValues("hobby");
        PrintWriter out =resp.getWriter();
        out.println("姓名"+name);
        out.println("年龄"+age);
        System.out.println("姓名"+name);
        System.out.println("年龄"+age);

    }
}

在doGot()方法中,通过请求对象req的getParameter()方法获取了表单提交的姓名和年龄,通过请求对象req的getParameterValues()方法获取了批量数据

在部署运行该项目后,在浏览器访问info.html这个页面

通过在输入框进行输入数据和复选框的选择来提交数据

后端的Servlet会输出获取的参数信息

4、请求转发

HttpServletRequest 本身不直接拥有“转发”方法,但它提供了获取 RequestDispatcher 的方式,通过 RequestDispatcherforward()方法来实现请求转发,在此过程中,还可以使用请求对象的setAttribute()方法来设置属性,以保存需要传递的数据。

示例:

新建一个包unit2_5,继承于HttpServlet类,在在其中设置属性,并进行请求转发

package com.example.unit2_3;

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("/servlet1")
public class servlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置属性
        req.setAttribute("name","zhangsan");
        //请求转发
        req.getRequestDispatcher("/servlet2").forward(req,resp);
    }
}

在重写的doGet()方法中,先通过setAttribute()方法保存了姓名信息,在通过getRequestDispatcher方法来确定转发的路径,其中,方法的参数为转发的路径,forward方法实现了请求转发

在包中新建一个类来继承HttpServlet类,获取请求中的属性并输出

package com.example.unit2_3;

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;

@WebServlet("/servlet2")
public class servlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取属性
        String name= req.getAttribute("name").toString();
        PrintWriter out= resp.getWriter();
        out.println("<h1>hello"+name+"</h1>");
    }
}

该代码通过out对象的getAttribute()方法获取之前保存的值来进行页面显示。

运行程序,在浏览器输入Servlet1即可看到运行结果

需要注意的是:请求发送属于服务器的内部行为,用户是没有感知的

二、HttpServletResponse对象

HttpServletResponse 是 Java Servlet 中最核心的响应对象之一,它代表服务器向客户端(浏览器)发送的HTTP响应

它继承自 ServletResponse,并针对 HTTP 协议做了大量扩展,主要负责:

  • 设置 HTTP 状态码(如 200、404、500、302 等)
  • 设置 响应头(Response Headers,如 Content-Type、Content-Disposition、Cache-Control 等)
  • 添加 Cookie
  • 输出响应正文(字符流或字节流)
  • 请求重定向(redirect)
  • 控制缓存、编码、乱码处理等

1、发送响应数据

package com.example.uint2_6;

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;

@WebServlet("/ResponseServlet")
public class ResponseServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out=resp.getWriter();
        out.println("<h1>name : zhangsan<br></h1>");
        out.println("<h1>age:18</h1>");
    }
}

部署成功后即可看到响应信息

2、输出重定向

        当用户的请求因为某些原因无法完成时,通常可以使用HttpServletResponsesendRedirect()方法让用户来访问另一个URL地址,这个就叫重定向。

        这个方法会在响应头中包含一个Location字段,该字段的值是新的URL。当客户端(通常都是浏览器)接收到这个响应时,它会自动发起一个新的GET请求到Location字段指定的URL中。

重定向和请求转发(forword)的区别

特性 response.sendRedirect() request.getRequestDispatcher().forward()
跳转方式 客户端重定向(浏览器发起新请求) 服务器内部转发
请求次数 2 次(浏览器收到 302 后再次请求) 1 次
地址栏变化 会变化(变成目标 URL) 不变(仍显示原始 URL)
能否跨域/跨应用 可以(甚至跳到 baidu.com) 只能在本应用内
能否带 request 属性 不行(新请求,request 是新的) 可以(同一个 request 对象)
典型场景 登录成功后跳转、POST 后跳转防重复提交、跳转外部链接 内部逻辑分发、保持 request 数据(如表单校验失败回显)
HTTP 状态码 302(临时重定向)或 301(永久,可用 sendRedirect 永久) 无特殊状态码(仍是原请求的 200)
刷新页面影响 刷新只请求目标页面(POST 后跳转常用此防重复提交) 刷新会重复提交原请求(可能重复下单)

示例:

这里新建两个类ResponseServlet1ResponseServlet2,一个输出提示信息并重定向到ResponseServlet2,另外一个继承HttpServlet类,输出提示信息。

package com.example.uint2_7;

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;

@WebServlet("/ResponseServlet1")
public class ResponseServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter(); //获取字符流输出对象
        out.println("Servlet1"); // 输出信息
        System.out.println("This is Servlet1");
        resp.sendRedirect("ResponseServlet2");

    }
}
package com.example.uint2_7;

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;

@WebServlet("/ResponseServlet2")
public class ResponseServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter out = resp.getWriter(); //获取字符流输出对象
        out.println("Servlet2"); // 输出信息
        System.out.println("This is Servlet2");

    }
}

在URL处输入的ResponseServlet1,进入之后就会被重定向为ResponseServlet2的地址,页面也只显示为Servlet2的内容,控制台的运行结果。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐