一、概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。
二、response的运行流程
我们的请求,首先交给了tomcat的容器的tomcat引擎。tomcat引擎帮我们创建request和response。此时,request封装了请求的信息,而response是空的。request和response交给具体的servlet,response去收集一些信息,存储在response缓冲区(一些集合)。response再返回给tomcat引擎。tomcat引擎拿到response缓冲区的内容,与引擎自己添加的信息组装成一个http响应。
三、http响应的结构
http响应分为:响应行、响应头、响应体三部分。response可以对这三部分进行设置。
对于状态行我们会设置的就是状态码。信息会随着状态码自动改变,所以,就不用我们去设置了。
对于响应头,就是一些键值对。
对于响应体,就是用流输出。getWriter().write("字符串")或者 getOutputStream().writer("字节")。
四、设置http响应行的状态码
package com.ken.line;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StatusServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 手动设置http响应行中的状态码
response.setStatus(302);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
五、通过response设置响应头
addHeader(
String name,
String value)
addIntHeader(
String name, int value)
addDateHeader(
String name, long date)
setHeader(
String name,
String value)
setDateHeader(
String name, long date)
setIntHeader(
String name, int value)
其中,add表示添加,而set表示设置
重定向:状态码302 响应头:location 代表重定向的地址
5.1 addHeader
package com.ken.header;
import java.io.IOException;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HeaderServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Date data = new Date(0);
// 设置响应头
response.addHeader("name", "zhangsan");
response.addIntHeader("age", 23);
response.addDateHeader("birthday", data.getTime());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
5.2 setHeader
为了知道setHeader和addHeader的区别,我们先add两个Header
package com.ken.header;
import java.io.IOException;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HeaderServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Date data = new Date(0);
// 设置响应头
response.addHeader("name", "zhangsan");
response.addIntHeader("age", 23);
response.addDateHeader("birthday", data.getTime());
response.addHeader("name", "lisi");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
addHeader两个name,响应中就有两个name。
再看setHeader
package com.ken.header;
import java.io.IOException;
import java.sql.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HeaderServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Date data = new Date(0);
// 设置响应头
response.addHeader("name", "zhangsan");
response.addIntHeader("age", 23);
response.addDateHeader("birthday", data.getTime());
response.setHeader("name", "lisi");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
setHeader把前面一个name覆盖了。
5.3 重定向
Servlet1
package com.ken.header;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 没有响应 告知客户端重定向到Servlet2
// 1.设置状态码为302
response.setStatus(302);
// 2.设置响应头Location
response.setHeader("Location", "/servlet2");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
Servlet2
package com.ken.header;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().write("hello world...");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
结果:
sendRedirect
package com.ken.header;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 没有响应 告知客户端重定向到Servlet2
// 1.设置状态码为302
// response.setStatus(302);
// 2.设置响应头Location
// response.setHeader("Location", "/servlet2");
// 封装成一个重定向的方法sendRedirect(url)
response.sendRedirect("/servlet2");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
refresh
package com.ken.header;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RefreshServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置定时刷新的头
response.setHeader("refresh", "5;url=https://www.baidu.com/");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
refresh和sendRedirect的功能基本一样。区别仅仅在于,refresh会延时的重定向。