Response 和 Request 介绍

embedded/2025/2/12 23:00:50/

怀旧网个人博客网站地址:怀旧网,博客详情: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.ppmy.cn/embedded/161709.html

相关文章

leetcode 3186. 施咒的最大总伤害

题目如下 数据范围 本题和打家劫舍类似都是取和不取两种情况&#xff1a;令f(i)为从0到i可以打出的最高伤害1.当选择不取第i个数那么直接选取f(i - 1)即可2.当选择选取第i个数时 我们要选择离 power[i] - 2 最近的下标j从0到j选取即f(j) power[i] * power[i]个数即可 例…

YOLOv11实战海洋动物图像识别

本文采用YOLOv11作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv11以其高效的特征提取能力&#xff0c;在多个图像分类任务中展现出卓越性能。本研究针对5种海洋动物数据集进行训练和优化&#xff0c;该数据集包含丰富的海洋动物图像…

第40天:Web开发-JS应用VueJS框架Vite构建启动打包渲染XSS源码泄露代码审计

#知识点 1、安全开发-VueJS-搭建启动&打包安全 2、安全开发-VueJS-源码泄漏&代码审计 一、Vue搭建创建项目启动项目 1、Vue 框架搭建->基于nodejs搭建&#xff0c;安装nodejs即可 参考&#xff1a;https://cn.vuejs.org/ 已安装18.3或更高版本的Node.js 2、Vue 创建…

Leecode刷题C语言之全排列②

执行结果:通过 执行用时和内存消耗如下&#xff1a; int* path; int pathTop; int** ans; int ansTop; int cnt[8];//标记path中是否已有此索引值&#xff0c;这也是同46题不同点 void backTracking(int* nums,int numsSize,int startIndex,int** returnColumnSizes){if(pathT…

b 树和 b+树的理解

为了更清晰地理解B树和B树&#xff0c;我将从您提出的三个方面进行详细解答&#xff1a;二叉树、AVL树、B树的概念&#xff0c;B树和B树的应用场景&#xff0c;以及为什么选择B树或B树作为索引结构。 一、二叉树、AVL树、B树的概念 二叉树&#xff1a;是一种每个节点最多有两…

21.[前端开发]Day21-HTML5新增内容-CSS函数-BFC-媒体查询

王者荣耀-网页缩小的问题处理 为什么会产生这个问题&#xff1f;怎么去解决 可以给body设置最小宽度 1 HTML5新增元素 HTML5语义化元素 HTML5其他新增元素 2 Video、Audio元素 HTML5新增元素 - video video支持的视频格式 video的兼容性写法 HTML5新增元素 - audio audio…

log4j2日志配置文件

log4j2配置文件每个项目都会用到,记录一个比较好用的配置文件,方便以后使用时调取,日志输出级别为debug,也可以修改 <?xml version"1.0" encoding"UTF-8"?> <Configuration monitorInterval"180" packages""><prope…

WPF正则表达式验证输入是否包含中文字母数字,不能是纯符号

1、验证纯中文 string pattern "[\u4e00-\u9fa5]"; // 创建Regex对象 Regex regex new Regex(pattern); // 判断输入字符串是否包含中文 if (!regex.IsMatch(name)) { //resultTextBlock.Text …