response应用及重定向和request转发

请求和转发:

  • response说明
  • 一、response文件下载
  • 二、response验证码实现
    • 1.前置知识:
    • 2.具体实现:
    • 3.知识总结
  • 三、response重定向
  • 四、request转发
  • 五、重定向和转发的区别


response说明

response是指HttpServletResponse,该响应有很多的应用,比如像浏览器输出消息,下载文件,实现验证码等。
在这里插入图片描述

一、response文件下载

1.创建一个javaweb的项目。
在这里插入图片描述

2.实例类FileServlet的具体实现。
在这里插入图片描述

import java.net.URLEncoder;
public class FileServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.获取要下载文件的路径        realPath:绝对路径String realPath = "E:\\Software\\IDEA\\javaweb-02-servlet\\response\\src\\main\\resources\\aa.webp";System.out.println("文件下载的路径:" + realPath);
//        2.下载的文件名String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//        3.设置浏览器能够支持下载我们需要的东西
//        如果想让网站能下载东西,需要搜一个下载文件的一个头。
//        resp.setHeader("Content-disposition", "attachment;filename" + fileName);resp.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
//        4.获取下载文件的输入流。FileInputStream fis = new FileInputStream(realPath);
//        5.创建缓冲区
//        6.获取OutputStream对象
//        7.将FileOutputStream流写入到缓冲区,使用OutputStream将缓冲区中的数据输出到客户端。ServletOutputStream oos = resp.getOutputStream();byte[] buf = new byte[1024];int len = 0;while ((len = fis.read(buf)) > 0) {oos.write(buf, 0, len);}oos.close();fis.close();}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

3.配置web.xml文件及tomcat服务器。
在这里插入图片描述
在这里插入图片描述

4.启动服务。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.回顾总结

  • (5.1)思路分析:
    • 1.获取文件输入流
    • 2.获取web的响应的输出流
    • 3.将输入流写入到输出流,进而发给客户端。
  • (5.2)注意实项:
    • 1.下载文件名
 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
 - 2.下载文件的头
 resp.setHeader("Content-disposition", "attachment;filename" + fileName);
 - 3.相关搜索

在这里插入图片描述

二、response验证码实现

1.前置知识:

下载文件需要一个响应头,响应浏览器的类型是:

resp.setHeader("Content-disposition", "attachment;filename" + fileName);

而图片验证码需要设置 发送到客户端的响应的内容类型

resp.setContentType("image/jpg");
以jsp的形式发送的图片类型。
此外,也可以是png,jepg等形式。

还需要设置每60s刷新一次:

resp.setHeader("refresh","60");

常见的内容类型:

resp.setContentType("text/html");
以html的格式响应的文本类型,即代表响应的是html页面。

2.具体实现:

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;public class ImageServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器每60s自动刷新一次resp.setHeader("refresh","60");//        在内存中创建一个图片BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
//        得到图片Graphics2D g = (Graphics2D) image.getGraphics();//笔来对图片进行操作
//        设置图片的背景颜色。---先选定颜色,再添加一个填充的矩形。g.setColor(Color.WHITE);g.fillRect(0,0,80,20);//        给图片写数据g.setColor(Color.CYAN);g.setFont(new Font(null,Font.BOLD,20));g.drawString(makeNum(),0,20);//        告诉浏览器,这个请求用图片的方式打开
//        setContentType  设置发送到客户端的响应的内容类型resp.setContentType("image/jpg");
//网站存在缓存,不让浏览器去缓存
//        setHeader设置响应头
//        setDateHeader 是设置页面缓存的,防止 JSP或者Servlet中的输出 被浏览器保存在缓冲区中。resp.setDateHeader("Expires",-1);//在代理服务器端防止缓冲resp.setHeader("Cache-Control","no-cache");resp.setHeader("Pragma","no-cache");//        把图片写给浏览器ImageIO.write(image,"jpg",resp.getOutputStream());}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}private String makeNum(){Random random = new Random();String num=random.nextInt(9999999)+"";StringBuffer sb = new StringBuffer();//变化的字符串。for (int i=0;i<7-num.length();i++){sb.append("0");}num=sb.toString()+num;return num;}
}

在这里插入图片描述

3.知识总结

(1)设置浏览器自动刷新。
(2)清除浏览器缓存。
(3)将图片写给浏览器。(可以试试其他的内容,比如音乐电影什么行不行?)
(4)设置客户端的响应内容形式为图片。
(5)内存中创建图片,并通过画笔类进行操作。
(ImageIO是一个图片类,专门写图片的。)
(6)生成随机数。
画笔是如果要写文字,要先选定颜色,然后选定字体,文本框,在哪个位置开始写。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、response重定向

