• 【JavaWeb】一文搞懂Response


    在这里插入图片描述

    1 Response继承体系

    response和request一样

    image-20220911094633057

    2 Response响应

    2.1 响应行

    image-20220911104054592

    方法名方面类型方法作用
    setStatus(int sc)void设置响应状态码

    2.2 响应头

    image-20220911103925357

    方法名方法类型方法作用
    setHeader(String name, String value)void设置响应头键值对

    2.3 响应体

    image-20220911104504293

    方法名方法类型方法作用
    getWriterPrintWriter获取字符输出流
    getOutputStreamServletOutputStream获取字节输出流

    3 Response 重定向

    3.1 什么是重定向

    重定向(Redirect):一种资源跳转方式

    image-20220911112746722

    3.1.1 重定向实现的步骤

    1. 告诉浏览器,这件事我处理不了:状态码302
    2. 你去找别人吧,告诉别人的位置 location:xxx

    3.1.2 例子

    两个核心的方法:

    • SetStatus(302 ):用来设置状态码
    • SetHeader(“location”,“虚拟路径/资源B的路径”):用来让服务器找下家
    package com.you.web.response;
    
    import javax.jws.WebService;
    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.io.IOException;
    
    @WebServlet(urlPatterns = "/webResponse01")
    public class webResponse01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("webResponse01....");
            /*1、设置状态码*/
            resp.setStatus(302);
            /*2、设置重定向资源目录*/
            resp.setHeader("location","/JavaWeb_Demo_05_war/webResponse02");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    package com.you.web.response;
    
    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.io.IOException;
    
    @WebServlet(urlPatterns = "/webResponse02")
    public class webResponse02 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("webResponse02....");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    image-20220911113935286

    3.2 重定向简化

    基于3.1 重定向需要两个核心方法,但是都是固定的代码,只有资源路径需要更改,所以Java的开发者替我们封装了一个代码只需要传入资源路径即可。

    方法名方法类型方法作用
    sendRedirect(String location)void传入资源路径,完成重定向

    如下

     resp.sendRedirect("/JavaWeb_Demo_05_war/webResponse02");
    
    • 1

    3.3 重定向的特点

    1. 浏览器地址栏路径发生变化
    2. 可以重定向到任意位置(服务器内部、外部均可)
    3. 两次请求,不能再多个资源适用request共享数据

    3.4 资源路径(要不要加虚拟目录)

    3.4.1 两种情况

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

      image-20220911154543743

    • 服务端使用:不需要加虚拟目录

    3.4.2 动态配置虚拟目录

    上一章:一文搞懂Request http://t.csdn.cn/8FGMd 提到一个方法可以获取虚拟目录

    方法名方法类型方法作用
    getContextPathString获取虚拟目录(资源的访问路径)

    将WebResponse01 修改成 如下代码

    image-20220911155554621

    【效果】

    image-20220911155509767

    简单提一下为什么要动态配置虚拟目录?

    因为在项目开放过程中,我们很有可能修改项目的访问路径,这样的话重定向的可维护性非常的差,所以需要配置虚拟目录。

    4 Response响应字符数据

    4.1 使用

    1. 通过Response对象获取字符输出流。

      PrintWriter writer = resp.getWriter();
      
      • 1
    2. 写数据

    wirter.write("aaa")
    
    • 1

    ​ 这个流是不需要关闭的,随着响应结束,response对象销毁,由服务器关闭

    4.1.1 实战

    写一段如下的代码

    @WebServlet("/webResponse03")
    public class webResponse03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer = resp.getWriter();
            writer.write("aaa");
            writer.write("

    aaa

    "
    ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    效果

    image-20220911161450531

    4.2 设置格式

    浏览器默认认为所有的字符串都是文本格式,若是想渲染前端标签,需要设置格式

    加上这一句,设置成html格式就可以了

    image-20220911161843445

    resp.setHeader("content-type","text/html");
    
    • 1

    效果图:

    image-20220911162029779

    4.3 解决中文乱码

    getWriter的默认编码规则是ISO-8859-1,使用中文字符会乱码。

    核心方法:不仅可以设置格式,还可以设置编码

    void setContentType(String type)
    
    • 1

    设置编码需要在获取之前

    @WebServlet("/webResponse03")
    public class webResponse03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /* 解决中文乱码 */
            resp.setContentType("text/html;charset=UTF-8");
    
            PrintWriter writer = resp.getWriter();
            writer.write("若风");
            writer.write("

    aaa

    "
    ); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20220911162434029

    5 Response响应字节数据

    5.1 使用

    1. 通过Response对象,获取字节输出流

      ServletOutputStream outputStream = resp.getOutputStream();
      
      • 1
    2. 写数据

      outputStream.write(字节数据);
      
      • 1

    5.2 例子

    5.2.1 准备图片

    首先找到一张石原里美的图片放到一个地方

    5.2.2 代码

    package com.you.web.response;
    
    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.FileInputStream;
    import java.io.IOException;
    
    @WebServlet("/webResponse04")
    public class webResponse04 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /* 1、读取文件 */
            FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg");
            /* 2、获取字节输出流 */
            ServletOutputStream os = resp.getOutputStream();
            /* 3、完成流的Copy */
            byte[] buff = new byte[1024];
            int len = 0;
            while((len = fis.read(buff))!=-1)
            {
                os.write(buff);
            }
            fis.close();
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    5.2.3 效果

    可以看到美美的石原里美了!

    image-20220911165005977

    5.2.4 IOUtils 的使用

    IOUtils包含一些工具类,用于处理读,写和拷贝。这些方法基于InputStream, OutputStream, Reader 和 Writer工作。

    此处用到了IOUtils 流的Copy

    5.2.4.1 导入依赖
     <dependency>
          <groupId>commons-io</groupId>
          <artifactId>commons-io</artifactId>
          <version>2.11.0</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    5.2.4.2 使用IOUtils 代替手写的Copy

    image-20220911165834308

    @WebServlet("/webResponse04")
    public class webResponse04 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /* 1、读取文件 */
            FileInputStream fis = new FileInputStream("D:\\Project\\Pro\\JavaWeb-Demo-05\\src\\main\\resources\\static\\1.jpg");
            /* 2、获取字节输出流 */
            ServletOutputStream os = resp.getOutputStream();
            /* 3、完成流的Copy */
            IOUtils.copy(fis,os);
            
            fis.close();
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doGet(req,resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    5.2.4.3 效果图

    美美的石原里美还在!

    image-20220911170034122

  • 相关阅读:
    IronPDF v2023.5.8 For .NET Crack
    Bootstrap-jqgrid学习(十六)
    JS中0 == ‘‘ ture还是false
    安装、配置 Java JDK 和 JRE,并卸载自带 OpenJDK
    JDBC在IDEA中配置mysql过程及编程详解
    进程与线程的关系,进程调度的基本过程
    示例之全选和反选以及取消
    leetcode-18. 四数之和-20220822
    Pytorch R-CNN目标检测-汽车car
    1.7.C++项目:仿muduo库实现并发服务器之Poller模块的设计
  • 原文地址:https://blog.csdn.net/m0_59792745/article/details/126807029