Response的学习笔记(属Servlet学习课程)

文章目录

  • Response
    • 设置响应消息数据
      • 1.设置响应行
      • 2.设置响应头
      • 3.设置响应体
    • 案例
      • 1.重定向
      • 2.输出字符数据到 Response 对象
        • 乱码的问题
          • 解决办法一
          • 解决办法二
      • 3.输出字节数据到 Response 对象
      • 4.验证码案例
    • 继承与实现体系

Response

该对象的功能就是用来设置响应消息(响应报文)。

程序员将响应数据封装到 Response 对象中,Tomcat 会从 Response 对象中取出程序员设置的响应数据,并将这些响应数据、响应头数据、响应行数据封装成响应报文(即响应数据包)返回给浏览器端。

设置响应消息数据

1.设置响应行

响应行格式:HTTP/1.1 200 OK
设置状态码:void setStatus(int sc)

2.设置响应头

void setHeader(String name, String value)

3.设置响应体

1.获取输出流
获取输出流:PrintWriter getWriter()

获取字节流:ServletOutputStream getOutputStream()

2.使用输出流,将响应数据输出到 ServletResponse 对象中

案例

1.重定向

// 设置重定向的状态码
resp.setStatus(302);
// 设置响应头
resp.setHeader("Location","/servlet_demo/response_demo02");

或者

// 重定向到ResponseDemo02
resp.sendRedirect("/servlet_demo/response_demo02");

2.输出字符数据到 Response 对象

// 获取字符输出流
PrintWriter pw = response.getWriter();
// 输出数据,写入数据。先写入到流对象的缓冲区,再写入到 Response 对象中,服务器再从 Response 对象中读取数据封装成响应报文返回给客户端
pw.write("<h1>hello</h1>");

乱码的问题

乱码的原因分析:
服务端输出数据,需要编码,而浏览器加载解析数据需要解码,乱码的原因就是编码和解码使用的编码格式不同所导致的。

浏览器用于解码的默认字符编码与操作系统有关,中文系统默认的字符编码是 GBK 或者 GB2312,而服务器端获取的输出流对象,是由 Tomcat 创建的,所以使用的字符编码是 ISO-8859-1,所以使用 GBK 或者 GB2312 去解码 ISO-8859-1 编码肯定出现乱码了。

解决办法一

不要使用 ISO-8859-1 进行编码,改为使用 GBK 进行编码。

示例代码如下:

// 在获取输出流之前将Response对象的字符编码设置为GBK,默认的是ISO-8859-1
resp.setCharacterEncoding("GBK");
// 获取字符输出流
PrintWriter pw = resp.getWriter();
// 输出数据
pw.write("<h1>刘德华</h1>");
解决办法二

在解决办法一种,直接将 Response 对象的字符编码设为 GBK,是因为你知道浏览器默认使用的是 GBK,如果你不知道呢?或者用户使用的浏览器默认的编码不是 GBK 呢?所以上述的写法还不够,你还需要告诉客户端响应数据所使用的字符编码,建议浏览器使用该编码进行解码。这样就不要管浏览器默认的字符编码是啥,浏览器在解析数据的时候会使用服务端建议的编码进行解码。

所以完整的示例代码如下:

 // 在获取输出流之前将Response对象的字符编码设置为GBK,默认的是 ISO-8859-1
resp.setCharacterEncoding("utf-8");// 告诉浏览器,服务器返回的响应体数据的字符编码,建议浏览器使用该编码进行解码
resp.setHeader("content-type","text/html;charset=utf-8");// 获取字符输出流
PrintWriter pw = resp.getWriter();
// 输出数据
pw.write("<h1>刘德华</h1>");

上述代码中的 resp.setCharacterEncoding("utf-8"); 可以去掉,因为 resp.setHeader("content-type","text/html;charset=utf-8"); 已经指明输出数据时需要使用什么字符编码,并且还告诉浏览器需要使用什么字符编码进行解码。

另外 resp.setHeader("content-type","text/html;charset=utf-8"); 可以替换成另外一个 API 进行简写,如下:

