HttpServletRequest简介
HttpServletRequest是什么?
- HttpServletRequest是一个接口,其父接口是ServletRequest;
- HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;
- HttpServletRequest代表客户端发来的请求,请求中的所有信息都可以通过该对象获得;
如何使用HttpServletRequest?
获取请求行信息相关方法:
这些方法用于获取客户端发送请求时的信息,包括 URL、协议、方法、端口等。
| API | 功能解释 |
|---|---|
StringBuffer getRequestURL() | 获取客户端请求的完整 URL。 |
String getRequestURI() | 获取客户端请求的项目目录的具体资源。 |
int getServerPort() | 获取客户端发送请求时使用的服务器端口。 |
int getLocalPort() | 获取应用程序所在容器的端口。 |
int getRemotePort() | 获取客户端程序所使用的端口。 |
String getScheme() | 获取请求的协议(如 HTTP、HTTPS)。 |
String getProtocol() | 获取请求使用的协议及版本号(如 HTTP/1.1)。 |
String getMethod() | 获取请求的 HTTP 方法(如 GET、POST)。 |
获取请求头信息相关方法:
这些方法用于处理请求头信息,包括获取特定请求头或所有请求头的名称。
| API | 功能解释 |
|---|---|
String getHeader(String headerName) | 根据头名称获取请求头的值。 |
Enumeration getHeaderNames() | 获取所有的请求头名称。 |
String getContentType() | 获取 Content-Type 请求头。 |
package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.Enumeration;@WebServlet("/servlet04")
public class servlet4_1 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 行情求相关 get/post uri http/1.1System.out.println(req.getMethod()); // 获取请求方式System.out.println(req.getScheme()); // 获取请求协议System.out.println(req.getProtocol()); //获取请求协议及其版本System.out.println(req.getRequestURI());// 获取请求的uri 项目内的资源路径System.out.println(req.getRequestURL());// 获取请求的url 项目内的资源的完成的路径System.out.println(req.getLocalPort());//本应用容器的端口号8080System.out.println(req.getServerPort()); // 客户端发请求时使用的端口号System.out.println(req.getRemotePort());// 客户端软件的端口号System.out.println("--------------------头请求-------------------------");// 根据名字单独获取请求头String accept = req.getHeader("Accept");System.out.println("Accept :" + accept );// 获取本次请求中所有的请求头的名字System.out.println("--------------------所有请求头----------------------");Enumeration<String> headNames = req.getHeaderNames();while(headNames.hasMoreElements()){String hname = headNames.nextElement();System.out.println(hname +" : " +req.getHeader(hname));}}
}
控制台输出:
浏览器的报文内容

