Response
文章目录
2.1 Response的概述
2.1.1 Response的概念
在Servlet API中,定义了一个HttpServletResponse接口(doGet,doPost方法的参数),它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为响应行、响应头、响应体三部分,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应头、响应体的方法
用我们自己的话说: Response就是服务器端一个对象,它里面可以封装要响应给客户端的响应行、头、体的信息
2.1.2 Response的组成部分
- 响应行: 包含响应状态码、状态码描述信息、HTTP协议的版本
- 响应头: 一个个的键值对,每一个键值对都包含了具有各自含义的发送给客户端的信息
- 响应体: 用于展示在客户端的文本、图片,或者供客户端下载或播放的内容
2.1.3 Response的作用
- 设置响应行的信息,主要是设置响应状态码
- 设置响应头的信息
- 设置响应体的信息
2.2 使用Response向客户端输出字符串
2.2.1 输出字符串的API
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
//2. 输出内容
writer.write("hello world");
2.2.2 响应数据乱码问题
由于服务器端在输出内容的时候进行编码使用的字符集和客户端进行解码的时候使用的字符集不一致,所以会发生响应数据乱码问题。
我们解决响应数据乱码问题只需要在获取字符输出流之前,执行如下代码就可以了:
response.setContentType("text/html;charset=UTF-8");
2.3 使用response向客户端响应一个文件
2.3.1 使用字节输出流的API
ServletOutputStream os = response.getOutputStream();
2.3.2 案例目标
在ServletDemo01中使用response向浏览器输出一张图片
2.3.3 案例代码
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Leevi
* 日期2021-05-11 11:19
*/
public class ServletDemo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决响应内容的乱码问题
//response.setContentType("text/html;charset=UTF-8");
//System.out.println("hello world");
//response就是服务器端要发送给客户端的响应内容,它里面包含三部分: 响应行、头、体
//1. 设置响应行的内容:
//设置响应的状态码,但是一般情况下我们不需要设置状态码,因为服务器会自动设置状态码
//response.setStatus(404);
//2. 设置响应头信息: setHeader("name","value");
//3. 设置响应体的信息: 响应体就是显示在浏览器的数据
//3.1 通过字符流往浏览器输出文本内容
//response.getWriter().write("<h1>你好世界...</h1>");
//3.2 使用字节流往浏览器输出一张图片
//首先设置响应数据的mime-type
//第一步: 使用字节输入流读取那张图片
//使用ServletContext获取资源的真实路径
String realPath = getServletContext().getRealPath("img/mm.jpg");
InputStream is = new FileInputStream(realPath);
//第二步: 使用字节输出流,将图片输出到浏览器
ServletOutputStream os = response.getOutputStream();
//边读编写
int len = 0;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1){
os.write(buffer,0,len);
}
os.close();
is.close();
}
}
2.4 重定向
2.4.1 什么是重定向
重定向是由项目中的一个资源跳转到另一个资源,在这个过程中客户端会发起新的请求
2.4.2 重定向的入门案例
2.4.2.1 案例目标
从ServletDemo01重定向跳转到ServletDemo02
2.4.2.2 重定向的API
response.sendRedirect("路径");
2.3.2.3 案例代码
ServletDemo01的代码
public class ServletDemo01 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletDemo01执行了...")
//请求转发跳转到ServletDemo02
response.sendRedirect("/app/demo02");
}
}
ServletDemo02的代码
public class ServletDemo02 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("在ServletDemo02执行了.....")
}
}
2.4.3 重定向的特征
- 重定向的跳转是由浏览器发起的,在这个过程中浏览器会发起两次请求
- 重定向跳转可以跳转到任意服务器的资源,但是无法访问WEB-INF中的资源
- 重定向跳转浏览器的地址栏中的地址会变成跳转到的路径
2.5 重定向和请求转发的对比
- 重定向会由浏览器发起新的请求,而请求转发不会发起新的请求
- 重定向可以访问任意互联网资源,而请求转发只能访问本项目资源
- 重定向不能访问本项目的WEB-INF内的资源,而请求转发可以访问本项目的WEB-INF内的资源
- 发起重定向的资源和跳转到的目标资源没在同一次请求中,所以重定向不能在请求域中使用;而发起请求转发的资源和跳转到的目标资源在同一次请求中,所以请求转发可以在请求域中使用