服务器处理请求的流程:
服务器每次收到请求,都会为这个请求开辟一个新的线程
服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体
服务器还会创建response对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应
1.response状态码、响应头
状态码:200表示成功、302表示重定向、404表示客户端错误、500表示服务器端错误
sendError(int v)发送错误状态码,例如404、500
sendError(int v,String msg) 例如resp.sendError(404,”就不给你看”)
setStatus(int v)发送成功的状态码,可以用来发送302
响应头:Content-Type、Refresh、Location等等
setHeader(String name,String value)适用于单值的响应头
resp.setHeader(“aaa”,”ASDF”);
addHeader(String name,String value)适用于多值的响应头
resp.setHeader(“aaa”,”ASDF”);
resp.addHeader(“aaa”, “BJKF”);
setIntHeader(String name,int value)适用于单值的int类型的响应头
resp.setIntHeader(“Content-Length”, 888);
addIntHeader(String name,int value)适用于多值的int类型的响应头
setDateHeader(String name,long value)适用于单值的毫秒类型的响应头
resp.setDateHeader(“expires”,1000*60*60*24);
addDateHeader(String name,long value)适用于多值的毫秒类型的响应头
发送302,设置Location头,完成重定向!
定时刷新,设置Refresh头
禁用浏览器缓存:Cache-Control、pragma、expires
BServlet.java
@WebServlet("/Bservlet")
public class Bservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
response.setHeader("Location", "/jsp/CServlet");
response.setStatus(302);
}
}
CServlet.java
@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
}
发送请求:http://localhost:8080/jsp/Bservlet
结果: 客户端地址栏变成:http://localhost:8080/jsp/CServlet
页面显示:Served at: /jsp
3.response之定时刷新(可以理解成定时重定向)
DServlet.java
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 下面是用来发送响应体!
*/
PrintWriter out=resp.getWriter();
out.print("欢迎登陆成功!,5秒自动跳转到主页。您看到的是一定是乱码。");
/**
* 设置名为Refresh的响应头
*/
resp.setHeader("Refresh","5;URL=/jsp/EServlet");
}
EServlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
response.getWriter().print("还是乱码lll");
}
发送请求:http://localhost:8080/jsp/DServlet
结果: 先显示Servlet处理的响应内容,
5秒钟之后地址栏变成http://localhost:8080/jsp/EServlet
4.response之禁止缓存
Cache-Control pragma expires
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma", "no-cache");
response.setDateHeader("expires",-1);//过期时间,马上过期
标签可以代替响应头
5.response响应体
response虽然有两种流,getOutputStream()和getWriter(),但是不能同时使用
1.PrintWriter,用来向客户端发送字符数据!需要设置编码
PrintWriter out=response.getWriter();
2.ServletOutputStream,用来向客户端发送字节数据。
ServletOutputStream st=response.getOutputStream();
案例:
1.1使用PrintWriter发送字符数据
1.2使用ServletOutputStream发送字节数据(图片)
response.setHeader("Cache-Control", "no-cache");
response.setHeader("pragma", "no-cache");
response.setDateHeader("expires",-1);//过期时间,马上过期
String s="Hello outputStream中文";//字符
byte[] bytes=s.getBytes(); //转成字节
response.getOutputStream().write(bytes);//字节流是万能的
请求内容:http://localhost:8080/jsp/FServlet
结果:Hello outputStream中文
打印出照片
String path="F:/A.png";
FileInputStream in=new FileInputStream(path);
byte[] bytes=IOUtils.toByteArray(in);//读取输入流内容的字节到字节数组中
response.getOutputStream().write(bytes);
发送请求:http://localhost:8080/jsp/GServlet
结果:在页面打印出照片
6.重定向
设置302,设置Location
另外一种方法是sendRedirect(“/项目名/cservlet”);