当前位置: 首页 > 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;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...