首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaWeb day8 Request和Response快速入门(下)Response

JavaWeb day8 Request和Response快速入门(下)Response

原创
作者头像
小小程序员
发布于 2023-02-22 13:58:42
发布于 2023-02-22 13:58:42
7891
举报

Response对象

前面讲解完Request对象,接下来我们回到刚开始的那张图:

在这里插入图片描述
在这里插入图片描述
  • Request:使用request对象来==获取==请求数据
  • Response:使用response对象来==设置==响应数据

Reponse的继承体系和Request的继承体系也非常相似:

在这里插入图片描述
在这里插入图片描述

介绍完Response的相关体系结构后,接下来对于Response我们需要学习如下内容:

  • Response设置响应数据的功能介绍
  • Response完成重定向
  • Response响应字符数据
  • Response响应字节数据

3.1 Response设置响应数据功能介绍

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

  1. 响应行
    在这里插入图片描述
    在这里插入图片描述

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

代码语言:txt
AI代码解释
复制
void setStatus(int sc);
  1. 响应头
在这里插入图片描述
在这里插入图片描述

设置响应头键值对:

代码语言:txt
AI代码解释
复制
void setHeader(String name,String value);
  1. 响应体
    在这里插入图片描述
    在这里插入图片描述

对于响应体,是通过字符、字节输出流的方式往浏览器写,

获取字符输出流:

代码语言:txt
AI代码解释
复制
PrintWriter getWriter();

获取字节输出流

代码语言:txt
AI代码解释
复制
ServletOutputStream getOutputStream();

介绍完这些方法后,后面我们会通过案例把这些方法都用一用,首先先来完成下重定向的功能开发。

3.2 Respones请求重定向

  1. ==Response重定向(redirect):一种资源跳转方式。==
在这里插入图片描述
在这里插入图片描述

(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求

(2)资源A现在无法处理该请求,就会给浏览器响应一个302的状态码+location的一个访问资源B的路径

(3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B

(4)资源B接收到请求后进行处理并最终给浏览器响应结果,这整个过程就叫==重定向==

  1. 重定向的实现方式:
代码语言:txt
AI代码解释
复制
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");

具体如何来使用,我们先来看下需求:

在这里插入图片描述
在这里插入图片描述

针对上述需求,具体的实现步骤为:

1.创建一个ResponseDemo1类,接收/resp1的请求,在doGet方法中打印resp1....

2.创建一个ResponseDemo2类,接收/resp2的请求,在doGet方法中打印resp2....

3.在ResponseDemo1的方法中使用

response.setStatus(302);

response.setHeader("Location","/request-demo/resp2") 来给前端响应结果数据

4.启动测试

(1)创建ResponseDemo1类

代码语言:java
AI代码解释
复制
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp1....");
    }

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

(2)创建ResponseDemo2类

代码语言:java
AI代码解释
复制
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp2....");
    }

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

(3)在ResponseDemo1的doGet方法中给前端响应数据

代码语言:java
AI代码解释
复制
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp1....");
        //重定向
        //1.设置响应状态码 302
        response.setStatus(302);
        //2. 设置响应头 Location
        response.setHeader("Location","/request-demo/resp2");
    }

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

(4)启动测试

访问http://localhost:8080/request-demo/resp1,就可以在控制台看到如下内容:

在这里插入图片描述
在这里插入图片描述

说明/resp1/resp2都被访问到了。到这重定向就已经完成了。

虽然功能已经实现,但是从设置重定向的两行代码来看,会发现除了重定向的地址不一样,其他的内容都是一模一样,所以request对象给我们提供了简化的编写方式为:

代码语言:txt
AI代码解释
复制
resposne.sendRedirect("/request-demo/resp2")

所以第3步中的代码就可以简化为:

代码语言:java
AI代码解释
复制
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp1....");
        //重定向
        resposne.sendRedirect("/request-demo/resp2")}

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  1. 重定向的特点
  • 浏览器地址栏路径发送变化

当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化

在这里插入图片描述
在这里插入图片描述
  • 可以重定向到任何位置的资源(服务内容、外部均可)

因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。

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

因为浏览器发送了两次请求,是两个不同的request对象,就无法通过request对象进行共享数据

介绍完==请求重定向==和==请求转发==以后,接下来需要把这两个放在一块对比下:

在这里插入图片描述
在这里插入图片描述

以后到底用哪个,还是需要根据具体的业务来决定。

3.3 路径问题

  1. 问题1:转发的时候路径上没有加/request-demo而重定向加了,那么到底什么时候需要加,什么时候不需要加呢?
    在这里插入图片描述
    在这里插入图片描述

