HttpServletRequest心功能和HttpServletResponse对象
本文摘要: HttpServletRequest是Java Web开发中的核心接口,代表客户端HTTP请求,提供获取请求行、请求头、参数等功能。文章详细介绍了获取请求行信息的方法(getMethod()、getRequestURI()等)、请求头操作方法(getHeader()、getHeaderNames()等),以及获取请求参数的多种方式(getParameter()、getParameter
前言
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 中快速创建:
- 新建 → Module → Web Application(或已有 Web 项目)
- src → main → java → 右键 → New → Servlet
- 填类名 → Finish(IDEA 会自动生成模板)
- 修改成上面代码
- 配置 Tomcat(Edit Configurations → + → Tomcat Server → Local)
- 访问 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 的方式,通过 RequestDispatcher的forward()方法来实现请求转发,在此过程中,还可以使用请求对象的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、输出重定向
当用户的请求因为某些原因无法完成时,通常可以使用HttpServletResponse的sendRedirect()方法让用户来访问另一个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 后跳转常用此防重复提交) | 刷新会重复提交原请求(可能重复下单) |
示例:
这里新建两个类ResponseServlet1和ResponseServlet2,一个输出提示信息并重定向到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的内容,控制台的运行结果。

更多推荐



所有评论(0)