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…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...