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

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;}
}

四、关键差异总结

对比维度HttpServletRequestHttpServletResponse
数据流向服务器接收客户端数据服务器向客户端发送数据
操作方法信息读取类方法(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&#xff08;请求对象&#xff09;HttpServletResponse&#xff08;响应对象&#xff09;本质客户端发给服务器的 HTTP 请求信息&#xff08;输入&#xff09;服务器返回客户端的 HTTP 响应信息&#xff08;输出&#xff09;生命周期一…...

树莓派学习(一)——3B+环境配置与多用户管理及编程实践

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

Mysql安装方式

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

Vue3实战学习(Vue3的基础语法学习与使用(超详细))(3)

目录 &#xff08;1&#xff09;Vue3工程环境准备、项目基础脚手架搭建详细教程。(博客链接) &#xff08;2&#xff09;Vue3的基础语法学习与使用。 &#xff08;1&#xff09;"{{}}"绑定数据。 <1>ref()函数定义变量——绑定数据。 <2>reactive({...})…...

使用websocket,注入依赖service的bean为null

问题&#xff1a;依赖注入失败&#xff0c;service获取不到&#xff0c;提示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 文档中插入新的页面的需求&#xff0c;比如在 Word 文档末尾插入一个广告页、给 Word 文档插入一个说明封面&#xff0c;在 Word 文档的中间位置插入新的页面等等。相信这个操作对于大部分小伙伴来说都不难&#xff0c;难的是同时给多个 Word 文档插…...

算法系列之滑动窗口

算法系列之滑动窗口 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2:输入: s "bbbbb"…...

【C#】详解C#中的内存管理机制

文章目录 前言一、C#内存管理的基本机制&#xff08;1&#xff09;托管堆&#xff08;Managed Heap&#xff09;&#xff08;2&#xff09;垃圾回收&#xff08;Garbage Collection&#xff09;&#xff08;3&#xff09;栈内存 二、 开发者需要主动管理的场景&#xff08;1&am…...

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…...

《DeepSeek MoE架构下,动态专家路由优化全解析》

在人工智能飞速发展的当下&#xff0c;模型架构的创新与优化始终是推动技术进步的关键力量。DeepSeek的混合专家模型&#xff08;MoE&#xff09;架构&#xff0c;以其独特的设计理念和卓越的性能表现&#xff0c;在大模型领域崭露头角。而其中的动态专家路由优化技术&#xff…...

Android双亲委派

下面是一份 Android 类加载器双亲委派机制的时序图示例&#xff0c;描述了当应用调用 loadClass() 时&#xff0c;各个加载器之间的委派过程。 #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语言为中文方法一&#xff08;仅一次性&#xff09;方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...

【商城实战(13)】购物车价格与数量的奥秘

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

Spring使用@Scheduled注解的参数详解

在现代Java开发中&#xff0c;定时任务是一个常见的需求。Spring框架提供了Scheduled注解&#xff0c;让我们能够以简单、直观的方式定义和管理这些定时任务。接下来&#xff0c;我们来深入探讨这个注解的使用&#xff0c;以及它的参数都有哪些含义和作用。 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是一个软件&#xff0c;使用Git和Markdown来编排书本&#xff1b; GitBook helps you pushlish beautiful …...

创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程

环境&#xff1a; node v20.18.0 npm 11.1.0 用到的所有依赖&#xff1a; "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...

FPGA 实验报告:四位全加器与三八译码器仿真实现

目录 安装Quartus软件 四位全加器 全加器、半加器 半加器&#xff1a; 全加器&#xff1a; 四位全加器电路图 创建项目 半加器 全加器 四位全加器 代码实现 半加器 全加器 四位全加器 三八译码器 创建项目 代码展示 modelsim仿真波形图 四位全加器 三八译码…...

动态规划详解(二):从暴力递归到动态规划的完整优化之路

目录 一、什么是动态规划&#xff1f;—— 从人类直觉到算法思维 二、暴力递归&#xff1a;最直观的问题分解方式 1. 示例&#xff1a;斐波那契数列 2. 递归树分析&#xff08;以n5为例&#xff09; 3. 问题暴露 三、第一次优化&#xff1a;记忆化搜索&#xff08;Memoiza…...

两阶段目标检测器核心原理与流程详解

两阶段目标检测器的核心思想是&#xff1a;第一阶段先找候选区域&#xff0c;第二阶段再对候选区域做分类和精修。典型代表是&#xff1a; R-CNN Fast R-CNN Faster R-CNN Mask R-CNN现在最典型的是 Faster R-CNN / Mask R-CNN&#xff0c;所以我以它为主来讲。1. 两阶段目标检…...

CircuitPython库管理实战:从安装优化到API深度应用

1. 项目概述与核心价值在嵌入式硬件开发的世界里&#xff0c;CircuitPython以其极低的入门门槛和“即写即得”的交互体验&#xff0c;成为了连接创意与现实的绝佳桥梁。无论是点亮第一颗LED&#xff0c;还是驱动复杂的传感器网络&#xff0c;其丰富的库生态系统都是项目成功的基…...

ECC 从安装到精通

一句话&#xff1a;从零安装 ECC&#xff0c;手把手构建一个 CLI TODO 工具&#xff0c;走完完整的 AI 辅助开发工作流。为什么要用 ECC Claude Code 原生能力很强&#xff0c;但缺乏一套系统级的开发工具链。ECC&#xff08;Everything Claude Code&#xff09;就是这层补充—…...

前后端分离项目避坑指南:为什么你的网关CORS配置了还是报跨域错误?

前后端分离项目避坑指南&#xff1a;为什么你的网关CORS配置了还是报跨域错误&#xff1f; 在前后端分离架构中&#xff0c;跨域资源共享&#xff08;CORS&#xff09;问题一直是开发者绕不开的"拦路虎"。即便在网关层正确配置了CORS规则&#xff0c;开发者仍可能遇到…...

当SuperPoint遇上C++ LibTorch:手把手教你将PyTorch视觉模型部署到生产环境(避坑实录)

SuperPoint与LibTorch的C工程化实战&#xff1a;从Python研究到生产部署的深度解析 在计算机视觉领域&#xff0c;PyTorch因其灵活性和易用性成为研究人员的首选框架&#xff0c;但当模型需要部署到生产环境时&#xff0c;C的高效性和稳定性往往成为必选项。本文将深入探讨如何…...

从游戏显卡到专业GIS:如何为你的SuperMap三维场景挑选并调校一张合适的显卡

从游戏显卡到专业GIS&#xff1a;如何为你的SuperMap三维场景挑选并调校一张合适的显卡 在数字孪生和智慧城市建设的浪潮中&#xff0c;三维GIS平台正成为空间数据分析的核心工具。SuperMap作为国产GIS软件的领军者&#xff0c;其三维模块对硬件性能的需求常常让技术决策者陷入…...

选择智能体框架:LangChain、AutoGen、CrewAI、Dify对比

去年秋天&#xff0c;我们团队准备上一个新项目&#xff0c;一个可以为客户自动生成月度运营分析报告的智能体。需求不复杂&#xff0c;就是每周从数据库里拉点数据&#xff0c;跑一下趋势分析&#xff0c;最后产出一个带图表和结论的PDF。 我那时候刚花了三个月时间把LangCha…...

告别手动标注!R语言ggplot2+ggannotate高效绘制组间差异柱状图保姆级教程

R语言科研绘图革命&#xff1a;ggplot2ggannotate自动化差异标注全攻略 科研图表的美观程度直接影响论文的第一印象&#xff0c;而统计显著性标注更是数据可视化的灵魂所在。传统手动添加p值和星号的方式不仅效率低下&#xff0c;还容易出错——标注位置偏移、字体大小不一、连…...

基于SpringBoot的民宿预订与评价系统毕业设计

博主介绍&#xff1a;✌ 专注于Java,python,✌关注✌私信我✌具体的问题&#xff0c;我会尽力帮助你。一、研究目的本研究旨在构建一个基于Spring Boot与Vue框架的民宿预订与评价系统以解决当前旅游住宿服务领域存在的信息不对称问题用户体验碎片化问题以及数据管理分散化问题该…...

RK3588/RK1820嵌入式AI模型选型与部署实战:9大模型场景化应用指南

1. 项目概述&#xff1a;嵌入式AI模型部署的十字路口作为一名在嵌入式AI领域摸爬滚打了十多年的老兵&#xff0c;我见过太多项目在模型部署这个环节上栽跟头。大家手里可能都握着RK3588、RK182X这类性能强悍的瑞芯微平台&#xff0c;硬件算力摆在那里&#xff0c;但真要把一个A…...