// 简单的写法,设置响应头Content-Type的值
resp.setContentType("text/html;charset=utf-8");

最终的示例代码如下:

// 设置响应头Content-Type的值
resp.setContentType("text/html;charset=utf-8");
// 获取字符输出流
PrintWriter pw = resp.getWriter();
// 输出数据
pw.write("<h1>刘德华</h1>");

3.输出字节数据到 Response 对象

示例代码:

// 设置Response对象的字符编码为utf-8
resp.setContentType("text/html;charset=utf-8");
// 获取字节输出流
ServletOutputStream sos = resp.getOutputStream();
// 获取字符的字节数组作为参数传递,写入到字节输出流中,最后会从字节输出流写入到Response对象中
sos.write("<h1>中国人</h1>".getBytes());

那么将消息头 Content-Type 的值设为 text/html;charset=gbk 行不行呢?

答:不行。设为 gb2312 也不行。因为通过响应消息头 Content-Type 设 置字符编码为 GBK,那么字符输出流会按 GBK 进行编码,而字节输出流是写入字节数据,需要获取字符的字节数组,通过 getBytes 方法获取字节数组,如果没有指定字符编码默认使用的是 UTF-8,所以写入的是 UTF-8 的字节数组,因此浏览器端收到的响应数据的编码格式是 UTF-8,而你又通过消息头Content-Type 告诉浏览器使用 GBK 解码,所以中文字符肯定出现乱码了。

我们知道浏览器在中文操作系统中默认的字符编码是 GBK,如果希望服务端在使用字节输出流输出数据时使用 GBK 编码,必须这样写:

 // 获取字节输出流
ServletOutputStream sos = resp.getOutputStream();
// 获取字符的字节数组作为参数传递,写入到字节输出流中,最后会从字节输出流写入到Response对象中
// getBytes方法指定字符编码参数为“GBK”才能得到”GBK“格式的字节数组
sos.write("<h1>中国人</h1>".getBytes("gbk"));

4.验证码案例

package priv.lwx.javaex.servlet_demo.web.servlet.response;import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;/*** 验证码示例代码** @author liaowenxiong* @date 2022/1/10 11:01*/
@WebServlet("/check_code")
public class CheckCodeServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int width = 100; // 表示图片的宽度,单位像素int height = 50; // 表示图片的高度,单位像素// 1.创建一个图片对象,代表内存中的验证码图片。图片对象创建好之后,就表示在内存中创建了一个图片(内存中存储的是二进制数据),图片背景色默认黑色BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);// 2.美化图片// 2.1.填充背景色// 先获取画笔Graphics graphics = image.getGraphics();// 设置画笔的颜色为粉红色graphics.setColor(Color.PINK);// 填充矩形graphics.fillRect(0, 0, width, height);// 2.2.画边框// 设置画笔的颜色为蓝色graphics.setColor(Color.BLUE);// 画边框graphics.drawRect(0, 0, -1, height - 1);// 画随机字符// 随机字符的来源String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 创建随机数对象Random ran = new Random();// 2.3.画随机字符。循环四次,画4个随机的字符for (int i = 1; i <= 4; i++) {// 生成随机的字符串下标int index = ran.nextInt(str.length());// 获取随机字符char c = str.charAt(index);// 画随机字符graphics.drawString(c + "", width / 5 * i, height / 2);}// 2.4.画干扰线// 设置画笔的颜色为绿色的graphics.setColor(Color.GREEN);// 获取随机的for (int i = 0; i < 10; i++) {// 获取两个随机点的坐标值int x1 = ran.nextInt(width);int x2 = ran.nextInt(width);int y1 = ran.nextInt(height);int y2 = ran.nextInt(height);// 画线graphics.drawLine(x1, y1, x2, y2);}// 3.将图片输出到Response对象的字节流中ImageIO.write(image, "jpg", resp.getOutputStream());}
}

继承与实现体系

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

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

相关文章

如何写一个高效进程/线程池_关于高效企业测试的思考(1/6)

