1 Response
- response:设置响应数据
- 业务处理完后,后台就需要给前端返回业务处理的结果即响应数据
- 把响应数据封装到
response
对象中 - 后台服务器
Tomcat
会解析response
对象,按照响应行+响应头+响应体
格式拼接结果 - 浏览器最终解析结果,把内容展示在浏览器给用户浏览
2 Response继承体系
3 Response设置响应数据
HTTP响应数据总共分为三部分内容,分别是响应行、响应头、响应体
3.1 响应行
方法 | 说明 |
---|---|
void setStatus(int sc) | 设置响应状态码 |
3.2 响应头
方法 | 说明 |
---|---|
void setHeader(String name,String value) | 设置响应头键值对 |
3.3 响应体
对于响应体,是通过字符、字节输出流的方式往浏览器写
方法 | 说明 |
---|---|
PrintWriter getWriter() | 获取字符输出流 |
ServletOutputStream getOutputStream() | 获取字节输出流 |
4 Response完成重定向
Response
重定向(redirect):一种资源跳转方式
实现方式:
resp.setStatus(302);
resp.setHeader("location","资源B的访问路径");
简化方式:
resposne.sendRedirect("/request-demo/resp2")
特点:
- 浏览器地址栏路径发送变化:当进行重定向访问的时候,由于是由浏览器发送的两次请求,所以地址会发生变化
- 可以重定向到任何位置的资源(服务内容、外部均可),因为第一次响应结果中包含了浏览器下次要跳转的路径,所以这个路径是可以任意位置资源。
- 两次请求,不能在多个资源使用
request
共享数据,因为浏览器发送了两次请求,是两个不同的request
对象,就无法通过request
对象进行共享数据
4.1 路径问题
转发的时候路径上没有加/request-demo而重定向加了,那么到底什么时候需要加,什么时候不需要加呢?
规则:
- 浏览器使用:需要加虚拟目录(项目访问路径)
- 服务端使用:不需要加虚拟目录
可以在代码中动态去获取项目访问的虚拟目录,借助前面的request
对象中的getContextPath()
方法
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp1....");
//简化方式完成重定向
//动态获取虚拟目录
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
此时就可以动态获取项目访问的虚拟路径,从而降低代码的耦合度
5 Response响应字符数据
5.1 返回一个简单的英文字符串
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1. 获取字符输出流
PrintWriter writer = response.getWriter();
writer.write("aaa");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
5.2 返回一串html字符串,并且能被浏览器解析
PrintWriter writer = response.getWriter();
//content-type,告诉浏览器返回的数据类型是HTML类型数据,这样浏览器才会解析HTML标签
response.setHeader("content-type","text/html");
writer.write("<h1>aaa</h1>");
5.3 返回一个中文的字符串
需要注意设置响应数据的编码为utf-8
//设置响应的数据格式及数据的编码
response.setContentType("text/html;charset=utf-8");
writer.write("你好");
注意:一次请求响应结束后,response对象就会被销毁掉,所以不要手动关闭流
6 Response响应字节数据
对于流的copy的代码还是比较复杂的,所以我们可以使用别人提供好的方法来简化代码的开发,具体的步骤是:
- Step1:
pom.xml
添加依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
- Step2:调用工具类方法
fis:输入流
os:输出流
IOUtils.copy(fis,os)
/**
* 响应字节数据:设置字节数据的响应体
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取文件
FileInputStream fis = new FileInputStream("d://a.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
IOUtils.copy(fis,os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}