Response 和 Request 介绍
怀旧网个人博客网站地址:怀旧网,博客详情:Response 和 Request 介绍

1、HttpServletResponse
1、简单分类


2、文件下载

通过Response下载文件数据
放一个文件到resources目录

编写下载文件Servlet文件
public class FileDownServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 1.获取要下载文件的路径String filePath = "D:\\Java Web\\JavaWebDemo\\ServletDemo\\src\\main\\resources\\1.png";// 2.获取文件的下载名(客户端下载保存的时候的名字)String downFileName = filePath.substring(filePath.lastIndexOf("\\")+1);// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码resp.setHeader("Content-Disposition", "attachment;filename=" + downFileName);// 4.获取下载文件的输入流FileInputStream fis = new FileInputStream(filePath);// 5.创建缓冲区int len;byte[] buffer = new byte[1024];// 6.获取OutputStream对象ServletOutputStream sos = resp.getOutputStream();// 7.将文件流输出到ServletOutputStream中while((len = fis.read(buffer)) != -1){// 8.将数据输出到客户端sos.write(buffer, 0, len);}// 9.关闭文件的输入输出流sos.close();fis.close();}
}
编写下载映射xml
<servlet><servlet-name>downFile</servlet-name><servlet-class>com.huaijiuwang.servlet.FileDownServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>downFile</servlet-name><url-pattern>/downFile</url-pattern>
</servlet-mapping>
访问测试:localhost:8080/downFile

下载成功(再次测试下载文件名为中文情况)
修改代码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + "怀旧.png");
访问测试:

文件名输出失败,修改代码,设置下载文件的编码
// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("怀旧.png", "utf-8"));
再次测试:

显示成功!
3、验证码功能
实现目的:在浏览器端创建一个图片生成验证码,让图片3秒刷新一次:
编写Servlet:
public class ToImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {// 设置浏览器3秒刷新一次resp.setHeader("refresh", "3");// 在内存中创建一个图片对象 · 参数(1.图片宽度 2. 图片长度 3.图片颜色渲染类型)BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);// 得到图片对象Graphics2D graphics = (Graphics2D) image.getGraphics();// 设置图片的背景颜色graphics.setColor(Color.WHITE);graphics.fillRect(0, 0, 80, 20);// 给图片写入数据// 设置当前画笔颜色graphics.setColor(Color.GREEN);// 设置当前画笔字体graphics.setFont(new Font(null, Font.BOLD, 20));// 设置当前的内容graphics.drawString(getData(), 0, 20);// 响应浏览器,当前界面以图片形式打开resp.setContentType("image/jpeg");// 将当前图片输出到前端ImageIO.write(image, "jpg", resp.getOutputStream());}public static String getData(){Random random = new Random();return String.format("%06d", random.nextInt(999999));}
}
编写访问映射xml
<servlet><servlet-name>image</servlet-name><servlet-class>com.huaijiuwang.servlet.ToImageServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>image</servlet-name><url-pattern>/image</url-pattern>
</servlet-mapping>
访问测试:


格3秒就自动刷新
4、实现重定向


编写代码实现重定向:
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("/image");}
}
编写访问映射文件
<servlet><servlet-name>Redirect</servlet-name><servlet-class>com.huaijiuwang.servlet.RedirectServlet</servlet-class>
</servlet><servlet-mapping><servlet-name>Redirect</servlet-name><url-pattern>/red</url-pattern>
</servlet-mapping>
访问测试:


自动重定向到了image路径
修改tomcat配置


添加一个前缀
重新测试重定向
访问路径:localhost:8080/hj/red 结果如下,重定向的地址没有带hj前缀,所以找不到

因为访问image需要带上hj前缀

这样就可以访问了,所以在重定向的时候,我们需要加上前面的前缀才可以,修改代码
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect(this.getServletContext().getContextPath() + "/image");}
}
再次访问localhost:8080/hj/red,得到结果如下

重定向成功,并且带上了前缀
并且状态为302代表重定向,并且url也改变了

