当前位置: 首页 > 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…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...