如:

resp.sendRedirect("/re/img1");
即	resp.sendRedirect("/项目映射名/跳转的页面的映射");

在这里插入图片描述
在这里插入图片描述
也可以跳转到jsp页面。
实例代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径 需要寻找到项目的路径--%>
<form action="${pageContext.request.contextPath}/login" method="get">用户名:<input type="text" name="username">密码:<input type="password" name="password"><input type="submit">
</form>
</body>
</html>
public class RedirectServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        redirect 重定向resp.sendRedirect("/re/img1");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

在这里插入图片描述
在这里插入图片描述

四、request转发

request处理请求:
在这里插入图片描述
HTTP请求中的所有信息被封装到HttpServletRequest对象,通过该对象的方法,可以获取客户端的所有信息。
主要的获取参数的两种方法:
在这里插入图片描述
实例代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body>
<h1>登录</h1>
<div style="text-align: center">
<%--以post方式提交表单,提交到我们的login请求--%><form action="${pageContext.request.contextPath}/login" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br>爱好:<input type="checkbox" name="hobbys" value="张三">张三<input type="checkbox" name="hobbys" value="李四">李四<input type="checkbox" name="hobbys" value="飞机">飞机<input type="checkbox" name="hobbys" value="蜘蛛">蜘蛛<br><input type="submit"></form>
</div>
</body>
</html>
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;/****/
public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setCharacterEncoding("UTF-8");String username = req.getParameter("username");String password = req.getParameter("password");String[] hobbys = req.getParameterValues("hobbys");System.out.println("================");System.out.println(username+":"+password);System.out.println(Arrays.toString(hobbys));System.out.println("================");
//请求转发 req
//       /被解析成当前项目路径req.getRequestDispatcher("/success.jsp").forward(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}

五、重定向和转发的区别

相同点:

  • 页面都会实现跳转。

不同点:

  • 请求转发的时候,url不会发生改变。
    转发时:
 req.getRequestDispatcher("/success.jsp").forward(req,resp);
  • 重定向的时候,url地址栏会发送改变。
    重定向:
 resp.sendRedirect("/re/img1");

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

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

相关文章

Kafka在微服务架构中的应用:实现高效通信与数据流动

微服务架构的兴起带来了分布式系统的复杂性&#xff0c;而Kafka作为一款强大的分布式消息系统&#xff0c;为微服务之间的通信和数据流动提供了理想的解决方案。本文将深入探讨Kafka在微服务架构中的应用&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地理解和应…

PaddleClas学习3——使用PPLCNet模型对车辆朝向进行识别(c++)

使用PPLCNet模型对车辆朝向进行识别 1 准备环境2 准备模型2.1 模型导出2.2 修改配置文件3 编译3.1 使用CMake生成项目文件3.2 编译3.3 执行3.4 添加后处理程序3.4.1 postprocess.h3.4.2 postprocess.cpp3.4.3 在cls.h中添加函数声明3.4.4 在cls.cpp中添加函数定义3.4.5 在main.…

时间序列预测 — VMD-LSTM实现单变量多步光伏预测(Tensorflow):单变量转为多变量

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 1.3 缺失值分析 2 VMD经验模态分解 3 构造训练数据 4 LSTM模型训练 5 预测 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.pyplot as plt f…

优化算法 学习记录

文章目录 相关资料 优化算法梯度下降学习率牛顿法 随机梯度下降小批量随机梯度下降动量法动量法解决上述问题 AdaGrad 算法RMSProp算法Adam学习率调度器余弦学习率调度预热 相关资料 李沐 动手学深度学习 优化算法 优化算法使我们能够继续更新模型参数&#xff0c;并使损失函…

Elasticsearch:使用 Elasticsearch 向量搜索及 RAG 来实现 Chatbot

Elasticsearch 的向量搜索为我们的语义搜索提供了可能。而在人工智能的动态格局中&#xff0c;检索增强生成&#xff08;Retrieval Augmented Generation - RAG&#xff09;已经成为游戏规则的改变者&#xff0c;彻底改变了我们生成文本和与文本交互的方式。 RAG 使用大型语言模…

MongoDB的删除文档、查询文档语句

