JavaWeb笔记_Response对象

news2024/9/21 22:18:45

一.Response对象

1.1 Response对象概述

a.专门负责给浏览器响应信息(响应行,响应头,响应体)的对象

b.我们主要使用的是跟HTTP协议相关的Response对象:HTTPServletResponse,继承了ServletResponse,扩展了ServletResponse接口,提供了更多的方法,例如可以操作响应头,cookie等

1.2 Response对象设置响应行

   /**
     * HttpServletResponse中的方法:
     * void setStatus(int sc)
     * 设置响应状态码
     *  注意:我们一般不会去改变响应状态码,响应状态码一般由Tomcat设置
     */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setStatus(404);
		response.setStatus(500);
}

1.3.Response对象设置响应头

 /*
  * HttpServletResponse中的方法:
  * public void addHeader(String name, String value):可以添加响应头,一个响应头的key可以对应多 
    个value
  * public void setHeader(String name, String value):*  用给定名称和值设置响应头。如果已经设置 
    了头,则新值将重写以前的值。
   void setDateHeader(String name, long date):设置一个日期的响应头
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //添加响应头
        //add可以重复叠加
        response.addHeader("name","zs");  //Name:zs
        response.addHeader("name","ls");  //Name:ls

        //set或直接覆盖key相同的所有value
        response.setHeader("name","ww");  //Name:ww 将zs和ls全部覆盖
    }

1.4 Response对象设置响应体

1.4.1 Response对象操作字符流:写文本类型数据
/**
 * HttpServletResponse中的方法:
 *   getWriter():可以获取一个字符输出流
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter writer = response.getWriter();
		writer.write("<font color='red'>ResponseDemo03</font>");
		writer.write("<br/>");
		writer.write("<font color='blue'>ResponseDemo03</font>");
	}

 

1.4.2 字符类乱码解决方案

        /**
         * HttpServletResponse中的方法:
         *   getCharacterEncoding():获取Response中字符流缓冲区使用的默认码表
         *    1.Response底层使用的默认码表是ISO-8859-1(latin1)
         *    2.通过Response的setCharacterEncoding修改默认码表为UTF-8
         *         当我们write("你好")的时候,会把"你好"进行"UTF-8"编码(假设:CA E3 F5 D3 E5 E7)
         *         而我们的浏览器默认使用的是系统码表:GBK(一个中文对应两个字节),因此在解析"你好"
         *         会将你好的字节进行每两个字节解码 (CA E3 F5 D3 E5 E7=> 浣犲ソ)
         *    3.通过设置内容类型(设置响应头)来告知浏览器使用指定的码表解析响应体内容
         *    4.最终解决方案
         *      response.setContentType("text/html;charset=UTF-8");
         *      1.会自动设置Response中字符流缓冲区使用的码表
         *      2.告知浏览器使用何种码表解析响应体中的内容
         */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决字符类乱码问题

        //获取response中字符缓冲区使用的默认码表
        System.out.println(response.getCharacterEncoding()); //ISO-8859-1

        //通过setContentType()方法进行解决
        response.setContentType("text/html;charset=UTF-8");
        //response.setHeader("Content-Type","text/html;charset=UTF-8");
        System.out.println(response.getCharacterEncoding()); //UTF-8
        response.getWriter().write("设置后:你好");
    }

1.4.3 Response对象操作字节流:写多媒体类型数据
/**
 * HttpServletResponse中的方法
 *   getOutputStream():获取一个字节输出流
 * ServletContext中的方法
 *   getMimeType(String fileName):根据指定的名称返回对应的MIME类型
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取字节输出流
        ServletOutputStream os = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(os);

        //获取响应内容的MIME类型
        String mimeType = getServletContext().getMimeType("1.jpg"); // image/jpeg
        //告知浏览器响应内容的MIME类型,让浏览器知道怎么处理
        response.setContentType(mimeType);

        //利用字节输入流获取本地文件
        InputStream ras = getServletContext().getResourceAsStream("/img/1.jpg"); //虚拟路径
        BufferedInputStream bis = new BufferedInputStream(ras);
        int x;

        //写入文件
        while((x=bis.read())!=-1){
            os.write(x);
        }
    }

1.5 利用Response重定向

/**
 * 需求:当浏览器请求ResponseDemo06的时候,让浏览器重定向到ResponseDemo07
 *   void sendRedirect(String location):指定一个路径
 * 底层会设置状态码为302,并且设置响应头Location:/day10_Response/demo07
 */
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //重定向:浏览器发出两次请求
        //需要加Application Context
        response.sendRedirect("/day10_Response/response04");
    }

 