其实判断的依据很简单,只需要记住下面的规则即可:

  • 浏览器使用:需要加虚拟目录(项目访问路径)
  • 服务端使用:不需要加虚拟目录

对于转发来说,因为是在服务端进行的,所以不需要加虚拟目录

对于重定向来说,路径最终是由浏览器来发送请求,就需要添加虚拟目录。

掌握了这个规则,接下来就通过一些练习来强化下知识的学习:

  • <a href='路劲'>
  • <form action='路径'>
  • req.getRequestDispatcher("路径")
  • resp.sendRedirect("路径")

答案:

代码语言:txt
AI代码解释
复制
1.超链接,从浏览器发送,需要加
2.表单,从浏览器发送,需要加
3.转发,是从服务器内部跳转,不需要加
4.重定向,是由浏览器进行跳转,需要加。
  1. 问题2:在重定向的代码中,/request-demo是固定编码的,如果后期通过Tomcat插件配置了项目的访问路径,那么所有需要重定向的地方都需要重新修改,该如何优化?
在这里插入图片描述
在这里插入图片描述

答案也比较简单,我们可以在代码中动态去获取项目访问的虚拟目录,具体如何获取,我们可以借助前面咱们所学习的request对象中的getContextPath()方法,修改后的代码如下:

代码语言:java
AI代码解释
复制
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("resp1....");

        //简化方式完成重定向
        //动态获取虚拟目录
        String contextPath = request.getContextPath();
        response.sendRedirect(contextPath+"/resp2");
    }

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

重新启动访问测试,功能依然能够实现,此时就可以动态获取项目访问的虚拟路径,从而降低代码的耦合度。

3.4 Response响应字符数据

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

  • 通过Response对象获取字符输出流: PrintWriter writer = resp.getWriter();
  • 通过字符输出流写数据: writer.write("aaa");

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

  1. 返回一个简单的字符串aaa
代码语言:java
AI代码解释
复制
/**
 * 响应字符数据:设置字符数据的响应体
 */
@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字符串,并且能被浏览器解析
代码语言:txt
AI代码解释
复制
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");
在这里插入图片描述
在这里插入图片描述

==注意:==一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流。

  1. 返回一个中文的字符串你好,需要注意设置响应数据的编码为utf-8
代码语言:txt
AI代码解释
复制
//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
writer.write("你好");
在这里插入图片描述
在这里插入图片描述

3.3 Response响应字节数据

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

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

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

  1. 返回一个图片文件到浏览器
代码语言:java
AI代码解释
复制
/**
 * 响应字节数据:设置字节数据的响应体
 */
@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的代码还是比较复杂的,所以我们可以使用别人提供好的方法来简化代码的开发,具体的步骤是:

(1)pom.xml添加依赖

代码语言:html
AI代码解释
复制
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

(2)调用工具类方法

代码语言:txt
AI代码解释
复制
//fis:输入流
//os:输出流
IOUtils.copy(fis,os);

优化后的代码:

代码语言:java
AI代码解释
复制
/**
 * 响应字节数据:设置字节数据的响应体
 */
