当前位置: 首页 > news >正文

HttpServletRequest简介

HttpServletRequest是什么?

  • HttpServletRequest是一个接口,其父接口是ServletRequest;
  • HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;
  • HttpServletRequest代表客户端发来的请求,请求中的所有信息都可以通过该对象获得;

5c513a5fd6cf4f44b4e9286a189c9e42.png 

如何使用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));}}
}

控制台输出:

1e03dc339963424493113bb11f49e72c.png 浏览器的报文内容

dd7efb69828c44b7804a674a2728e8e7.png

获取请求参数相关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-TypeCache-Control 等。
  • setContentType(String contentType):用于设置 Content-Type 响应头,指定返回内容的类型,如 text/htmlapplication/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是什么&#xff1f; HttpServletRequest是一个接口&#xff0c;其父接口是ServletRequest&#xff1b;HttpServletRequest是Tomcat将请求报文转换封装而来的对象&#xff0c;在Tomcat调用service方法时传入&#xff1b;HttpServletRequest代表客户端发来的请…...

c++开发之编译curl(安卓版本)

为了在 Android 上编译支持 OpenSSL 的 libcurl&#xff0c;你需要手动编译 libcurl 和 OpenSSL&#xff0c;并确保它们能够在 Android 的交叉编译环境中正常工作。以下是详细的步骤说明。 1. 安装必要工具 在编译之前&#xff0c;确保你已经安装了以下工具&#xff1a; And…...

QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析

一、阿里云环境配置 大家在编写QT连接阿里云的程序之前&#xff0c;先按照下面这篇文章让消息可以在阿里云上顺利流转 QTESP8266STM32项目构建三部曲二--阿里云云端处理之云产品流转-CSDN博客文章浏览阅读485次&#xff0c;点赞7次&#xff0c;收藏4次。创建两个设备&#xff…...

Web APIs 5:Window对象(BOM)+本地存储

Web APIs 5&#xff08;BOM&#xff1a;Window对象本地存储&#xff09; 1.BOM(浏览器对象模型)&#xff08;后面几个对象都为BOM对象&#xff09; BOM对象包含&#xff1a;navigator、location、document(DOM对象)、history、screenBOM是一个全局对象&#xff0c;即JS中的顶…...

神经网络(四):UNet图像分割网络

文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接&#xff1a;点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络&#xff0c;其特点是采用了U型网络结构&#xff0c;因此称为UNet。该网络具有编码器和解码器结构&#…...

Java 编码系列:注解处理器详解与面试题解析

引言 在上一篇文章中&#xff0c;我们详细探讨了 Java 注解的基本概念、自定义注解、元注解等技术。本文将继续深入探讨 Java 注解处理器&#xff08;Annotation Processor&#xff09;&#xff0c;介绍如何编写注解处理器&#xff0c;并结合大厂的最佳实践和面试题详细解析其…...

C语言 | Leetcode C语言题解之第441题排列硬币

题目&#xff1a; 题解&#xff1a; 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) 是一种远程桌面协议&#xff0c;可以让你通过网络访问服务器的图形界面。 TurboVNC&#xff1a;专为图形密集型应用设计&#xff0c;尤其适合 3D 可视化和高分辨率图像的远程传输…...

【网络安全】身份认证

1. 身份认证 1.1 定义 身份认证&#xff08;Authentication&#xff09;是确认用户身份的过程&#xff0c;确保只有授权的用户才能访问系统或资源。它通常涉及验证用户提供的凭证&#xff0c;如密码、生物特征或其他识别标志。 1.2 重要性 身份认证是信息安全的第一道防线&…...

LeetCode - #124 二叉树中的最大路径和(Top 100)

文章目录 前言1. 描述2. 示例3. 答案关于我们前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 123 期…...

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序&#xff1a;所谓的排序&#xff0c;就是使一串记录&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个…...

How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024)概览

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 How FAR ARE WE FROM AGI?官网 How FAR ARE WE FROM AGI?&#xff08;ICLR AGI Workshop 2024&#xff09; 该研讨会将于2024年5月11日在奥地利维也纳以混合模式举行&#xff0c;作为 ICLR 2024年会议的一部…...

leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.不同的二叉搜索树)

62.不同路径 机器人从(0 , 0) 位置出发&#xff0c;到(m - 1, n - 1)终点。 动规五部曲 1、确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] &#xff1a;表示从&#xff08;0 &#xff0c;0&#xff09;出发&#xff0c;到(i, j) 有dp[i][j]条不同的路…...

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…...

matlab-批处理图像质量变化并形成折线图 (PSNR)

%修改路径就能用&#xff0c;图片分辨率要一致 %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&#xff1a;最早的Java日志框架之一&#xff0c;由Apache基金会发起&#xff0c;提供灵活而强大的日志记录机制JDK自带的日志框架&#xff1a;java.util.logging.Logg&#xff0c;是JDK1.4之后提供的日志API&#xff0c;已淘汰logback&#xff1a; logback一个开源的日志…...

Google BigTable架构详解

文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统&#xff0c;用于管理大规模…...

【python】如何切换ipynb的kernel至指定conda环境

需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后&#xff0c;打开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…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...