获取请求参数相关API
在 Servlet 中,获取请求参数是指从客户端发送的 HTTP 请求中提取传递的参数。这些参数通常通过 URL、表单提交 或 查询字符串 发送,常见的获取请求参数的方法有以下几种:
GET 请求中的查询参数: 通过 URL 传递的参数,例如:http://example.com?name=John&age=25。参数 name 和 age 就是 URL 中的查询参数。
POST 请求中的表单数据: 通过 HTML 表单的提交来传递数据。表单数据以键值对的形式提交,服务器可以接收这些参数。
| API | 功能解释 |
|---|---|
String getParameter(String parameterName) | 根据请求参数名获取请求单个参数值。 |
String[] getParameterValues(String parameterName) | 根据请求参数名获取请求多个参数值数组。 |
Enumeration getParameterNames() | 获取所有请求参数名。 |
Map<String, String[]> getParameterMap() | 获取所有请求参数的键值对集合。 |
BufferedReader getReader() throws IOException | 获取读取请求体的字符输入流。(JSON串) |
ServletInputStream getInputStream() throws IOException | 获取读取请求体的字节输入流。(读文件) |
int getContentLength() | 获取请求体长度的字节数。 |
package Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;@WebServlet ("/servlet05")
public class servlet4_2 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取键值对形式的参数// 获取请求中的参数String username = req.getParameter("username");System.out.println(username);String password = req.getParameter("usePsw");System.out.println(password);// 根据参数名获取多个参数值String[] hobbies = req.getParameterValues("hobby");System.out.println(Arrays.toString(hobbies));// 获取所有的参数名Enumeration<String> pnames = req.getParameterNames();while(pnames.hasMoreElements()){String pname = pnames.nextElement();String[] values = req.getParameterValues(pname);if(values.length > 1){System.out.println(Arrays.toString(values));}else System.out.println(pname + " = " + values[0]);}System.out.println("----------------Map--------------------");// 返回所有参数的map集合 key = 参数名 value = 参数值Map<String,String[]> parameterMap = req.getParameterMap();Set<Map.Entry<String,String[]>> entries = parameterMap.entrySet();for (Map.Entry<String,String[]> entry : entries){String pname = entry.getKey();String[] value = entry.getValue();if(value.length > 1){System.out.println(pname +" = " + Arrays.toString(value));} else System.out.println(pname + " = " + value[0]);}}}
.System.out.println(Arrays.toString(hobbies)):
Arrays.toString(hobbies)将数组hobbies转换为字符串表示形式(如["reading", "swimming", "coding"]),方便输出查看。System.out.println会将转换后的字符串打印到控制台,便于开发者检查获取到的参数值
HTML代码
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
# 可以改成post方法,Java代码同样可以处理
<form action="servlet05" method="get"><input type="text" name="username"> <br><input type="password" name="usePsw"> <br>爱好:<input type="checkbox" name="hobby" value="1"> 篮球<input type="checkbox" name="hobby" value="2"> 足球<input type="checkbox" name="hobby" value="3"> 排球<input type="checkbox" name="hobby" value="4"> 铅球<input type="submit" >
</form>
</body>
</html>
Get请求和post请求的区别
数据传递方式
- GET 请求:
- 数据通过 URL 查询字符串 传递,放在 URL 的末尾。
- 例如:
GET /search?query=java HTTP/1.1,其中query=java是查询参数。 - 查询字符串长度受浏览器和服务器的限制(通常在 2000 个字符左右)。
- POST 请求:
- 数据通过 请求体(body) 传递,而不是 URL。这使得 POST 请求适合传输较大或复杂的数据。
- 例如:
POST /submit HTTP/1.1,数据放在请求体中(如表单数据或 JSON 数据)。
其他常用API
| API | 功能解释 |
|---|---|
String getServletPath() | 获取请求的 Servlet 的映射路径。(就是WebServlet ("/servlet05")中的 /servlet05) |
ServletContext getServletContext() | 获取 ServletContext 对象,用于与 Servlet 环境交互。 |
Cookie[] getCookies() | 获取请求中所有的 Cookie。 |
HttpSession getSession() | 获取 HttpSession 对象,处理会话信息。 |
void setCharacterEncoding(String encoding) | 设置请求体字符编码。 |
HttpServletRequest怎么用?
1. 设置响应行相关:
| API | 功能解释 |
|---|---|
void setStatus(int code) | 设置响应状态码 |
setStatus(int code):用于设置 HTTP 响应的状态码,如200(成功)、404(未找到)、500(服务器内部错误)等。
2. 设置响应头相关:
| API | 功能解释 |
|---|---|
void setHeader(String headerName, String headerValue) | 设置或修改响应头键值对。 |
void setContentType(String contentType) | 设置 Content-Type 响应头以及字符集(设置 MIME 类型)。 |
setHeader(String headerName, String headerValue):用于设置或修改 HTTP 响应头信息。例如,设置Content-Type、Cache-Control等。setContentType(String contentType):用于设置Content-Type响应头,指定返回内容的类型,如text/html、application/json等。
3. 设置响应体相关:
| API | 功能解释 |
|---|---|
PrintWriter getWriter() throws IOException | 获取响应输出体放入信息的字符输出流(通常用于文本)。 |
ServletOutputStream getOutputStream() throws IOException | 获取响应输出体放入信息的字节输出流(通常用于二进制数据)。 |
void setContentLength(int length) | 设置响应体的字节长度,其实质是在设置 Content-Length 响应头。 |
getWriter():用于获取PrintWriter对象,可以通过它向客户端发送字符数据(如 HTML、JSON、纯文本等)。getOutputStream():用于获取ServletOutputStream对象,通常用于发送二进制数据(如图片、PDF 等)。setContentLength(int length):设置响应体的字节长度,用于告诉客户端响应内容的大小
package Servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;
import java.io.PrintWriter;@WebServlet("/servlet06")
public class servlet4_3 extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 设置响应行相关的API
// resp.setStatus(404); // 故意响应404resp.setStatus(200);// 设置响应头相关的API
// resp.setHeader("aaa","valuea");
// resp.setHeader("Content-Type","text/html");
// resp.setHeader("Content-Length","1234");String info = "<h1>hello<h1>";resp.setContentType("text/html");resp.setContentLength(info.length());// 设置响应体内容的API// 获得一个响应体中输入文本字符输出流PrintWriter writer = resp.getWriter();writer.write(info);}
}
相关文章:
HttpServletRequest简介
HttpServletRequest是什么? HttpServletRequest是一个接口,其父接口是ServletRequest;HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;HttpServletRequest代表客户端发来的请…...
c++开发之编译curl(安卓版本)
为了在 Android 上编译支持 OpenSSL 的 libcurl,你需要手动编译 libcurl 和 OpenSSL,并确保它们能够在 Android 的交叉编译环境中正常工作。以下是详细的步骤说明。 1. 安装必要工具 在编译之前,确保你已经安装了以下工具: And…...
QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析
一、阿里云环境配置 大家在编写QT连接阿里云的程序之前,先按照下面这篇文章让消息可以在阿里云上顺利流转 QTESP8266STM32项目构建三部曲二--阿里云云端处理之云产品流转-CSDN博客文章浏览阅读485次,点赞7次,收藏4次。创建两个设备ÿ…...
Web APIs 5:Window对象(BOM)+本地存储
Web APIs 5(BOM:Window对象本地存储) 1.BOM(浏览器对象模型)(后面几个对象都为BOM对象) BOM对象包含:navigator、location、document(DOM对象)、history、screenBOM是一个全局对象,即JS中的顶…...
神经网络(四):UNet图像分割网络
文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接:点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络结构,因此称为UNet。该网络具有编码器和解码器结构&#…...
Java 编码系列:注解处理器详解与面试题解析
引言 在上一篇文章中,我们详细探讨了 Java 注解的基本概念、自定义注解、元注解等技术。本文将继续深入探讨 Java 注解处理器(Annotation Processor),介绍如何编写注解处理器,并结合大厂的最佳实践和面试题详细解析其…...
C语言 | Leetcode C语言题解之第441题排列硬币
题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };...
Linux noVNC远程桌面(xfce)部署
一、安装 VNC 服务器和桌面环境 Notebook实验 常用vnc服务 VNC (Virtual Network Computing) 是一种远程桌面协议,可以让你通过网络访问服务器的图形界面。 TurboVNC:专为图形密集型应用设计,尤其适合 3D 可视化和高分辨率图像的远程传输…...
【网络安全】身份认证
1. 身份认证 1.1 定义 身份认证(Authentication)是确认用户身份的过程,确保只有授权的用户才能访问系统或资源。它通常涉及验证用户提供的凭证,如密码、生物特征或其他识别标志。 1.2 重要性 身份认证是信息安全的第一道防线&…...
LeetCode - #124 二叉树中的最大路径和(Top 100)
文章目录 前言1. 描述2. 示例3. 答案关于我们前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 123 期…...
Java:插入排序
目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…...
How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024)概览
关注B站可以观看更多实战教学视频:hallo128的个人空间 How FAR ARE WE FROM AGI?官网 How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024) 该研讨会将于2024年5月11日在奥地利维也纳以混合模式举行,作为 ICLR 2024年会议的一部…...
leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.不同的二叉搜索树)
62.不同路径 机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。 动规五部曲 1、确定dp数组(dp table)以及下标的含义 dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路…...
基于Python大数据的B站热门视频的数据分析及可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
matlab-批处理图像质量变化并形成折线图 (PSNR)
%修改路径就能用,图片分辨率要一致 %clc;clear all;close all;tic;%清理内存 file_pathE:\test\resources\image\;% 批量图像所在的文件夹下 file_save_pathE:\test\resources\SaveImage\;% 要存储的地址 img_path_listdir(strcat(file_path,*.jpg));% 获取批量bm…...
[Doc][Ros2]ros2中Qos(Quality of Service,服务质量)介绍
在 ROS 2 中,QoS(Quality of Service,服务质量)是用于控制节点之间消息传递的可靠性、历史存储和数据持久性等方面的机制。通过 QoS 设置,用户可以更细粒度地控制消息传递的行为,确保在不同网络环境或应用场景中满足特定的通信需求。 几个常用的包: QoSProfile: 含义…...
SpringBoot日志集成-LogBack
Log4J:最早的Java日志框架之一,由Apache基金会发起,提供灵活而强大的日志记录机制JDK自带的日志框架:java.util.logging.Logg,是JDK1.4之后提供的日志API,已淘汰logback: logback一个开源的日志…...
Google BigTable架构详解
文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模…...
【python】如何切换ipynb的kernel至指定conda环境
需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后,打开jupyter 创建一个python文件 在kernel——>change kernel——>python[conda env:cvml] 参考资料…...
Linux【基础指令汇总】
目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
