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 响应信息(输出)生命周期一…...

树莓派学习(一)——3B+环境配置与多用户管理及编程实践
树莓派学习(一)——3B环境配置与多用户管理及编程实践 一、实验目的 掌握树莓派3B无显示器安装与配置方法。学习Linux系统下多用户账号的创建与管理。熟悉在树莓派上使用C语言和Python3编写简单程序的方法。 二、实验环境 硬件设备:树莓派…...

Mysql安装方式
方式一:安装包安装 下载安装包 官网直接下载:https://dev.mysql.com/downloads/ 安装配置 2.1、双击刚刚下载好的msi文件,开始安装MySQL。 2.2、选择自定义模式Custom安装 2.3、点击选择自己电脑对应的mysql安装目录 2.5、继续点击下一步&…...

Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)
目录 (1)Vue3工程环境准备、项目基础脚手架搭建详细教程。(博客链接) (2)Vue3的基础语法学习与使用。 (1)"{{}}"绑定数据。 <1>ref()函数定义变量——绑定数据。 <2>reactive({...})…...
使用websocket,注入依赖service的bean为null
问题:依赖注入失败,service获取不到,提示null 这是参考代码 package com.shier.ws;import cn.hutool.core.date.DateUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.google.gson.Gson; import com.s…...

批量在 Word 的指定位置插入页,如插入封面、末尾插入页面
我们经常会碰到需要在 Word 文档中插入新的页面的需求,比如在 Word 文档末尾插入一个广告页、给 Word 文档插入一个说明封面,在 Word 文档的中间位置插入新的页面等等。相信这个操作对于大部分小伙伴来说都不难,难的是同时给多个 Word 文档插…...

算法系列之滑动窗口
算法系列之滑动窗口 题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:输入: s "bbbbb"…...
【C#】详解C#中的内存管理机制
文章目录 前言一、C#内存管理的基本机制(1)托管堆(Managed Heap)(2)垃圾回收(Garbage Collection)(3)栈内存 二、 开发者需要主动管理的场景(1&am…...

C/S架构与B/S架构
一、定义与核心区别 C/S架构(Client/Server,客户端/服务器) 客户端需安装专用软件(如QQ、企业ERP系统),直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点:客户端承担部分计算任务…...
《DeepSeek MoE架构下,动态专家路由优化全解析》
在人工智能飞速发展的当下,模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型(MoE)架构,以其独特的设计理念和卓越的性能表现,在大模型领域崭露头角。而其中的动态专家路由优化技术ÿ…...
Android双亲委派
下面是一份 Android 类加载器双亲委派机制的时序图示例,描述了当应用调用 loadClass() 时,各个加载器之间的委派过程。 #mermaid-svg-rBdlhpD2uRjBPiG8 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mer…...
go语言因为前端跨域导致无法访问到后端解决方案
前端服务8080访问后端8081这端口显示跨域了 ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/A…...

Jmeter使用介绍
文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一(仅一次性)方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...
【商城实战(13)】购物车价格与数量的奥秘
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
Spring使用@Scheduled注解的参数详解
在现代Java开发中,定时任务是一个常见的需求。Spring框架提供了Scheduled注解,让我们能够以简单、直观的方式定义和管理这些定时任务。接下来,我们来深入探讨这个注解的使用,以及它的参数都有哪些含义和作用。 Scheduled注解可以…...

【网络】HTTP协议、HTTPS协议
HTTP与HTTPS HTTP协议概述 HTTP(超文本传输协议):工作在OSI顶层应用层,用于客户端(浏览器)与服务器之间的通信,B/S模式 无状态:每次请求独立,服务器不保存客户端状态(通过Cookie/Session扩展状态管理)。基于TCP:默认端口80(HTTP)、443(HTTPS),保证可靠传输。请…...

【Windows下Gitbook快速入门使用】
Windows下Gitbook快速入门使用 1 工具安装1.1 Node.js下载安装1.1 环境变量1.2 npm配置1.3 安装gitbook 2 gitbook使用2.1 gitbook 无法执行2.2 gitbook常用命令 Gitbook是一个软件,使用Git和Markdown来编排书本; GitBook helps you pushlish beautiful …...
创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程
环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...

FPGA 实验报告:四位全加器与三八译码器仿真实现
目录 安装Quartus软件 四位全加器 全加器、半加器 半加器: 全加器: 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...

动态规划详解(二):从暴力递归到动态规划的完整优化之路
目录 一、什么是动态规划?—— 从人类直觉到算法思维 二、暴力递归:最直观的问题分解方式 1. 示例:斐波那契数列 2. 递归树分析(以n5为例) 3. 问题暴露 三、第一次优化:记忆化搜索(Memoiza…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...