板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】

这篇具有很好参考价值的文章主要介绍了板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在上一节中,我们系统的学习了请求响应在Servlet中service()方法的第一个形参HttpServletRequest(请求)对象,这一节中我们将学习它的兄弟,service()方法的第二个形参HttpServletResponse(响应)对象

一、什么是HttpServletResponse

在我们已然熟悉的浏览器访问Servlet的过程中。Request和Response 对象分别代表请求和响应:通过Request对象获取客户端数据;通过 Response 对象向客户端输出数据:
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
service()方法中形参接收的是HttpServletResponse接口的实例化对象,它继承自ServletResponse接口,专门用来封装HTTP响应消息,由于HTTP响应消息分为状态行响应消息头消息体三部分(详见HTTP协议理论与服务器请求响应原理小节),因此在HttpServletResponse中定义了状态行、响应消息头、消息体三部分。

  • 状态行部分
    响应消息头包含了关于响应的附加信息,例如内容类型、内容长度、缓存控制等。由setStatus(int status)方法实现,该方法用于设置HTTP响应消息的状态码,并生成相应代码;默认会生成一个状态码为200的状态行;
  • 响应消息头部分
    响应消息头包含了关于响应的附加信息,例如内容类型、内容长度、缓存控制等。可以使用setHeader(String name, String value)方法设置响应消息头的字段和值,例如setHeader("Content-Type", "text/html")设置内容类型为HTML。如果要设置相同字段的多个值,可以使用addHeader(String name, String value)方法,例如addHeader("Set-Cookie", "cookie1=value1")。此外还可以使用一些特定的方法来设置常见的响应消息头,例如setContentType(String type)setContentLength(int len)
  • 消息体部分
    消息体包含了实际的响应数据。可以通过获取ServletOutputStream或PrintWriter对象来写入响应消息体。getOutputStream()方法返回一个可以写入二进制数据的ServletOutputStream对象。
    getWriter()方法返回一个可以写入字符数据的PrintWriter对象。
    可以使用这些对象的方法将数据写入响应消息体,例如print(String s)、write(byte[] b)等。

二、响应数据的常用方法

接收到客户端请求后,可以通过HttpServletResponse对象直接进行响应,响应时需要获取输出流。
有两种形式:

  • getWriter() 获取字符流(只能响应字符串)
  • getOutputStream() 获取字节流(能响应一切数据)

响应回的数据到客户端被浏览器解析
注意:两者不能同时使用

实例
在start.java导入PrintWriter类,并在service()中写入测试代码

// 获取字符输出流
PrintWriter writer = resp.getWriter();
//输出数据
writer.write("Hello");

启动服务器,在浏览器中访问得
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
在start.java中导入ServletOutputStream类,并在service()中写入测试代码

//得到字节输出流
ServletOutputStream out = resp.getOutputStream();
// 输出数据
out.write("Hi".getBytes());

启动服务器,在浏览器中访问得
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
但当两者同时使用时
start.java

package www.caijiyuan;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/start")
public class start extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取字符输出流
        PrintWriter writer = resp.getWriter();
        //输出数据
        writer.write("Hello");
        
        //得到字节输出流
        ServletOutputStream out = resp.getOutputStream();
        // 输出数据
        out.write("Hi".getBytes());
    }
}

启动服务器,在浏览器中访问,只得到了第一个的打印内容
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
这是为什么呢?查看报错信息
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive原来是getWriter()已经调用过response对象了,如果再响应一次response对象就已经不存在了

三、响应乱码问题

在上一节中我们使用request.setCharacterEncoding("UTF-8");解决了请求时中文乱码的问题,同样,在响应时也存在中文乱码问题。这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。

字符流乱码

对于getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用ISO-8859-1格式的编码,该编码方式并不支持中文。要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式,这也是我们在解决请求时中文乱码的方法

response.setCharacterEncoding("UTF-8");

此时还只完成了一半的工作
要保证数据正确显示,还需要指定客户端的解码方式

response.setHeader("content-type", "text/html; charset=UTF-8");

两端指定编码后,乱码就解决了。一句话:保证发送端接收端编码一致

实例
我们在start.java的service()中写入测试测试代码,试图打印中文