如何写一个高效进程/线程池企业中的测试仍然没有得到应有的广泛应用。 编写尤其是维护测试需要花费时间和精力&#xff0c;但是缩短软件测试并不是解决方案。 为了提高测试效率&#xff0c;应该追求哪些范围&#xff0c;方法和测试技术&#xff1f; 基于许多实际项目&#xff…

智能音箱音效哪个好_华为支浩:音质好是底线,AI基本功扎实让智能音箱不再是“玩具”...

2020年&#xff0c;智能音箱市场的仗已经打了六年。立足国内&#xff0c;抑或放眼国际&#xff0c;似乎都是胜负已分&#xff0c;江山已定。可就在此时&#xff0c;一位“搅局者”闯入了大家视野。10月30日&#xff0c;华为年度旗舰新品发布会在上海举行。会上&#xff0c;华为…

JS(JavaScript)给元素绑定事件/给元素注册事件处理程序/给元素注册事件监听器

文章目录不使用 jQuery&#xff0c;给元素注册事件监听器通过jQuery给元素注册事件监听器通过标签的属性来注册事件监听器不使用 jQuery&#xff0c;给元素注册事件监听器 <script type"text/javascript">window.onload function () {alert("test"…

ssh无密码登陆权威指南

##【0】写在前面 ###由于ssh 实现的是免密码登陆&#xff0c;大致步骤是&#xff1a; 0.1&#xff09; client通过ssh登陆到server&#xff1b;0.2&#xff09; server检查家目录下的.ssh文件&#xff0c; 并发送公钥文件 authorized_keys 到client &#xff1b;0.3&#xff0…

java 十六进制浮点_Java十六进制浮点文字

java 十六进制浮点我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能&#xff0c;以减少代码重新格式化的可能性。 如果重新格式化&#xff0c;当前版本的代码将覆盖原本相同的代码。 这很烦人&#xff0c;因为按下重新格式化键的快捷键相当容易&#xff0c;而且许…

python时间倒计时显示屏厂家_python 实现倒计时功能(gui界面)

运行效果&#xff1a;完整源码&#xff1a;##import libraryfrom tkinter import *import timefrom playsound import playsound## display windowroot tk()root.geometry(400x300)root.resizable(0,0)root.config(bg blanched almond)root.title(techvidvan - countdown cloc…

IntelliJ IDEA中Maven操作窗口的命令详解/Maven命令详解/Maven生命周期命令详解

文章目录生命周期命令简介命令详解testpackage命令演示verifyinstall将当前项目放到 Maven 的本地仓库中&#xff0c;供其他项目使用将自己打包或者下载的 jar/war 文件复制到本地仓库中&#xff0c;供其他模块使用sitedeploy生命周期命令简介 在 Maven 中&#xff0c;项目构建…

基于Apache POI 向xlsx写入数据

【0】写在前面 0.1&#xff09; these codes are from 基于Apache POI 的向xlsx写入数据0.2&#xff09; this idea is from http://cwind.iteye.com/blog/2187670 , adding some comments for easy understanding proves to be my work. package com.cwind.poi; import jav…

javafx 打开新窗口_新的JMetro JavaFX 11兼容版本

javafx 打开新窗口你好&#xff0c;我们又见面了&#xff01; 这次&#xff0c;新版本与JavaFX 11兼容。 继续阅读以获取详细信息。 JMetro 8.5.7和11.5.7版本 JMetro代码已分为2个分支。 master分支具有Java 8兼容的JMetro版本&#xff0c;“ 11”分支具有Java 11兼容的版本…

后勤管理系统_充满“智慧”的后勤管理系统是什么样的?

▲2020年4月7日&#xff0c;亿力信息公司部署的后勤管理系统二期上线试运行&#xff0c;技术人员在现场指导用户进行系统的基本操作后勤管理系统二期全面提升管理效能近日&#xff0c;亿力信息公司承接部署的后勤管理系统二期已上线试运行&#xff0c;通过贯穿资产全寿命周期的…

