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

Response 和 Request 介绍

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

image-20240328102158518

1、HttpServletResponse

1、简单分类

image-20240328102527294

image-20240328102448429

2、文件下载

image-20240328103202624

通过Response下载文件数据

放一个文件到resources目录

image-20240328111356039

编写下载文件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

image-20240328112811073

下载成功(再次测试下载文件名为中文情况)

修改代码

// 3.设置让浏览器能够支持(Content-Disposition)下载我们需要的文件,中文文件名URLEncoder。encode编码,否则可能会乱码
resp.setHeader("Content-Disposition", "attachment;filename=" + "怀旧.png");

访问测试:

image-20240328112919174

文件名输出失败,修改代码,设置下载文件的编码

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

再次测试:

image-20240328113051477

显示成功!

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>

访问测试:

image-20240328145830726

image-20240328145835396

格3秒就自动刷新

4、实现重定向

image-20240328150049470

image-20240328150226176

编写代码实现重定向:

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-20240328151426440

image-20240328151431687

自动重定向到了image路径

修改tomcat配置

image-20240328152034804

image-20240328152105670

添加一个前缀

重新测试重定向

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

image-20240328152222484

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

image-20240328152300583

这样就可以访问了,所以在重定向的时候,我们需要加上前面的前缀才可以,修改代码

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,得到结果如下

image-20240328152657060

重定向成功,并且带上了前缀

并且状态为302代表重定向,并且url也改变了

image-20240328151008093

2、HttpServletRequest

1、HttpServletRequest 介绍

  1. HttpServletRequest 对象代表客户端的请求

  2. 当客户端/浏览器通过 HTTP 协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中

  3. 通过这个对象的方法,可以获得客户端这些信息

2、HttpServletRequest 常用方法

  1. getRequestURI() 获取请求的资源路径

  2. getRequestURL()获取请求的统一资源定位符(绝对路径)

  3. getRemoteHost() 获取客户端的 主机, getRemoteAddr()

  4. getHeader() 获取请求头

  5. getParameter() 获取请求的参数

  6. getParameterValues() 获取请求的参数(多个值的时候使用), 比如 checkbox, 返回的数组

  7. getMethod() 获取请求的方式 GET 或 POST

  8. setAttribute(key, value); 设置域数据

  9. getAttribute(key); 获取域数据

  10. 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");}}
}

编写重定向成功或者失败地址:

image-20240328154141466

image-20240328154147583

image-20240328154152112

添加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>

访问测试:

输入错误的用户名或密码

image-20240328160242023

image-20240328160249246

成功重定向到了登录失败界面

输入正确的用户名密码

image-20240328160310174

image-20240328160313523

返回到登录成功的界面。

4 、HttpServletRequest 获取参数,请求转发

image-20240328163118352

image-20240328163126722

和对应的response基本就是相对的

获取参数:

image-20240328163213376

常用的就两个:

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

请求前端提交输入信息:

image-20240328163805605

image-20240328163811691

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

image-20240328163824286

输出乱码:

解决乱码问题: 添加下面的代码到获取数据的签名

 req.setCharacterEncoding("utf-8");

重新访问:

image-20240328163937844

成功解决乱码问题:并且获取多条数据成功。

4.2、测试请求转发

添加转发代码:

// 信息获取成功,转发到成功登录的地址req.getRequestDispatcher(req.getContextPath() + "/success.jsp").forward(req, resp);

访问/login地址

image-20240328164808558

发现请求地址前缀有两个hj所以找不到界面报错404

查看原因:

修改代码

req.getRequestDispatcher("/success.jsp").forward(req, resp);

image-20240328164603118

修改代码完转发

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

image-20240328164928380

同样转发成功.

  • 在重定向的时候 url地址会发生变化 请求响应为 302
  • 在转发的时候 url地址不会发生变化 请求响应为 307

相关文章:

Response 和 Request 介绍

怀旧网个人博客网站地址&#xff1a;怀旧网&#xff0c;博客详情&#xff1a;Response 和 Request 介绍 1、HttpServletResponse 1、简单分类 2、文件下载 通过Response下载文件数据 放一个文件到resources目录 编写下载文件Servlet文件 public class FileDownServlet exten…...

Spring常用注解和组件

引言 了解Spring常用注解的使用方式可以帮助我们更快速理解这个框架和其中的深度 注解 Configuration&#xff1a;表示该类是一个配置类&#xff0c;用于定义 Spring Bean。 EnableAutoConfiguration&#xff1a;启用 Spring Boot 的自动配置功能&#xff0c;让 Spring Boo…...

Spring中都应用了哪些设计模式?