@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);
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
感谢分享
感谢分享
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
JavaWeb核心篇(2)——Request和Response
上篇文章中提及到了Servlet,在Servlet中我们主要继承了HTTPServlet类,在HTTPServlet类中我们会接触到两个对象
秋落雨微凉
2022/10/25
6510
JavaWeb核心篇(2)——Request和Response
12-Request对象+Response对象
上述重定向操作中不难看出,状态码设为302是固定的,响应头的名称设为location也是固定的,唯一在重定向时会发生变化的就是跳转资源的路径,所以response对象将重定向进行了封装
Ywrby
2022/10/27
6420
12-Request对象+Response对象
java从入门到精通二十三(Servlet)
就那我么部署的项目来说。我们开启服务后。然后我们通过一段链接来访问我们的服务器然后得到响应数据。
兰舟千帆
2022/07/16
9900
java从入门到精通二十三(Servlet)
Java学习之Response篇
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/119940.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/13
2910
JavaWeb day7 Request和Response(上)
==Request是请求对象,Response是响应对象。==这两个对象在我们使用Servlet的时候有看到:图片
小小程序员
2023/02/21
8350
JavaWeb day7 Request和Response(上)
20. Servlet入门 - response介绍以及使用
在前面的篇章中我们已经认识了 resquest 请求的相关作用,那么下面来继续认识一下 response 响应。
Devops海洋的渔夫
2022/01/14
9020
20. Servlet入门 - response介绍以及使用
http & request & response的学习
HTTP: 1. 概念: * Hyper Text Transfer Protocol 超文本传输协议 * 传输协议:定义了,客户端和服务器端通信时,发送数据的格式 * 特点: 1.基于TCP/IP的高级协议 2.默认端口号:80 3.基于请求/响应模型的:一次请求对应一次响应 4.无状态的:每次请求之间相互独立,不能交互数据 * 历史版本: * 1.0:每一次请求响应都会建立新的连接 * 1.1:复用连接 2.
Rochester
2020/09/01
7670
JavaWeb——HTTP响应协议及Response对象使用方法一点通及案例实战(重定向、输出字符/字节数据到浏览器、验证码实现)
HTTP协议,请求消息是客户端发送给服务器的数据,响应消息是服务器端发送给客户端的数据,其数据格式为:
Winter_world
2020/09/25
1.3K0
JavaWeb——HTTP响应协议及Response对象使用方法一点通及案例实战(重定向、输出字符/字节数据到浏览器、验证码实现)
E014Web学习笔记-Request和Respons(二)
在整个J2EE的编程过程中,我们经常会从各种配置文件中读取相应的数据,需要明白的一点是从配置文件中读取到的数据都是String,但是很显然我们的应用程序中不仅仅有String一种数据类型,比如:基本数据类型(int、double、char、float等),还有自定义数据类型(引用数据类型),那么我们必须面临的一个问题就是将字符串类型转换为各种具体的数据类型,BeanUtils工具类就是来干这件事情的!
訾博ZiBo
2025/01/06
930
E014Web学习笔记-Request和Respons(二)
Servlet中Responce对象的基本使用和验证码图片案例
Response对象 功能:设置响应消息 1. 设置响应行 1. 格式:HTTP/1.1 200 ok 2. 设置状态码:setStatus(int sc) 2. 设置响应头:setHeader(String name, String value) 3. 设置响应体: * 使用步骤: 1. 获取输出流 * 字符输出流:PrintWriter getWriter() * 字节输出流:ServletOutputStream getOutputStream() 2. 使用输出流,将数据输出到客
不愿意做鱼的小鲸鱼
2022/09/24
6340
Servlet中Responce对象的基本使用和验证码图片案例
JavaWeb 入门篇(4)HttpResponse 详解 HttpRequest 详解
​ 在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。
宁在春
2022/10/31
6640
JavaWeb 入门篇(4)HttpResponse 详解 HttpRequest 详解
tomcat和servlet快速入门教程!!!
4.1 bin/startup.bat ,双击运行该文件即可 4.2 访问:浏览器输入: http://localhost:8080 回车访问自己 或者 http://别人的ip:8080 访问别人 可以通过ipconfig:查看本机ip地址
大忽悠爱学习
2021/11/15
5050
【愚公系列】2023年03月 Java教学课程 090-Servlet服务器的Response
Response响应对象是指在Web开发中,服务器端向客户端返回的HTTP响应消息。它包含了HTTP状态码、响应头和响应体等信息。在使用Web框架时,我们可以通过Response对象来设置响应的状态码、响应头和响应体等内容,以便向客户端返回需要的信息。
愚公搬代码
2023/03/17
3280
【愚公系列】2023年03月 Java教学课程 090-Servlet服务器的Response
Javaweb核心响应对象
响应,它表示了服务器端收到请求,同时也已经处理完成,把处理的结果告知用户。简单来说,指的就是服务器把请求的处理结果告知客户端。在B/S架构中,响应就是把结果带回浏览器。
楠羽
2022/11/18
6700
Javaweb核心响应对象
Java Web(七)Request&Response
2.请求头 User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
浅辄
2022/11/23
3430
Java Web(七)Request&Response
Java Request(域对象+请求转发+原理)详解
request对象 request对象和response对象都是由服务器创建的,我们是来使用他们 request对象是用来获取请求消息的,response对象是用来设置响应消息的
一只胡说八道的猴子
2020/09/27
4.3K0
Java Request(域对象+请求转发+原理)详解
Java学习笔记-全栈-web开发-06-Request&Response
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
devi
2021/08/18
4340
JavaWeb——ServletContext对象的使用及文件下载案例实战
ServletContext代表整个web应用,可以和程序的容器(服务器)来通信,功能如下:
Winter_world
2020/09/25
6140
JavaWeb——ServletContext对象的使用及文件下载案例实战
什么是转发和重定向转发_转发和重定向的相同点
1. 编写ResponseDemo1,将请求重定向到ResponseDemo2。
全栈程序员站长
2022/10/04
1K0
什么是转发和重定向转发_转发和重定向的相同点
E015Web学习笔记-Request和Respons(三)
如果超链接指向的资源可以被浏览器解析,则会展示在浏览器里面,否则弹出下载框,询问下载;
訾博ZiBo
2025/01/06
940
E015Web学习笔记-Request和Respons(三)
推荐阅读
相关推荐
JavaWeb核心篇(2)——Request和Response
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档