前言

        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()StringServletPath之后的额外路径信息(可能为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 核心人才招募,助力技术落地与开发者成长。

更多推荐