【JavaWeb】一文搞懂Response

简介: Hey,一篇Response的用心文章,不来看看吗?

在这里插入图片描述

@[Toc]

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

方法名 方法类型 方法作用
getWriter PrintWriter 获取字符输出流
getOutputStream ServletOutputStream 获取字节输出流

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);
    }
}
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);
    }
}

image-20220911113935286

3.2 重定向简化

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

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

如下

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

3.3 重定向的特点

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

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

3.4.1 两种情况

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

    image-20220911154543743

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

3.4.2 动态配置虚拟目录

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

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

将WebResponse01 修改成 如下代码

image-20220911155554621

【效果】

image-20220911155509767

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

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

4 Response响应字符数据

4.1 使用

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

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

    wirter.write("aaa")

​ 这个流是不需要关闭的,随着响应结束,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("<h1>aaa</h1>");
    }

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

效果

image-20220911161450531

4.2 设置格式

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

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

image-20220911161843445

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

效果图:

image-20220911162029779

4.3 解决中文乱码

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

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

void setContentType(String type)

设置编码需要在获取之前

@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("<h1>aaa</h1>");
    }

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

image-20220911162434029

5 Response响应字节数据

5.1 使用

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

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

    outputStream.write(字节数据);

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);
    }
}

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>

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);
    }
}

5.2.4.3 效果图

美美的石原里美还在!

image-20220911170034122

相关文章
|
2月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4月前
|
SQL 前端开发 Java
JavaWeb 学习日记案例详解及 javaweb 完整项目案例实战指南
本文介绍了一个基于Spring Boot的JavaWeb企业员工管理系统完整案例,涵盖部门管理、员工管理、登录、异常处理、事务管理及AOP等核心功能实现,结合CSDN相关技术文章,提供详细技术方案与应用实例,适合JavaWeb开发者学习与参考。
195 0
|
10月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
194 4
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
123 2
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
506 5
|
移动开发 JavaScript 前端开发
Javaweb之Vue路由的详细解析
Vue.js是一款备受欢迎的前端框架,以其简洁的API和组件化开发模式著称。Vue Router作为其官方路由管理器,在构建单页面应用(SPA)时发挥关键作用,通过URL变化管理组件切换,实现无刷新过渡。本文将详细介绍Vue Router的基础概念、主要功能及使用步骤,帮助JavaWeb开发者快速掌握其工作原理及实践应用。
112 1
|
JSON JavaScript 前端开发
Javaweb中Vue指令的详细解析与应用
Vue指令提供了一种高效、声明式的编码方式,使得开发者可以更专注于数据和业务逻辑,而不是DOM操作的细节。通过熟练使用Vue指令,可以极大地提高开发效率和项目的可维护性。
109 3
|
安全 Java Android开发
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
424 2
|
JavaScript 前端开发 UED
Javaweb中Vue指令的详细解析与应用
Vue指令是Vue框架中非常强大的特性之一,它提供了一种简洁、高效的方式来增强HTML元素和组件的功能。通过合理使用这些指令,可以使你的JavaWeb应用更加响应用户的操作,提高交互性和用户体验。而且,通过创建自定义指令,你可以进一步扩展Vue的功能,使其更贴合你的应用需求。
117 1
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
874 37
下一篇
oss云网关配置