Servlet学习(六):Response对象

2023-10-30

1、Response设置响应数据功能介绍

HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体,对于这三部分内容的数据,respone对象都提供了哪些方法来进行设置?

  1. 响应行

在这里插入图片描述

对于响应头,比较常用的就是设置响应状态码:

void setStatus(int sc);
  1. 响应头

设置响应头键值对:

void setHeader(String name,String value);
  1. 响应体
    对于响应体,是通过字符、字节输出流的方式往浏览器写,
  • 获取字符输出流:
PrintWriter getWriter();
  • 获取字节输出流
ServletOutputStream getOutputStream();

2、Respones请求重定向

Response重定向(redirect):一种资源跳转方式。

  1. 浏览器发送请求给服务器,服务器中对应的资源A接收到请求
  2. 资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径
  3. 浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B
  4. 资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫重定向

重定向的实现方式:

resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

resposne.sendRedirect("资源B的访问路径")

重定向的特点

  • 浏览器地址栏路径发送变化

  • 可以重定向到任何位置的资源(服务内容、外部均可)

  • 两次请求,不能在多个资源使用request共享数据

3、Response响应字符数据

要想将字符数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();

  • 通过字符输出流写数据: writer.write("aaa");

接下来,我们实现通过些案例把响应字符数据给实际应用下:

  1. 返回一个简单的字符串aaa
/**
 * 响应字符数据:设置字符数据的响应体
 */
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //1. 获取字符输出流
        PrintWriter writer = response.getWriter();
		 writer.write("aaa");
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  1. 返回一串html字符串,并且能被浏览器解析
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");
  1. 返回一个中文的字符串你好,需要注意设置响应数据的编码为utf-8
//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
writer.write("你好");

4、Response响应字节数据

要想将字节数据写回到浏览器,我们需要两个步骤:

  • 通过Response对象获取字节输出流:ServletOutputStream outputStream = resp.getOutputStream();

  • 通过字节输出流写数据: outputStream.write(字节数据);

接下来,我们实现通过些案例把响应字符数据给实际应用下:

  1. 返回一个图片文件到浏览器
/**
 * 响应字节数据:设置字节数据的响应体
 */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");
        //2. 获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = fis.read(buff))!= -1){
            os.write(buff,0,len);
        }
        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

上述代码中,对于流的copy的代码还是比较复杂的,所以我们可以使用IOUtils来简化代码的开发,具体的步骤是:

  1. pom.xml添加依赖
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
  1. 调用工具类方法
//fis:输入流
//os:输出流
IOUtils.copy(fis,os);

优化后的代码:

/**
 * 响应字节数据:设置字节数据的响应体
 */
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 读取文件
        FileInputStream fis = new FileInputStream("d://a.jpg");
        //2. 获取response字节输出流
        ServletOutputStream os = response.getOutputStream();
        //3. 完成流的copy
      	IOUtils.copy(fis,os);
        fis.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Servlet学习(六):Response对象 的相关文章

