【JavaWeb】一文搞懂Response

时间:2022-10-20 14:01:50

【JavaWeb】一文搞懂Response

@[Toc]

1 Response继承体系

response和request一样

【JavaWeb】一文搞懂Response

2 Response响应

2.1 响应行

【JavaWeb】一文搞懂Response

方法名

方面类型

方法作用

setStatus(int sc)

void

设置响应状态码

2.2 响应头

【JavaWeb】一文搞懂Response

方法名

方法类型

方法作用

setHeader(String name, String value)

void

设置响应头键值对

2.3 响应体

【JavaWeb】一文搞懂Response

方法名

方法类型

方法作用

getWriter

PrintWriter

获取字符输出流

getOutputStream

ServletOutputStream

获取字节输出流

3 Response 重定向

3.1 什么是重定向

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

【JavaWeb】一文搞懂Response

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

【JavaWeb】一文搞懂Response

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 两种情况

  • 浏览器使用:需要加虚拟目录(项目访问路径)
  • 【JavaWeb】一文搞懂Response

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

3.4.2 动态配置虚拟目录

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

方法名

方法类型

方法作用

getContextPath

String

获取虚拟目录(资源的访问路径)

将WebResponse01 修改成 如下代码

【JavaWeb】一文搞懂Response

【效果】

【JavaWeb】一文搞懂Response

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

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

4 Response响应字符数据

4.1 使用

  1. 通过Response对象获取字符输出流。
PrintWriter writer = resp.getWriter();
  1. 写数据
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);
}
}

效果

【JavaWeb】一文搞懂Response

4.2 设置格式

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

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

【JavaWeb】一文搞懂Response

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

效果图:

【JavaWeb】一文搞懂Response

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

【JavaWeb】一文搞懂Response

5 Response响应字节数据

5.1 使用

  1. 通过Response对象,获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
  1. 写数据
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 效果

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

【JavaWeb】一文搞懂Response

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

【JavaWeb】一文搞懂Response

@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 效果图

美美的石原里美还在!

【JavaWeb】一文搞懂Response