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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分层耦合 - IOC详解

推荐使用下面三种, 第一种多用于其他类 声明bean的时候&#xff0c;可以通过value属性指定bean的名字&#xff0c;如果没有指定&#xff0c;默认为类名首字母小写。 使用以上四个注解都可以声明bean&#xff0c;但是在springboot集成web开发中&#xff0c;声明控制器bean只能用…

STM32 Flash详解教程文章

目录 Flash基本概念理解 Flash编程接口FPEC Flash擦除/写入流程图 Flash选项字节基本概念理解 Flash电子签名 函数读取地址下存放的数据 Flash的数据处理限制部分 编写不易&#xff0c;请勿搬运&#xff0c;感谢理解&#xff01;&#xff01;&#xff01; Flash基本概念…

WPF 设置宽度为 父容器 宽度的一半

方法1&#xff1a;使用 绑定和转换器 实现 创建类文件 HalfWidthConverter public class HalfWidthConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, CultureInfo culture){if (value is double width){return width / 4…

【Ubuntu VScode Remote SSH 问题解决】Resolver error: Error: XHR failed

1. 问题描述 VScode使用remote ssh 远程服务器&#xff0c;报错类似&#xff1a; [12:06:01.219] Downloading VS Code server locally... [12:06:01.310] Resolver error: Error: XHR failedat k.onerror (vscode-file://vscode-app/private/var/folders/g1/cvs2rnpx60qc3b4…

32单片机学习记录1之GPIO

32单片机学习记录1之GPIO 前置 GPIO口在单片机中扮演着什么角色&#xff1f; 在单片机中&#xff0c;GPIO口&#xff08;General Purpose Input/Output&#xff09; 是一种通用输入/输出接口&#xff0c;扮演着连接单片机与外部设备的桥梁角色。具体来说&#xff0c;它在单片…

第三十二周:Informer学习笔记

目录 摘要Abstract1 Informer1.1 预备知识1.2 模型框架1.3 实验分析 总结 摘要 本周学习的主要内容是Informer模型&#xff0c;Informer是一种专为长序列时间序列预测&#xff08;LSTF&#xff09; 设计的Transformer模型。相较于传统的Transformer&#xff0c;Informer采用Pr…

绩效归因概述

绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…

MambaMorph brain MR-CT

loss代码实现了几种用于医学图像配准(Registration)和分割(Segmentation)任务的损失函数,主要包括以下几种: NCC (Normalized Cross-Correlation): 功能: 计算局部归一化互相关损失,用于衡量两个图像之间的相似性。 应用场景: 通常用于图像配准任务,通过最大化图像之间…

C++ ——从C到C++

1、C的学习方法 &#xff08;1&#xff09;C知识点概念内容比较多&#xff0c;需要反复复习 &#xff08;2&#xff09;偏理论&#xff0c;有的内容不理解&#xff0c;可以先背下来&#xff0c;后续可能会理解更深 &#xff08;3&#xff09;学好编程要多练习&#xff0c;简…

<tauri><rust><GUI>基于rust和tauri的图片显示程序(本地图片的加载、显示、保存)

前言 本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。 环境配置 系统:windows 10 平台:visual studio code 语言:rust、javascript 库:tauri2.0 概述 …

Arrays工具类详解

目录 1. Arrays.toString() 方法 2. Arrays.deepToString() 方法 3. Arrays.equals(int[ ] arr1, int[ ] arr2) 方法 4. Arrays.equals(Object[] arr1, Object[] arr2) 方法 5. Arrays.deepEquals(Object[] arr1, Object[] arr2) 方法 6. Arrays.sort(int[] arr) 方法 7…

设计高效的测试用例:从需求到验证

在现代软件开发过程中&#xff0c;测试用例的设计一直是质量保证&#xff08;QA&#xff09;环节的核心。有效的测试用例不仅能够帮助发现潜在缺陷&#xff0c;提升软件质量&#xff0c;还能降低后期修复成本&#xff0c;提高开发效率。尽管如此&#xff0c;如何从需求出发&…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

三角测量——用相机运动估计特征点的空间位置

引入 使用对极约束估计了相机运动后&#xff0c;接下来利用相机运动估计特征点的空间位置&#xff0c;使用的方法就是三角测量。 三角测量 和对极几何中的对极几何约束描述类似&#xff1a; z 2 x 2 R ( z 1 x 1 ) t z_2x_2R(z_1x_1)t z2​x2​R(z1​x1​)t 经过对极约束…

如何本地部署DeepSeek

第一步&#xff1a;安装ollama https://ollama.com/download 打开官网&#xff0c;选择对应版本 第二步&#xff1a;选择合适的模型 https://ollama.com/ 模型名称中的 1.5B、7B、8B 等数字代表模型的参数量&#xff08;Parameters&#xff09;&#xff0c;其中 B 是英文 B…

Git生成公钥和私钥的方式

因为需要访问远程Git服务器&#xff0c;需要使用公钥&#xff1a; 1、先检测电脑上是否已经有.ssh目录 像我这就是没有的 2、开始生成一个新的SSH密钥&#xff08;RSA&#xff09; 打开Git Bash, 然后运行ssh-keygen -t rsa -b 4096 -C "注释" -t rsa是密匙类型…

常用的python库-安装与使用

常用的python库函数 yield关键字openslide库openslide库的安装-linuxopenslide的使用openslide对象的常用属性 cv2库numpy库ASAP库-multiresolutionimageinterface库ASAP库的安装ASAP库的使用 concurrent.futures.ThreadPoolExecutorxml.etree.ElementTree库skimage库PIL.Image…

【Oracle专栏】本地 expdp 导出远程库

Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 近期需要在远程备份机器上远程导出数据库,之前用expdp数据泵只导出过本服务器的,本文跨服务器使用expdp 。 2. 测试 2.1 本机装完整oracle时,执行expdp导出远端数据库 实验说明:以下12为本机,14…

Flink KafkaConsumer offset是如何提交的

一、fllink 内部配置 client.id.prefix&#xff0c;指定用于 Kafka Consumer 的客户端 ID 前缀partition.discovery.interval.ms&#xff0c;定义 Kafka Source 检查新分区的时间间隔。 请参阅下面的动态分区检查一节register.consumer.metrics 指定是否在 Flink 中注册 Kafka…

【leetcode】双指针:移动零 and 复写零

文章目录 1.移动零2.复写零 1.移动零 class Solution { public:void moveZeroes(vector<int>& nums) {for (int cur 0, dest -1; cur < nums.size(); cur)if (nums[cur] ! 0)swap(nums[dest], nums[cur]);} };class Solution { public:void moveZeroes(vector&l…