随机推荐

  • 不止于链:万向区块链“万纳链盟”,构建企业数字转型一体化方案

    2022年伊始 为更好满足企业级客户在数字化转型关键期的实际需求 万向区块链汇聚技术及生态资源 对区块链技术架构进行全面拓展 基于PlatONE升级万纳链 推出 万纳链盟 万纳链盟 作为新一代区块链技术和网络平台 集高性能联盟链 隐私计算
  • STM32F4速度环加角度环串级PID

    小白学习笔记 欢迎指正 整体思路 1 定时器配置编码器模式 实现对电机输出A B相 void TIM2 ENCODER Init void GPIO InitTypeDef GPIO InitStructure TIM TimeBaseIn
  • 测试2:编写测试用例的方法

    目录 什么是测试用例 测试用例的要素 1 编写测试用例的方法 1 1 测试用例的描述 1 2 测试用例设计方法 1 基于需求 依据需求来写测试点 2 等价类 分类 3 边界值 黑盒测试方法 4 判定表法 判定表的四个组成部分 判定表的设计步
  • bat命令执行adb截屏指定设备以及保存

    参考 CMD命令行接收用户输入信息 利用bat命令实现adb截屏以及保存 在这篇文章的基础上添加了输入设备Id的功能 不要成为自己厌恶的那一类人 执行效果 echo off color a chcp 65001 title 截屏 echo
  • Swift基础语法快速浏览

    有些东西很简单 但是我还是把它记录了下来 文章目录 推荐阅读 基础语法快速浏览 基础 值类型转化 控制流 方法 类和对象 枚举和结构体 协议和扩展 错误处理 泛型 推荐阅读 the swift programming language sw
  • 五.Vim文档编辑

    文本编辑器的作用 创建或修改文本文件 维护Linux系统中的各种配置文件 Linux中最常用的文本编辑器 vi 类Unix系统中默认的文本编辑器 vim vi编辑器的增强版本 习惯上也称为vi 高亮显示 就是有颜色 root localho
  • 虚拟环境报错 virtualenv 不是内部或外部命令,也不是可运行的程序

    通过pip list 查询时显示安装成功 之前用过虚拟环境了 并没发生任何问题 查询是否有多个Python环境 我装了Anacoda 知道是环境冲突后 原本思路是删了环境变量 无用 是 管理员模式打开cmd 卸载了之前在普通用户权限下安装的
  • (C语言) 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存,输入的字符以'!'结束

    从键盘输入一个字符串 将其中的小写字母全部转换成大写字母 然后输出到一个磁盘文件 test 中保存 输入的字符以 结束 define CRT SECURE NO WARNINGS include
  • LeetCode:39. 组合总和

    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target 找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 并以列表形式返回 你可以按 任意顺序 返回这些组合 candidat
  • 硬盘突然变raw格式_分区变成RAW格式怎么办?手把手教你解决方法

    移动硬盘 U盘 硬盘 SD卡都是很常用的数据存储设备 用户在平时使用这些设备的时候难免会因各种原因而遇到一些问题 例如分区变成RAW格式 无法访问 提示格式化 误删除等 遇到这种情况 用户将无法读取数据 从而面临数据丢失的风险 其实 分区变
  • MYSQL5.7/MYSQL8.0迁移dm8字符乱码以及指定模式问题笔记总结

    开发一个项目 需要用dm8重构 使用了达梦自带的迁移工具 dm数据迁移工具 安装使用教程参考官网即可 安装前准备 达梦技术文档 dameng com 1 字符乱码问题解决 在迁移的过程中遇到了乱码 经过反复百度 也没有解决 后面经过反思 总
  • Java复习-12-继承、覆写与Annotation 注解

    继承与覆写 实例化子类对象时 会优先实例化其继承的父类对象 即子类构造方法中隐含了父类构造方法 java中的类继承不支持多重继承 但支持多层继承 并且对于个人编写的代码而言 理论上不应该超过三层 子类不能直接访问父类中的 private 的
  • 时序预测工具库(Prophet)介绍+代码

    时序预测工具库 Prophet 一 Prophet 简介 二 Prophet 适用场景 三 Prophet 算法的输入输出 四 Prophet 算法原理 五 与机器学习算法的对比 六 代码 6 1 依赖安装 6 2 预测demo 6 3 效
  • ARM汇编指令

    1 ARM寄存器那点知识 1 1 ARM处理器的八种工作模式 在ARMv8中加入了Monitor模式用于安全扩展 usr模式 正常程序运行时的模式 fiq模式 当配置有快速中断时 如果产生fiq时间 ARM核将会切换到该模式 irq模式 中
  • 使用Docker部署FastDFS集群

    FastDFS集群部署 1 下载FastDFS镜像 2 创建fastdfs主机映射目录 3 修改配置信息 4 运行tracker容器 5 运行storage容器 6 查看FastDFS监控状态 1 下载FastDFS镜像 docker pu
  • CUDA数组分配

    cuda内存分配真是乱啊 这次总结一下数组的分配 概述 数组分配可以通过cudaMallocArray 和cudaMalloc3DArray 1 cudaMallocArray cudaError t cudaMallocArray str
  • [Pytorch系列-50]:卷积神经网络 - FineTuning的统一处理流程与软件架构 - Pytorch代码实现

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121363706 目录 第1章 关于F
  • DCMM数据能力成熟度评估模型--学习笔记(1)

    DCMM数据能力成熟度评估模型 学习笔记 1 DCMM简介 结构组成和成熟度评估等级划分 1 1 DCMM简介 1 2 DCMM结构组成 1 3 DCMM关键过程域 1 3 1 数据战略 指导方针 1 3 2 数据治理 机制保障 1 3 3
  • MySQL学习笔记

    我们经常用到的简单MySQL语句 做一个总结 对于没有基础的同学也有帮助 对于有基础的同学可以参考作为借鉴 狂神说Java 1 连接数据库语句 mysql h 服务器主机地址 u 用户名 p 用户密码 注意 p后面不能加空格 否则会被当做密
  • Servlet学习(六):Response对象

    1 Response设置响应数据功能介绍 HTTP响应数据总共分为三部分内容 分别是响应行 响应头 响应体 对于这三部分内容的数据 respone对象都提供了哪些方法来进行设置 响应行 对于响应头 比较常用的就是设置响应状态码 void s