2、HttpServletRequest
1、HttpServletRequest 介绍
-
HttpServletRequest 对象代表客户端的请求
-
当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中
-
通过这个对象的方法,可以获得客户端这些信息
2、HttpServletRequest 常用方法
-
getRequestURI() 获取请求的资源路径
-
getRequestURL()获取请求的统一资源定位符(绝对路径)
-
getRemoteHost() 获取客户端的 主机, getRemoteAddr()
-
getHeader() 获取请求头
-
getParameter() 获取请求的参数
-
getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组
-
getMethod() 获取请求的方式 GET 或 POST
-
setAttribute(key, value); 设置域数据
-
getAttribute(key); 获取域数据
-
getRequestDispatcher() 获取请求转发对象, 请求转发的核心对象
3、测试Request获取前端数据
编写处理登录请求的servlet
public class RequestTestServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取用户输入的数据String userName = req.getParameter("userName");String passWord = req.getParameter("passWord");// 判断用户输入if("huaijiu".equals(userName) && "123456".equals(passWord)){// 登录成功重定向success地址resp.sendRedirect(this.getServletContext().getContextPath() + "/success.jsp");}else{// 登录失败重定向error地址resp.sendRedirect(this.getServletContext().getContextPath() + "/error.jsp");}}
}
编写重定向成功或者失败地址:



添加jsp所需maven依赖
<dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version>
</dependency>
编写发起请求的jsp代码 (index.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>登录</title></head><body>
<%-- "${pageContext.request.contextPath} 获取前缀访问路径/hj--%><form action="${pageContext.request.contextPath}/login" method="get"><input style="font-size: 20px;" type="text" name="userName" /><br /><input style="font-size: 20px;" type="password" name="passWord" /><br /><input type="submit" value="登录" /></form></body>
</html>
访问测试:
输入错误的用户名或密码


成功重定向到了登录失败界面
输入正确的用户名密码


返回到登录成功的界面。
4 、HttpServletRequest 获取参数,请求转发


和对应的response基本就是相对的
获取参数:

常用的就两个:
- getParameter() 获取一个参数数据
- getParameterValues() 当传过来的一个数据名称但是数据多个的时候,可以用这个方法,例如前端传过来的多选框
4.1、测试获取参数
编写前端代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>登录</title></head><body>
<%-- "${pageContext.request.contextPath} 获取前缀访问路径/hj--%><form action="${pageContext.request.contextPath}/login" method="post">用户名:<input style="font-size: 20px;" type="text" name="userName" /><br />密码:<input style="font-size: 20px;" type="password" name="passWord" /><br />爱好:<input type="checkbox" value="学习" name="hobby" />学习<input type="checkbox" value="唱歌" name="hobby" />唱歌<input type="checkbox" value="跳舞" name="hobby" />跳舞<input type="checkbox" value="篮球" name="hobby" />篮球<br /><input type="submit" value="登录" /></form></body>
</html>
后台获取数据代码:
public class RequestTestServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 获取一个数据String userName = req.getParameter("userName");String passWord = req.getParameter("passWord");// 获取多个值String[] hobbies = req.getParameterValues("hobby");// 打印输出结果System.out.println(userName + " : " + passWord);System.out.println(Arrays.toString(hobbies));}
}
请求前端提交输入信息:


成功请求,查看控制台的输出:

输出乱码:
解决乱码问题: 添加下面的代码到获取数据的签名
req.setCharacterEncoding("utf-8");
重新访问:

成功解决乱码问题:并且获取多条数据成功。
4.2、测试请求转发
添加转发代码:
// 信息获取成功,转发到成功登录的地址req.getRequestDispatcher(req.getContextPath() + "/success.jsp").forward(req, resp);
访问/login地址

发现请求地址前缀有两个hj所以找不到界面报错404
查看原因:
修改代码
req.getRequestDispatcher("/success.jsp").forward(req, resp);

修改代码完转发
- 原因就是因为 在转发的时候默认会自己带上当前请求的前缀
req.getRequestDispatcher("success.jsp").forward(req, resp);