// 获取字符输出流
PrintWriter writer = resp.getWriter();
//输出数据
writer.write("汤米尼克");

启动服务器,在浏览器中访问,发现输出中文乱码
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
设置服务器和客户端的编码格式统一

// 设置服务端的编码
resp.setCharacterEncoding("UTF-8");
// 设置客户端的响应类型及编码
resp. setHeader("content-type", "text/html; charset=UTF-8");
// 获取字符输出流
PrintWriter writer = resp.getWriter();
// 输出数据
writer.write("汤米尼克");

重启浏览器,再在浏览器中访问就解决问题了
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
理解了原理,其实我们还可以同时设置客户端和服务端的编码方式

response.setContentType( "text/html; charset=UTF-8");

这一句就可以替换上面的两句

字节流乱码

对于getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节,所以此时可能出现乱码,也可能正确显示。当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。无论如何我们都应该准确掌握服务器和客户端使用的是那种编码格式,以确保数据正确显示。
因此,字节流乱码的解决方式与上面字符流乱码的解决方式一样,在响应发出之前同时设置服务器和客户端的编码格式统一即可

response.setContentType( "text/html; charset=UTF-8");

四、重定向:sendRedirect

重定向是一种服务器为指导的客户端行为
怎么理解这句话呢?客户端发出一个请求,被服务器接收处理后进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址),当客户端接收到响应后,会立刻、马上自动根据服务器给的新地址发起第二个请求,服务器接收请求并作出响应,重定向完成。可以看出这个过程中有两个请求存在,其中两个Servlet的Request对象并不共享、不能传值,属于客户端行为。

在Servlet中重定向的语句为

response.sendRedirect("url");

实例:从start.java重定向到after.java的过程
在start.java的service()中写入重定向前的测试代码

System.out.println("这里是start");
resp.sendRedirect("after");

在after.java的service()中写入重定向到底测试代码

System.out.println("这里是after");

启动服务器,在浏览器中输入start的地址
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
回车访问后地址立即跳转到after,说明重定向的地址栏会发生改变
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
同时控制台输出了
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
那么重定向在服务器中的响应头是如何实现的?
如下图,在开发者工具中打开响应头的内容
板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】,汤米尼克的JAVAEE+Spring 全套教程,servlet,java-ee,hive
会发现start文件响应行的状态码是302,这就是重定向的状态码
并且响应头键值对中Location键的值就是要重定向到的地址:after文件
这与我们在第一节 HTTP协议理论与服务器请求响应原理中学习的响应头的知识首尾呼应起来了

请求转发和重定向的区别

上一节中我们学习了Request对象的请求转发,这一节又学习了Response对象的重定向,两兄弟让人傻傻分不清,必须好好区分区分

请求转发 重定向
request.getRequestDispatcher("url").forward(request, response); response.sendRedirect("url");
服务器端行为 客户端行为
一次请求,Request域中数据共享 两次请求,Request域中数据不共享
地址栏不发生变化 地址栏发生变化
跳转只能在当前站点内 跳转任意地址

在这一节中我们学习了HttpServletResponse对象,学习了字符流字节流响应方法、重定向方法。不禁思考,Servlet作为“后端”,在Web交互中最重要的作用就是传递各种数据,但目前我们学到的传值的方法还知之甚少,在下一节中我们将学习Cookie对象、HttpSession对象、ServletContext对象,它们作为不同特点的容器在Servlet上可以实现不同范围的传值文章来源地址https://www.toymoban.com/news/detail-833526.html