好的&#xff01;以下是您提到的八种设计模式在 Spring 中的简单示例&#xff1a; 1. 简单工厂模式 简单工厂模式通过传入参数来决定实例化哪个类。Spring 中的 BeanFactory 就是简单工厂模式的应用。 示例代码&#xff1a; // 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配置: 【簡單&#xff…...

Datawhale 组队学习 Ollama教程 task1

一、Ollama 简介 比喻&#xff1a;Ollama 就像是一个“魔法箱子”&#xff0c;里面装满了各种大型语言模型&#xff08;LLM&#xff09;。你不需要懂复杂的魔法咒语&#xff08;配置&#xff09;&#xff0c;只需要轻轻一按&#xff08;一条命令&#xff09;&#xff0c;就能让…...

前端技术学习——ES6核心基础

1、ES6与JavaScript之间的关系 ES6是JavaScript的一个版本&#xff1a;JavaScript是基于ECMAScript规范实现的编程语言&#xff0c;而ES6&#xff08;ECMAScript 2015&#xff09;是该规范的一个具体版本。 2、ES6的基础功能 &#xff08;1&#xff09;let和const let用于声明…...

《DeepSeek技术应用与赋能运营商办公提效案例实操落地课程》

大模型算法实战专家—周红伟老师 法国科学院数据算法博士/曾任阿里巴巴人工智能专家/曾任马上消费企业风控负责人 课程背景 随着大模型技术的迅猛发展&#xff0c;企业面临着提升工作效率、降低运营成本和优化资源配置的巨大压力。DeepSeek做出十三项革命性的大模型技术突破…...

STM32-知识

一、Cortex-M系列双指针 Cortex-M系列的MSP与PSP有一些重要的区别&#xff0c;双指针是为了保证OS的安全性和稳健性。本质上&#xff0c;区别于用户程序使用PSP&#xff0c;操作系统和异常事件单独使用一个MSP指针的目的&#xff0c;是为了保证栈数据不会被用户程序意外访问或…...

线程同步(互斥锁与条件变量)

文章目录 1、为什么要用互斥锁2、互斥锁怎么用3、为什么要用条件变量4、互斥锁和条件变量如何配合使用5、互斥锁和条件变量的常见用法 参考资料&#xff1a;https://blog.csdn.net/m0_53539646/article/details/115509348 1、为什么要用互斥锁 为了使各线程能够有序地访问公共…...

Ubuntu指令学习(个人记录、偶尔更新)

Ubuntu指令学习 0、一点常用指令列表一、Ubuntu下复制与移动&#xff0c;cp/mv二、Ubuntu下echo 与 重定向>,>>三、Ubuntu下chmod,用户权限四、Ubuntu下的tar打包&#xff0c;gzip压缩五、Ubuntu(22.04)下系统语言为中文&#xff0c;切换主目录文件名为英文。六、Ubun…...

Visual Studio 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...

【经验分享】Linux 系统安装后内核参数优化

在 Linux 系统安装后&#xff0c;进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作&#xff1a; 修改/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 行的文件数量。以下是一个具体的命令示例&#xff1a; find /path/to/directory -name "*.rst" -type f -exec wc -l {} | awk $1 < 4 | wc -l解释&#xff1a; find /path/to/directory …...

使用开源项目xxl-cache构建多级缓存

xxl-cache简介 官网地址&#xff1a;https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架&#xff0c;高效组合本地缓存和分布式缓存(RedisCaffeine)&#xff0c;支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力&#xff1b;拥有“高性…...

LVDS接口总结--(5)IDELAY3仿真

仿真参考资料如下&#xff1a; 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() // 将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性import { createApp } from vue import App from ./App.vue// mount 设置挂载点 #app (id为app的盒子) createA…...

玩转适配器模式

文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…...

2.11寒假作业

web&#xff1a;[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的&#xff0c;随便输入进行看看 提示错误&#xff0c;看源码其中的js代码 这个代码很容易理解&#xff0c;要让输入的内容等于对应的字符串&#xff0c;显然直接复制粘贴是错的 这串字符看起来像是base64加密&…...

untiy 冰面与地面,物理材质的影响

效果 WeChat_20250211165601...

视频编解码标准中的 Profile 和 Level

视频编解码标准中的 Profile 和 Level 在视频编码标准(如 H.264/AVC、HEVC/H.265、H.266/VVC、AV1)中,Profile(配置文件) 和 Level(级别) 是两个重要的概念,它们用于定义编码器和解码器支持的特性、功能以及视频质量与编码效率之间的权衡。 Profile(配置文件) Pro…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

UE5 学习系列(三)创建和移动物体

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

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...