二.MIME类型(大类型/小类型)

 1.媒体类型一种标准,用来表示文档,文件或字节流的性质和格式
  2.浏览器中通常使用MIME类型(而不是文件扩展名),硬盘上的文件的扩展名都对应的有MIME类型
    可以用来确定如何处理服务端响应给浏览器的资源

三.下载文件案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>下载</title>
</head>
<body>
    <a href="/day10_Response/response06?filename=1.jpg">1.jpg</a><br>
    <a href="/day10_Response/response06?filename=2.txt">2.txt</a><br>
    <a href="/day10_Response/response06?filename=3.pdf">3.pdf</a><br>
    <a href="/day10_Response/response06?filename=美女.jpg">美女.jpg</a><br>
</body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取filename参数以及MIME类型
        String filename = request.getParameter("filename");
        String mimeType = getServletContext().getMimeType(filename);

        //判断浏览器类型来解决不同的中文乱码问题
        String userAgent = request.getHeader("User-Agent");
        String newFileName = null;
        if (userAgent.contains("MSIE") || userAgent.contains("Edge") || userAgent.contains("Trident")) {
            //说明是Microsoft浏览器我们需要采用UTF-8编码
            newFileName = URLEncoder.encode(filename, "UTF-8");
        } else {
            //说明是其它浏览器(chrome,FireFox...)我们需要先获取文件名的UTF-8字节,然后在对这些字节进行ISO-8859-1解码
            newFileName = new String(filename.getBytes("UTF-8"), "ISO-8859-1");
        }

        //设置响应头
        response.setContentType(filename);
        response.setHeader("Content-Disposition","attachment;filename="+newFileName);// 将要保存的文件名

        //获取字节输出流
        ServletOutputStream os = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(os);

        //通过字节输入流读取文件
        InputStream ras = getServletContext().getResourceAsStream("/download/" + filename);
        BufferedInputStream bis = new BufferedInputStream(ras);
        int x;
        //写入文件
        while ((x= bis.read())!=-1){
            bos.write(x);
        }
    }

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

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

相关文章

谷粒商城-商品上架