到了这里,关于板块一 Servlet编程:第四节 HttpServletResponse对象全解与重定向 来自【汤米尼克的JAVAEE全套教程专栏】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的详细内容

    JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的详细内容

    Servlet 是 Sun 公司开发动态 Web 的一门技术,在这些 API 中提供了一个接口就是:Servlet,开发一个 Servlet 程序需要 两个步骤 : 编写一个类,实现 Servlet 接口; 把开发好的 java 类部署到 Web 服务器中。 把实现了 Servlet 接口的 Java 程序叫做 Servlet 。 创建一个普通的 Maven 项目,注

    2024年02月03日
    浏览(10)
  • 第四节 LVGL部件使用

    第四节 LVGL部件使用

    LVGL采用的是面向对象的编程思想,以抽象的类来实例化不同的对象(部件)。 C语言中没有“类”的概念,LVGL以结构体的形式来实现“类”的思维。 基础对象(lv_obj)可以作为父对象,来创建其他对象,同时它也可作为部件使用。 大小(size) 位置(position) 对齐(alignme

    2024年02月06日
    浏览(14)
  • 【测试开发】第四节.测试开发(测试分类)

    【测试开发】第四节.测试开发(测试分类)

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录 前言 一、 有关测试用例的回顾 二、 测试用例的划分  2.1 按照测试对象来划分 2.1.1 可靠性测试 2.1.2 容错性测试

    2024年02月07日
    浏览(12)
  • 【机器学习】第四节:监督学习算法对比评估

    【机器学习】第四节:监督学习算法对比评估

      作者 🕵️‍♂️:让机器理解语言か 专栏 🎇:机器学习sklearn 描述 🎨:本专栏主要分享博主学习机器学习的笔记和一些心得体会。 寄语 💓:🐾没有白走的路,每一步都算数!🐾          监督学习(英语:Supervised learning)是机器学习中最为常见、应用最为广泛的

    2024年02月02日
    浏览(10)
  • 第四节 zookeeper集群与分布式锁

    第四节 zookeeper集群与分布式锁

    目录 1. Zookeeper集群操作 1.1 客户端操作zk集群 1.2 模拟集群异常操作 1.3 curate客户端连接zookeeper集群 2. Zookeeper实战案例 2.1 创建项目引入依赖 2.2 获取zk客户端对象 2.3 常用API 2.4 客户端向服务端写入数据流程 2.5 服务器动态上下线、客户端动态监听 2.6 测试 3.Zookeeper分布式锁 3.

    2024年02月20日
    浏览(9)
  • 【数据结构初阶】第四节.链表详讲

    【数据结构初阶】第四节.链表详讲

    前言 一、单链表的概念 二、链表的创建 2.1链表的初始化 2.2 打印链表 2.3 获取链表的长度 2.4 判断链表是否为空 三、新增结点 3.1头插 3.2 指定下标插入 四、删除结点 4.1 头删 4.2 指定下标的删除 4.3 删除链表中的指定元素 五、单链表查找 六、附录 总代码 测试代码 总结 前

    2023年04月15日
    浏览(11)
  • 计算机网络第四节 数据链路层

    计算机网络第四节 数据链路层

    数据链路层是体系结构中的第二层; 从 发送端 来讲,物理层可以将数据链路层交付下来的数据,装换成光,电信号发送到传输介质上了 从 接收端 来讲,物理层能将传输介质的光,电信号接受还原成比特流;要交给数据链路层 数据链路层自己要保障所发出的数据能正确的到

    2024年02月09日
    浏览(6)
  • java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.setContentLengthLong(J)V

    java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.setContentLengthLong(J)V

    先说原因,其实都是你的jar有问题 1.jar冲突 2.少依赖了包 网上很多说springmvc和springwebmvc,版本高于5.3.0导致的,会有这个问题,那是因为他们没看过源码,高版本的因为在这里,多了一行代码,这里设置的时候,会到实现类里面写一个东西,this.servletResponse.setContentLengthLong(

    2024年02月11日
    浏览(7)
  • 第四节 如何使用Midjourney工具完成图生图

    第四节 如何使用Midjourney工具完成图生图

    正在上一节课中,我们学会如何使用MJ生成一张自己喜欢的图片,我们可以称其为文生图,既利用文字描述来生成一张图片。但是,文生图有个致命的缺陷就是随机性太强,你无法预料MJ生成的图片将会是怎么样的,运气好的话第一次生图就能得到满意的照片,运气不好可能要

    2024年02月16日
    浏览(7)
  • 【JavaEE初阶】前端第四节.JavaScript入门学习笔记

    【JavaEE初阶】前端第四节.JavaScript入门学习笔记

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、前置知识  1、JS 和 HTML 和 CSS 之间的关系 1.2 JS 的书写形式 1.2.1 内嵌式 1.2.2 行内式  1.2.3 外部式 1.2.4 扩展 1.2

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包