本文主要介绍MongoDB的删除文档、查询文档命令语句。 目录 MongoDB删除文档MongoDB查询文档 MongoDB删除文档 MongoDB是一种基于文档的NoSQL数据库&#xff0c;它使用BSON格式存储文档。删除文档是MongoDB数据库中的常见操作之一。 下面是MongoDB删除文档的详细介绍和示例&am…

导入自定义模块出现红色波浪线,但是能正常执行

问题描述&#xff1a; 导入自己定义的模块时&#xff0c;出现红色波浪线&#xff0c;可以继续执行 解决&#xff1a; 在存放当前执行文件的文件夹右键&#xff0c;然后将其设置为sources root即可 结果&#xff1a;

基于深度学习yolov5实现安全帽人体识别工地安全识别系统-反光衣识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 实现安全帽人体识别工地安全识别系统需要使用深度学习技术&#xff0c;特别是YOLOv5算法。下面是对基于YOLOv5实现安…

带你真正理解web地图切片规则

很多时候我们即使做完了项目还是对切片规则一知半解&#xff0c;只知道照着例子写代码&#xff0c;不理解WMTSCapabilities文件中参数的具体含义&#xff0c;也无法理解切片规则是如何产生的&#xff0c;不知道经纬度切图和平面切图的差别是啥&#xff0c;等等种种疑问&#xf…

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

【51单片机系列】74HC595实现对LED点阵的控制

本文是关于LED点阵的使用&#xff0c;使用74HC595模块实现对LED点阵的控制。 文章目录 一、8x8LED点阵的原理1.1 LED点阵显示原理1.2 LED点阵内部结构图1.3 开发板上的LED点阵原理图1.4 74HC595芯片 二、使用74HC595模块实现流水灯效果三、 使用74HC595模块控制LED点阵对角线亮…

python基于DeeplabV3Plus开发构建手机屏幕表面缺陷图像分割识别系统

Deeplab是图像分割领域非常强大的模型&#xff0c;在前面的博文中我们也进行过很多相应项目的开发实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《基于DeepLabv3Plus开发构建人脸人像分割系统》 《基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割》 《基于D…

【链表Linked List】力扣-203 移除链表元素

目录 题目描述 解题过程 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5…

快速学会绘制Pyqt5中的所有图(下)

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…

鸿蒙原生应用开发——分布式数据对象

01、什么是分布式数据对象 在可信组网环境下&#xff0c;多个相互组网认证的设备将各自创建的对象加入同一个 sessionId&#xff0c;使得加入的多个数据对象之间可以同步数据&#xff0c;也就是说&#xff0c;当某一数据对象属性发生变更时&#xff0c;其他数据对象会检测到这…

让聪明的车连接智慧的路,C-V2X开启智慧出行生活

“聪明的车 智慧的路”形容的便是车路协同的智慧交通系统&#xff0c;从具备无钥匙启动&#xff0c;智能辅助驾驶和丰富娱乐影音功能的智能网联汽车&#xff0c;到园区的无人快递配送车&#xff0c;和开放的城市道路上自动驾驶的公交车、出租车&#xff0c;越来越多的车联网应用…

thinkphp lists todo

来由&#xff1a; 数据库的这个字段我想返回成&#xff1a; 新奇的写法如下&#xff1a; 逻辑层的代码&#xff1a; public function goodsDetail($goodId){$detail $this->good->where(id, $goodId)->hidden([type_params,user_id])->find();if (!$detail) {ret…

如何使用PostMan进行并发测试?

如何使用PostMan进行并发测试&#xff1f; &#x1f440;(Postman 的 runner 实际上是串行执行的&#xff0c;因此不能作为并发测试&#xff0c; 只是批量测试&#xff0c;本文如下称为并发的是错误的) 文章目录 如何使用PostMan进行并发测试&#xff1f;POST篇流程Pre-req 脚…

Conda常用命令总结

使用conda或anaconda的小伙伴们都知道&#xff0c;图形界面时不靠谱的&#xff0c;而在命令行下&#xff0c;所有的操作就会稳定很多&#xff0c;且极少出现问题。因此&#xff0c;熟记conda的命令行就变得十分有用。但对于我这样近50岁依旧奋斗在代码第一线的大龄程序员而已&a…

拦截 open调用 (进程白名单,文件白名单)

拦截 open 文章目录 拦截 open第一个需求文件结构进程白名单文件白名单 测试代码第一个版本版本二代码演示 增加一个日志记录代码解释 gcc -shared -fPIC -o libintercept.so intercept.c -ldlLD_PRELOAD./libintercept.so ./processA在Linux中&#xff0c;我们可以使用LD_PREL…