[Response对象] 笔记

发布时间 2023-04-01 09:56:00作者: 李八御

response

用来设置响应数据

img

响应数据结构

  • 响应行 HTTP/1.1 200 OK

  • 响应头 Content-Type: text/html

  • 响应体 <h1>Hello World!</h1>

重定向(Redirect)

一种资源跳转方式

img

// 重定向
// 1. 设置响应状态码
response.setStatus(302);
// 2. 设置响应头
response.setHeader("Location", "/HelloServlet/resp2");

// 简化方式重定向 可替换1.2.两步
response.sendRedirect("/HelloServlet/resp2");

特点对比

重定向 转发
浏览器地址栏路径发生变化 浏览器地址栏路径不发生变化
可以重定向到任意位置的资源(服务器内部、外部均可) 只能转发到当前服务器的内部资源
两次请求,不能在多个资源使用request共享数据 一次请求,可以在转发的资源间使用request共享数据

路径问题

浏览器操作 服务端操作
浏览器和服务器之间如:重定向 服务器内部发生如:转发
需要添加虚拟目录 不需要加虚拟目录
<a href="www.baidu.com"\/> request.getRequestDispatcher("/sendtarget");

但是问题出现了,写死的路径会导致程序耦合性增加

所以要动态获取虚拟目录

String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/resp2");

响应字符数据

// 1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("Use writer!");
// 2. 设置头部信息 这里 content-type 是响应数据的类型
response.setHeader("content-type", "text/html");
writer.write("<a href=\"http:\\\\www.baidu.com\">百度</a>");
// 注:响应输出流不需要手动关闭

中文乱码

默认解码为 ISO-8859-1

在使用流之前设置编码为 utf-8 即可

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

响应字节数据

使用工具类

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
// 响应字节流
// 1. 读取文件
FileInputStream inputStream = new FileInputStream("C:\\pic1.png");

// 2. 获取response字节输出流
ServletOutputStream outputStream = response.getOutputStream();

// 3. 进行流 copy
//        byte[] buffer = new byte[1024];
//        int len = 0;
//        while ((len = inputStream.read(buffer)) != -1) {
//            outputStream.write(buffer, 0, len);
//        }

// 3. 使用 commons-io 对流进行 copy 
IOUtils.copy(inputStream, outputStream);

inputStream.close();