HttpServletRequest 和 HttpServletResponse 区别和作用
一、核心作用对比
| 对象 | HttpServletRequest(请求对象) | HttpServletResponse(响应对象) |
|---|---|---|
| 本质 | 客户端发给服务器的 HTTP 请求信息(输入) | 服务器返回客户端的 HTTP 响应信息(输出) |
| 生命周期 | 一次 HTTP 请求中创建,请求处理完成后销毁 | 同左 |
| 获取方式 | 由 Servlet 容器自动注入(如 doGet(request, response)) | 同左 |
| 核心功能 | 读取请求参数、头信息、会话数据等 | 设置响应状态、头信息、返回内容等 |
二、关键方法与示例
(一)HttpServletRequest - 请求信息读取器
(一)HttpServletRequest - 请求信息读取器
主要方法及使用场景:
| 方法 | 作用 | 示例场景 |
|---|---|---|
String getParameter(String name) | 获取 URL参数 或 表单参数 | 用户注册表单的 username 字段 |
Enumeration<String> getParameterNames() | 获取所有请求参数名 | 调试时打印全部参数 |
String[] getParameterValues(String name) | 获取同名参数的多个值(复选框等) | 多选的兴趣爱好 |
String getHeader(String name) | 获取请求头信息 | 获取设备类型 User-Agent |
Cookie[] getCookies() | 获取客户端的 Cookies | 自动登录功能 |
HttpSession getSession() | 获取或创建会话对象 | 保存用户登录状态 |
String getRequestURI() | 获取请求路径(不包含协议和域名) | 记录请求日志 |
StringBuffer getRequestURL() | 获取完整请求 URL | 生成重定向地址 |
代码示例 - 传统 Servlet 中读取请求参数:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {// 获取单个参数String username = request.getParameter("username");// 获取多选参数String[] hobbies = request.getParameterValues("hobby");// 获取请求头String userAgent = request.getHeader("User-Agent");// 获取所有参数名(调试用)Enumeration<String> params = request.getParameterNames();while (params.hasMoreElements()) {String paramName = params.nextElement();System.out.println(paramName);}
}
(二)HttpServletResponse - 响应信息控制器
主要方法及使用场景:
| 方法 | 作用 | 示例场景 |
|---|---|---|
void setStatus(int sc) | 设置 HTTP 状态码 | 返回错误码 404 |
void sendError(int sc, String msg) | 发送错误状态码及描述信息 | 参数校验失败时返回 400 |
void setHeader(String name, String value) | 设置响应头信息 | 跨域支持(CORS) |
void addCookie(Cookie cookie) | 添加 Cookie | 记住用户语言偏好 |
PrintWriter getWriter() | 获取文本输出流 | 返回 JSON/HTML 内容 |
ServletOutputStream getOutputStream() | 获取二进制输出流 | 返回图片/文件下载 |
void sendRedirect(String location) | 重定向到新 URL | 登录成功后跳转首页 |
void setContentType(String type) | 设置内容类型(MIME 类型) | application/json 或 image/png |
代码示例 - 自定义响应头和返回二进制内容:
protected void doGet(HttpServletRequest request, HttpServletResponse response) {// 设置响应类型为图片response.setContentType("image/png");// 设置缓存头(缓存1小时)response.setHeader("Cache-Control", "max-age=3600");// 返回二维码图片字节流try (OutputStream out = response.getOutputStream()) {byte[] qrCode = generateQRCode("https://example.com");out.write(qrCode);} catch (IOException e) {response.sendError(500, "生成二维码失败");}
}
三、Spring MVC 中的实际应用
示例 1:RESTful API 参数接收
@RestController
@RequestMapping("/api")
public class UserApiController {// 获取查询参数和请求头@GetMapping("/user")public ResponseEntity<User> getUser(@RequestParam("id") Long userId,@RequestHeader("Authorization") String token) {// 验证Token逻辑if (!validateToken(token)) {return ResponseEntity.status(401).build();}User user = userService.findById(userId);return ResponseEntity.ok(user);}
}
示例 2:文件上传与重定向
@Controller
public class FileUploadController {@PostMapping("/upload")public String uploadFile(@RequestParam("file") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws IOException {// 检查文件大小if (file.getSize() > 10_000_000) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST);return "error/400"; }fileService.save(file);// 重定向到结果页response.sendRedirect("/upload-success");return null;}
}
四、关键差异总结
| 对比维度 | HttpServletRequest | HttpServletResponse |
|---|---|---|
| 数据流向 | 服务器接收客户端数据 | 服务器向客户端发送数据 |
| 操作方法 | 信息读取类方法(getXxx) | 数据写入类方法(setXxx/sendXxx) |
| 内容处理 | 解析请求 URL、参数、头信息 | 设置响应状态、头信息、写入正文内容 |
| 生命周期 | 请求到达时创建,响应结束后销毁 | 同左 |
五、常见问题解答
问题 1:为何要同时使用这两个对象?
在一个完整的 HTTP 交互中:
HttpServletRequest: 了解客户端的请求细节(要什么)HttpServletResponse: 构建服务器返回的响应(给什么)
协作流程示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {// 1. 通过request获取数据String input = request.getParameter("input");// 2. 业务处理String result = process(input);// 3. 通过response返回结果response.setContentType("text/plain");response.getWriter().write(result);
}
问题 2:如何在 Spring 中优雅地使用它们?
- 最佳实践原则:优先使用 Spring 的抽象方式(如
@RequestParam、@ResponseBody),必要时再直接操作原生对象。
@RestController
public class ModernController {// 通过注解自动映射参数@GetMapping("/search")public List<Product> searchProducts(@RequestParam String keyword, // 自动从请求参数获取@CookieValue("sessionId") String sessionId,HttpServletResponse response) { // 需要设置Cookie时使用response.addCookie(new Cookie("lastSearch", keyword));return productService.search(keyword); // 自动转JSON}
}
总结
HttpServletRequest:客户端 → 服务器的信息桥梁,用于读取请求数据。HttpServletResponse:服务器 → 客户端的信息出口,用于构造响应。- 核心技巧:在传统 Servlet 开发中直接使用它们,在 Spring 开发中优先通过注解简化操作,必要时才直接操作原生对象。
相关文章:
HttpServletRequest 和 HttpServletResponse 区别和作用
一、核心作用对比 对象HttpServletRequest(请求对象)HttpServletResponse(响应对象)本质客户端发给服务器的 HTTP 请求信息(输入)服务器返回客户端的 HTTP 响应信息(输出)生命周期一…...
国家二级运动员证书有什么用·棒球1号位
以棒球运动为例,国家二级棒球运动员证书是由中国国家体育总局颁发的运动员技术等级认证,主要作用体现在以下几个方面: 一、升学优势 体育特招资格:符合条件者可报考高校高水平运动队或体育单招,部分院校对二级运动员有…...
Windsuf 连接失败问题:[unavailable] unavailable: dial tcp...
问题描述 3月6日,在使用Windsuf 时,遇到以下网络连接错误: [unavailable] unavailable: dial tcp 35.223.238.178:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of…...
docker中kibana启动后,通过浏览器访问,出现server is not ready yet
问题:当我在浏览器访问kibana时,浏览器给我报了server is not ready yet. 在网上试了很多方法,都未能解决,下面是我的方法: 查看kibana日志: docker logs -f kibana从控制台打印的日志可以发现ÿ…...
更多文章请查看
更多文章知识请移步至下面链接,期待你的关注 如需查看新文章,请前往: 博主知识库https://www.yuque.com/xinzaigeek...
(十 九)趣学设计模式 之 中介者模式!
目录 一、 啥是中介者模式?二、 为什么要用中介者模式?三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,…...
博弈论算法
一、减法游戏 初始有一个数 n。 两个玩家轮流操作,每次可以减去 1 到 9 之间的任意整数。 将数减到 0 的玩家获胜。 可以发现规律: 减法游戏只需要判断当前数取模是否为0,即可快速判断胜负。 例题: Leetcode 292. Nim 游戏 …...
【网络】HTTP协议、HTTPS协议
HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通…...
GitCode 助力 vue3-element-admin:开启中后台管理前端开发新征程
源码仓库: https://gitcode.com/youlai/vue3-element-admin 后端仓库: https://gitcode.com/youlai/youlai-boot 开源助力,开启中后台快速开发之旅 vue3-element-admin 是一款精心打造的免费开源中后台管理前端模板,它紧密贴合…...
网络HTTP
HTTP Network Request Library A Retrofit-based HTTP network request encapsulation library that provides simple and easy-to-use API interfaces with complete network request functionality. 基于Retrofit的HTTP网络请求封装库,提供简单易用的API接口和完…...
Qt常用控件之表格QTableWidget
表格QTableWidget QTableWidget 是一个表格控件,行和列交汇形成的每个单元格,是一个 QTableWidgetItem 对象。 1. QTableWidget属性 QTableWidget 的属性只有两个: 属性说明rowCount当前行的个数。columnCount当前列的个数。 2. QTableW…...
FFmpeg入门:最简单的音视频播放器
FFmpeg入门:最简单的音视频播放器 前两章,我们已经了解了分别如何构建一个简单和音频播放器和视频播放器。 FFmpeg入门:最简单的音频播放器 FFmpeg入门:最简单的视频播放器 本章我们将结合上述两章的知识,看看如何融…...
【Python爬虫】爬取公共交通路网数据
程序来自于Github,以下这篇博客作为完整的学习记录,也callback上一篇爬取公共交通站点的博文。 Bardbo/get_bus_lines_and_stations_data_from_gaode: 这个项目是基于高德开放平台和公交网获取公交线路及站点数据,并生成shp文件,…...
009---基于Verilog HDL的单比特信号边沿检测
文章目录 摘要一、边沿检测二、时序逻辑实现2.1 rtl2.2 tb 三、组合逻辑实现3.1 rtl3.2 tb 摘要 文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。 一、边沿检测 边沿检测…...
Trae IDE新建C#工程
目录 1 结论 2 项目结构 3 项目代码 1 结论 新建C#工程来说,Trae的Chat比DeepSeek的Coder好用。 2 项目结构 MyWinFormsApp/ │ ├── Program.cs ├── Form1.cs ├── Form1.Designer.cs ├── MyResources/ │ └── MyResources.resx └── MyWin…...
前端快速搭建Node服务(解决跨域问题)
服务搭建应用场景 前端模块化基本成为了不可或缺的一步了,最近学习的时候,使用了EsModule语法,但使用import和export,会产生跨域问题,故自己本地搭建一个服务(不需要下载npm包),一步…...
三、0-1搭建springboot+vue3前后端分离-idea新建springboot项目
一、ideal新建项目1 ideal新建项目2 至此父项目就创建好了,下面创建多模块: 填好之后点击create 不删了,直接改包名,看自己喜欢 修改包名和启动类名: 打开ServiceApplication启动类,修改如下: …...
Unity光照之Halo组件
简介 Halo 组件 是一种用于在游戏中创建光晕效果的工具,主要用于模拟光源周围的发光区域(如太阳、灯泡等)或物体表面的光线反射扩散效果。 核心功能 1.光晕生成 Halo 组件会在光源或物体的周围生成一个圆形光晕,模拟光线在空气…...
电容与电感以及其典型的电路
一、电容与电感的基本关系 1. 定义公式 电容(C,单位:法拉F) C Q / V (电荷量Q与电压V的比值) 电感(L,单位:亨利H) L Φ / I (磁通链Φ与电流I…...
在昇腾GPU上部署DeepSeek大模型与OpenWebUI:从零到生产的完整指南
引言 随着国产AI芯片的快速发展,昇腾(Ascend)系列GPU凭借其高性能和兼容性,逐渐成为大模型部署的重要选择。本文将以昇腾300i为例,手把手教你如何部署DeepSeek大模型,并搭配OpenWebUI构建交互式界面。无论…...
递归专题刷题
文章目录 递归合并两个有序链表题解代码 反转链表题解代码 两两交换链表中的节点题解代码 Pow(x, n)(快速幂)题解代码汉诺塔题解代码 总结 递归 1. 重复的子问题宏观看待递归问题 合并两个有序链表 题目链接 题解 1. 重复的子问题 -> 函数头的设…...
电商项目-秒杀系统(四)秒杀异步下单防止重复秒杀
一、 防止恶意刷单解决 在生产场景下,可能会有一些人会恶意访问当前网站,来进行恶意的刷单。这样会造成当前系统出现一些业务上的业务混乱,出现脏数据,或者造成后端访问压力大等问题。 一般要解决这个问题的话,前端可…...
Android Studio 一直 Loading devices
https://stackoverflow.com/questions/71013971/android-studio-stuck-on-loading-devices...
摄相机标定的基本原理
【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型: 定义: 内参:就像相机的“眼睛”。它描述了相机内部的特性,比如焦距(镜头的放…...
CentOS 7 安装 Redis6.2.6
获取资源、下载安装 Redis6.2.6 安装Redis6.2.6 上传到服务器或直接下载(wget http://download.redis.io/releases/redis-6.2.6.tar.gz)、再解压安装 tar -zxvf redis-6.2.6.tar.gz 进入redis解压目录 cd redis-6.2.6先编译 make再执行安装 make PREFI…...
在CentOS系统上安装Conda的详细指南
前言 Conda 是一个开源的包管理系统和环境管理系统,广泛应用于数据科学和机器学习领域。本文将详细介绍如何在 CentOS 系统上安装 Conda,帮助您快速搭建开发环境。 准备工作 在开始安装之前,请确保您的 CentOS 系统已经满足以下条件&#x…...
3D数字化:家居行业转型升级的关键驱动力
在科技日新月异的今天,家居行业正经历着一场前所未有的变革。从传统的线下实体店铺到线上电商平台的兴起,再到如今3D数字化营销的广泛应用,消费者的购物体验正在发生翻天覆地的变化。3D数字化营销不仅让购物变得更加智能和便捷,还…...
CSS—补充:CSS计数器、单位、@media媒体查询
目录 1. CSS计数器 嵌套计数器: 对列表元素: 2.单位 绝对长度: 相对长度: 3.media媒体查询 1. CSS计数器 CSS 计数器就像“变量”。变量值可以通过 CSS 规则递增(将跟踪它们的使用次数)。 如需使用…...
【JAVA架构师成长之路】【电商系统实战】第10集:电商秒杀系统实战(流量削峰 + 库存预热 + 请求排队)
30分钟课程:电商秒杀系统实战(流量削峰 库存预热 请求排队) 课程目标 掌握秒杀系统核心架构设计:流量削峰、库存预热、请求排队。实现基于 Redis 的令牌桶限流与库存原子扣减。通过 Redis List 或 Kafka 实现高并发请求的异步处…...
无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法
视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可将上传的点播…...
