Response 和 Request 介绍

news2025/2/12 16:24:20

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

image-20240328102158518

1、HttpServletResponse

1、简单分类

image-20240328102527294

image-20240328102448429

2、文件下载

image-20240328103202624

通过Response下载文件数据

放一个文件到resources目录

image-20240328111356039

编写下载文件Servlet文件

public class FileDownServlet extends HttpServlet {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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 {
    @Override
    protected 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.coloradmin.cn/o/2296929.html

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

相关文章

ADB详细教程

目录 一、ADB简介 二、配置 配置环境变量 验证是否安装成功 三、简单使用 基本命令 设备连接管理 USB连接 WIFI连接&#xff08;需要USB线&#xff09; 开启手机USB调试模式 开启USB调试 四、其他 更换ADB默认启动端口 一、ADB简介 ADB&#xff08;Android Debug…

Jenkins+gitee 搭建自动化部署

Jenkinsgitee 搭建自动化部署 环境说明&#xff1a; 软件版本备注CentOS8.5.2111JDK1.8.0_211Maven3.8.8git2.27.0Jenkins2.319最好选稳定版本&#xff0c;不然安装插件有点麻烦 一、安装Jenkins程序 1、到官网下载相应的版本war或者直接使用yum安装 Jenkins官网下载 直接…

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡 背景 前端开发接口请求&#xff0c;调试&#xff0c;联调&#xff0c;接入数据&#xff0c;前端必不可少工具&#xff0c;postman是一个非常好…

AI大语言模型

一、AIGC和生成式AI的概念 1-1、AIGC Al Generated Content&#xff1a;AI生成内容 1-2、生成式AI&#xff1a;generative ai AIGC是生成式 AI 技术在内容创作领域的具体应用成果。 目前有许多知名的生成式 AI&#xff1a; 文本生成领域 OpenAI GPT 系列百度文心一言阿里通…

Pdf手册阅读(1)--数字签名篇

原文阅读摘要 PDF支持的数字签名&#xff0c; 不仅仅是公私钥签名&#xff0c;还可以是指纹、手写、虹膜等生物识别签名。PDF签名的计算方式&#xff0c;可以基于字节范围进行计算&#xff0c;也可以基于Pdf 对象&#xff08;pdf object&#xff09;进行计算。 PDF文件可能包…

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…

C++引用深度详解

C引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…

SpringCloud - Gateway 网关

前言 该博客为Sentinel学习笔记&#xff0c;主要目的是为了帮助后期快速复习使用 学习视频&#xff1a;7小快速通关SpringCloud 辅助文档&#xff1a;SpringCloud快速通关 源码地址&#xff1a;cloud-demo 一、简介 官网&#xff1a;https://spring.io/projects/spring-clou…

【JVM详解五】JVM性能调优

示例&#xff1a; 配置JVM参数运行 #前台运行 java -XX:MetaspaceSize-128m -XX:MaxMetaspaceSize-128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio8 - XX:UseConcMarkSweepGC -jar /jar包路径 #后台运行 nohup java -XX:MetaspaceSize-128m -XX:MaxMetaspaceS…

DeepSeek:搅动人工智能产业风云的鲶鱼效应深度解读

我的个人主页 我的专栏&#xff1a;人工智能领域&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;无疑是最为耀眼的领域之一。众多技术与平台如繁星般涌现&a…

bingAI生成的易语言编程基础

易语言编程基础 易语言&#xff08;EPL&#xff09;是一种基于中文的编程语言&#xff0c;旨在简化编程学习过程&#xff0c;特别适合初学者和有一定编程基础的开发者。它通过中文关键词和语法&#xff0c;降低了编程的门槛&#xff0c;使得代码更加直观易懂。 示例&#xff…

DeepSeek AI R1推理大模型API集成文档

DeepSeek AI R1推理大模型API集成文档 引言 随着自然语言处理技术的飞速发展&#xff0c;大语言模型在各行各业的应用日益广泛。DeepSeek R1作为一款高性能、开源的大语言模型&#xff0c;凭借其强大的文本生成能力、高效的推理性能和灵活的接口设计&#xff0c;吸引了大量开发…

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和

【算法-动态规划】、魔法卷轴: 两次清零机会整个数组最大累加和 文章目录 一、dp1.1 题意理解1.2 整体思路1.3 具体思路1.4 代码 二、多语言解法 一、dp 1.1 题意理解 nums 数组, 有正负0, 使用最多两次魔法卷轴, 希望使数组整体的累加和尽可能大. 求尽可能大的累加和 其实就…

【R】Dijkstra算法求最短路径

使用R语言实现Dijkstra算法求最短路径 求点2、3、4、5、6、7到点1的最短距离和路径 1.设置data&#xff0c;存放有向图信息 data中每个点所在的行序号为起始点序号&#xff0c;列为终点序号。 比如&#xff1a;值4的坐标为(1,2)即点1到点2距离为4&#xff1b;值8的坐标为(6,7)…

深入浅出:探索 DeepSeek 的强大功能与应用

深入浅出&#xff1a;探索 DeepSeek 的强大功能与应用 在人工智能技术飞速发展的今天&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为其重要分支&#xff0c;正逐渐渗透到我们生活的方方面面。DeepSeek 作为一款功能强大的 NLP 工具&#xff0c;凭借其易用性和高效性…

西门子S7-200 PLC串口PPI转以太网通讯的模块链接方式

项目背景 某汽车零部件生产车间有30台自动化生产设备&#xff0c;控制系统采用西门子S7-200系列的CPU226。此前&#xff0c;设备的一个通讯端口用于和变频器进行自由口通讯&#xff0c;另一个通讯端口连接着一台昆仑通态触摸屏作为人机界面。车间计划进行智能化升级&#xff…

win10向windows server服务器传输文件

win10向windows server服务器传输文件 遇到无法直接拖动文件进行传输时 解决方案&#xff1a; 1.点击显示选项 2.点击本地资源-详细信息 3.在窗口中选择你需要共享的磁盘 4.然后远程连接到Windows server服务器 5.登录Windows server服务器后&#xff0c;在此电脑下就能看…

git服务器搭建,gitea服务搭建,使用systemclt管理服务

文章目录 页面展示使用二进制文件安装git服务下载选择架构使用wget下载安装 验证 GPG 签名服务器设置准备环境创建systemctl文件 备份与恢复备份命令 (dump)恢复命令 (restore) 页面展示 使用二进制文件安装git服务 所有打包的二进制程序均包含 SQLite&#xff0c;MySQL 和 Po…

Mybatis快速入门与核心知识总结

Mybatis 1. 实体类&#xff08;Entity Class&#xff09;1.1 实体类的定义1.2 简化编写1.2.1 Data1.2.2 AllArgsConstructor1.2.3 NoArgsConstructor 2. 创建 Mapper 接口2.1 Param2.2 #{} 占位符2.3 SQL 预编译 3. 配置 MyBatis XML 映射文件&#xff08;可选&#xff09;3.1 …

用docker在本地用open-webui部署网页版deepseek

前置条件 用Ollama在本地CMD窗口运行deepseek大模型-CSDN博客文章浏览阅读109次&#xff0c;点赞5次&#xff0c;收藏2次。首次运行需要下载deepseek的大模型包&#xff08;大约5GB&#xff0c;根据本地网速的不同在半个小时到几个小时之间下载完成&#xff09; &#xff0c;并…