同样转发成功.
- 在重定向的时候 url地址会发生变化 请求响应为 302
- 在转发的时候 url地址不会发生变化 请求响应为 307
相关文章:
Response 和 Request 介绍
怀旧网个人博客网站地址:怀旧网,博客详情:Response 和 Request 介绍 1、HttpServletResponse 1、简单分类 2、文件下载 通过Response下载文件数据 放一个文件到resources目录 编写下载文件Servlet文件 public class FileDownServlet exten…...
Spring常用注解和组件
引言 了解Spring常用注解的使用方式可以帮助我们更快速理解这个框架和其中的深度 注解 Configuration:表示该类是一个配置类,用于定义 Spring Bean。 EnableAutoConfiguration:启用 Spring Boot 的自动配置功能,让 Spring Boo…...
Spring中都应用了哪些设计模式?
好的!以下是您提到的八种设计模式在 Spring 中的简单示例: 1. 简单工厂模式 简单工厂模式通过传入参数来决定实例化哪个类。Spring 中的 BeanFactory 就是简单工厂模式的应用。 示例代码: // 1. 创建接口和具体实现类 public interface A…...
VSCode的安裝以及使用
c配置: 【MinGw-w64编译器套件】 https://blog.csdn.net/weixin_60915103/article/details/131617196?fromshareblogdetail&sharetypeblogdetail&sharerId131617196&sharereferPC&sharesourcem0_51662391&sharefromfrom_link Python配置: 【簡單ÿ…...
Datawhale 组队学习 Ollama教程 task1
一、Ollama 简介 比喻:Ollama 就像是一个“魔法箱子”,里面装满了各种大型语言模型(LLM)。你不需要懂复杂的魔法咒语(配置),只需要轻轻一按(一条命令),就能让…...
前端技术学习——ES6核心基础
1、ES6与JavaScript之间的关系 ES6是JavaScript的一个版本:JavaScript是基于ECMAScript规范实现的编程语言,而ES6(ECMAScript 2015)是该规范的一个具体版本。 2、ES6的基础功能 (1)let和const let用于声明…...
《DeepSeek技术应用与赋能运营商办公提效案例实操落地课程》
大模型算法实战专家—周红伟老师 法国科学院数据算法博士/曾任阿里巴巴人工智能专家/曾任马上消费企业风控负责人 课程背景 随着大模型技术的迅猛发展,企业面临着提升工作效率、降低运营成本和优化资源配置的巨大压力。DeepSeek做出十三项革命性的大模型技术突破…...
STM32-知识
一、Cortex-M系列双指针 Cortex-M系列的MSP与PSP有一些重要的区别,双指针是为了保证OS的安全性和稳健性。本质上,区别于用户程序使用PSP,操作系统和异常事件单独使用一个MSP指针的目的,是为了保证栈数据不会被用户程序意外访问或…...
线程同步(互斥锁与条件变量)
文章目录 1、为什么要用互斥锁2、互斥锁怎么用3、为什么要用条件变量4、互斥锁和条件变量如何配合使用5、互斥锁和条件变量的常见用法 参考资料:https://blog.csdn.net/m0_53539646/article/details/115509348 1、为什么要用互斥锁 为了使各线程能够有序地访问公共…...
Ubuntu指令学习(个人记录、偶尔更新)
Ubuntu指令学习 0、一点常用指令列表一、Ubuntu下复制与移动,cp/mv二、Ubuntu下echo 与 重定向>,>>三、Ubuntu下chmod,用户权限四、Ubuntu下的tar打包,gzip压缩五、Ubuntu(22.04)下系统语言为中文,切换主目录文件名为英文。六、Ubun…...
Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...
【经验分享】Linux 系统安装后内核参数优化
在 Linux 系统安装后,进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作: 修改/etc/sysctl.conf 文件 执行sysctl -p使配置生效。 kernel.shmmax 135185569792 kernel.shmall 4294967296 fs.aio-max-nr 3145728 fs.fi…...
linux统计文件夹下有多少个.rst文件行数小于4行
您可以使用 find 命令结合 wc 命令来统计文件夹下 .rst 文件行数小于 4 行的文件数量。以下是一个具体的命令示例: find /path/to/directory -name "*.rst" -type f -exec wc -l {} | awk $1 < 4 | wc -l解释: find /path/to/directory …...
使用开源项目xxl-cache构建多级缓存
xxl-cache简介 官网地址:https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架,高效组合本地缓存和分布式缓存(RedisCaffeine),支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力;拥有“高性…...
LVDS接口总结--(5)IDELAY3仿真
仿真参考资料如下: https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...
Vue3(1)
一.create-vue // new Vue() 创建一个应用实例 > createApp() // createRouter() createStore() // 将创建实例进行了封装,保证每个实例的独立封闭性import { createApp } from vue import App from ./App.vue// mount 设置挂载点 #app (id为app的盒子) createA…...
玩转适配器模式
文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…...
2.11寒假作业
web:[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的,随便输入进行看看 提示错误,看源码其中的js代码 这个代码很容易理解,要让输入的内容等于对应的字符串,显然直接复制粘贴是错的 这串字符看起来像是base64加密&…...
untiy 冰面与地面,物理材质的影响
效果 WeChat_20250211165601...
视频编解码标准中的 Profile 和 Level
视频编解码标准中的 Profile 和 Level 在视频编码标准(如 H.264/AVC、HEVC/H.265、H.266/VVC、AV1)中,Profile(配置文件) 和 Level(级别) 是两个重要的概念,它们用于定义编码器和解码器支持的特性、功能以及视频质量与编码效率之间的权衡。 Profile(配置文件) Pro…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