Final Cut Pro 在视频的多个地方同时打马赛克

文章目录使用风格化效果中的像素化或者模糊效果使用风格化效果中的删减效果让马赛克显示一段时间后消失使用风格化效果中的像素化或者模糊效果 像素化和模糊效果是将整个视频画面都像素化和模糊化&#xff0c;所以如果你要将画面中的某个部分打马赛克&#xff0c;其实这样的效…

亚麻纤维截面形态_天然丝纤维蚕丝

点击蓝字 关注我们我国是蚕丝的发源地。近年来&#xff0c;对出土文物的考古研究指出&#xff0c;蚕丝在我国已有六千多年的历史。柞蚕丝也起源于我国&#xff0c;根据历史记载&#xff0c;已有三千多年的历史。远在汉、唐时代&#xff0c;我国的丝绸就畅销于中亚和欧洲各国&am…

jep122_JEP 358:有用的NullPointerExceptions

jep122在文章“ 更好的默认NullPointerException消息是否会传入Java&#xff1f; ”&#xff0c;我总结了当时与JEP 草案有关的背景细节&#xff0c;有关使某些类型的NullPointerException &#xff08;NPE&#xff09;消息更有用。 上周很高兴看到该JEP现在是候选 JEP &#x…

目录、文件夹、文件三者的区别

目录也是文件&#xff0c;是一种特殊文件&#xff0c;叫目录文件&#xff0c;简称目录。 目录是文件系统对象&#xff0c;属于文件系统的概念 术语目录指的是文档文件和文件夹的结构化列表存储在计算机上的方式。它与包含姓名、号码和地址列表的电话簿相当&#xff0c;并且不包…

基于Apache POI 从xlsx读出数据

【0】写在前面 0.1&#xff09; these codes are from 基于Apache POI 的从xlsx读出数据0.2&#xff09; this idea is from http://cwind.iteye.com/blog/2187670 , adding some comments for easy understanding proves to be my work. package com.cwind.poi; import jav…

toarray方法_机器学习中类别变量的编码方法总结

作者&#xff1a;louwill&#xff1b;转载自&#xff1a;机器学习实验室在做结构化数据训练时&#xff0c;类别特征是一个非常常见的变量类型。机器学习中有多种类别变量编码方式&#xff0c;各种编码方法都有各自的适用场景和特点。本文就对机器学习中常见的类别编码方式做一个…

java实现可选形参_Java:可选的可选实现

java实现可选形参类java.util.Optional被实现为单个不可变的具体类&#xff0c;该类在内部处理两种情况。 一个有元素&#xff0c;一个没有元素。 让Optional作为一个接口并让两个不同的实现代替实现该接口不是更好的选择吗&#xff1f; 毕竟&#xff0c;这就是我们通常被教导要…

MySQL数据库的JSON数据类型详解

文章目录JSON 数据类型意义存储JSON串修改JSON串中指定字段的值查询 JSON 串中的数据查询 JSON 串中指定字段的值特殊语法精确查询嵌套精确查询模糊查询优化 JSON 查询处理 JSON 数据的常用函数JSON_CONTAINS_PATHJSON_PRETTY总结参考资料JSON 数据类型意义 其实&#xff0c;没…

高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)

【0】写在前面 0.1&#xff09;本代码旨在演示 从 ring0 转移到 ring3&#xff08;即&#xff0c;从高特权级 转移到 低特权级&#xff09;0.2&#xff09;本文 只对 与 门相关的 代码进行简要注释&#xff0c;言简意赅&#xff1b;0.3&#xff09;文末的个人总结是干货&#…

aws 删除ec2实例_如何在AWS中启动EC2实例

aws 删除ec2实例你好朋友&#xff0c; 在本教程中&#xff0c;我们将看到如何立即在AWS中旋转EC2实例。 您应该有权访问AWS控制台。如果您还没有AWS账户&#xff0c;则可以单击此处并在AWS上创建免费套餐。 如何在AWS中启动EC2实例 第1步 &#xff1a; 使用您的凭证登录到您…