1.sku在es中的存储模型分析(spring整和es) es中所有数据存在内存中,内存产品贵,能节省就节省,只保存有用的信息 两种保存方法:(空间换时间,时间换空间): 我们选空间换时间 ES中放这些东西: "mappings": { "properties": { "skuId"…

ClickHouse 入门(二)【基础SQL操作】

1、ClickHouse 1.1、SQL 操作 这里只介绍一些和我们之前 MySQL 不同的语法&#xff1b; 1.1.1、Update 和 Delete ClickHouse 提供了 Delete 和 Update 的能力&#xff0c;这类操作被称为 Mutation 查询&#xff08;可变查询&#xff09;&#xff0c;它可以看 做 Alter 的一…

国产化低功耗HDMI转VGA方案,大量出货产品,广泛应用在显示器以及广告机产品

芯片描述&#xff1a; 兼具高性能和低成本效益的优点&#xff0c;是一款可以将高清视频 HDMI1.4 数字信号转换成 VGA 模拟信号输出的芯片。不需要提供外部电源&#xff0c;ICNM7301 就可以在正常模式下使用&#xff1b;ICNM7301 广 泛适用于各种市场系统和显示应用体系&#x…

2024-07-18 Unity插件 Odin Inspector8 —— Type Specific Attributes

文章目录 1 说明2 特定类型特性2.1 AssetList2.2 AssetSelector2.3 ChildGameObjectsOnly2.4 ColorPalette2.5 DisplayAsString2.6 EnumPaging2.7 EnumToggleButtons2.8 FilePath2.9 FolderPath2.10 HideInInlineEditors2.11 HideInTables2.12 HideMonoScript2.13 HideReferenc…

【 FPGA 线下免费体验馆】高端 AMD- xilinx 16 nm UltraScale +系列

在复杂的FPGA 开发的过程中&#xff0c;需要能够满足高速、高精度、多通道等的复杂应用。而一个简单的 FPGA 开发板是不具备这些的&#xff0c;因此需要用更高端&#xff0c;大容量&#xff0c;高速IO的 FPGA 芯片与其他硬件组成一个完整的系统开发。这里就产生了高端 FPGA 开发…

拍视频麦克风什么牌子好,什么麦克风音质好,无线麦克风品牌推荐

​当我们想要记录生活中的精彩瞬间&#xff0c;或是在工作中展现专业的一面时&#xff0c;声音的质量显得尤为重要。想象一下&#xff0c;在一间教室中&#xff0c;老师使用无线领夹麦克风&#xff0c;让每一个知识点都能准确无误地传达给学生&#xff1b;在一场激烈的体育赛事…

基于springboot新生宿舍管理系统

系统背景 在当今高等教育日益普及的时代背景下&#xff0c;高校作为知识传播与创新的重要基地&#xff0c;其基础设施的智能化管理显得尤为重要。新生宿舍作为大学生活的起点&#xff0c;不仅是学生日常生活与学习的重要场所&#xff0c;也是培养学生独立生活能力和团队合作精神…

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…

Kotlin泛型实化

内联函数 reified实现 1. 内联函数 内联函数中的代码会在编译的时候自动被替换到调用它的地方&#xff0c;这样的话也就不存在什么泛型擦除的问题了&#xff0c;因为代码在编译之后会直接使用实际的类型来替代内联函数中的泛型声明。 2. reified关键字 在Kotlin中&#xff0…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素&#xff1a;网络抖动、网络延时、音视频同步 网络抖动&#xff1a;视频帧在网络上传输&#xff0c;会受到网络抖动的影响&#xff0c;不能收到立刻播放&#xff0c;需要进行适当的平滑 网络延时&#xff1a;一些报文在…

Axure 教程 | 设置文本框背景透明

​在AXURE软件中&#xff0c;部件样式可以编辑&#xff0c;但有时却无法满足所有个性化原型的需求。例如文本框部件&#xff0c;可以设置是否隐藏边框&#xff0c;但即使隐藏边框之后&#xff0c;文本框还会有白色的背景。 当界面需要一个无背景色的输入框时&#xff0c;对于完…

h5点击电话号跳转手机拨号

需要使用到h5的 <a>标签 我们首先在<head>标签中添加代码 <meta name"format-detection" content"telephoneyes"/>然后再想要的位置添加代码 <a href"tel:10086"> 点击拨打&#xff1a;10086 </a> 这样功能就实现…

QtC++ 设计模式(五)——状态模式

状态模式 序言理解源码 序言 设计模式只是一个抽象的设计模式方法&#xff0c;并不是一个固定使用的搭配&#xff0c;就算是普通switch语句&#xff0c;Map&#xff0c;乃至状态机都是状态模式的其中一种实现方法 状态模式看起来好像和策略模式差不多&#xff0c;主要是其的侧…

FastAPI -- 第三弹(自定义响应、中间件、代理、WebSockets)

路径操作的高级配置 OpenAPI 的 operationId from fastapi import FastAPIapp FastAPI()# 通过 operation_id 参数设置 app.get("/items/", operation_id"some_specific_id_you_define") async def read_items():return [{"item_id": "F…

基于Llama Index构建RAG应用

前言 Hello&#xff0c;大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者&#xff0c;本文参与活动是2024 DataWhale AI夏令营&#xff1b;&#x1f632; 在本文中作者将通过&#xff1a; Gradio、Streamlit和LlamaIndex介绍 LlamaIndex 构…

与VR融合的LED显示屏

随着技术的飞速发展&#xff0c;广告行业已经迎来了3.0时代&#xff0c;这标志着户外LED显示屏不再仅仅局限于空间展示&#xff0c;而是转向了一个全新的维度——“空间时间人”的场景化营销。这种转变要求LED显示屏行业不仅要增强显示技术&#xff0c;还要将消费者的个性化特征…

【中项】系统集成项目管理工程师-第2章 信息技术发展-2.1信息技术及其发展-2.1.1计算机软硬件与2.1.2计算机网络

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

Spring框架之DI依赖注入

Di(Dependence Injection)依赖注入,在spring框架负责创建bean对象时,动态地将依赖对象注入到其它对象中 一、什么是依赖注入。 我们在下面构建spring的过程中体会依赖注入&#xff1b; 从上面的图中我们知道&#xff0c;在ssm框架中服务层&#xff08;server&#xff09;无法直…

【操作系统】文件管理——文件共享与保护,文件系统的结构(个人笔记)

学习日期&#xff1a;2024.7.18 内容摘要&#xff1a;文件共享&#xff0c;文件保护&#xff0c;文件系统的层级结构和全局结构&#xff0c;虚拟文件系统 文件共享 操作系统提供的文件共享功能&#xff0c;可以让多个用户共享使用同一个文件。文件共享和文件复制是不一样的&a…

DP(6) | 完全背包 | Java | LeetCode 322, 179, 139 做题总结

322. 零钱兑换 我的错误答案 class Solution {public int coinChange(int[] coins, int amount) {int[][]dp new int [coins.length][amount1];for(int j0; j<amount; j) {if(coins[0] j){dp[0][coins[0]] 1;}}for(int i1; i<coins.length; i) {for(int j0; j<am…