response

服务器处理请求的流程:
服务器每次收到请求,都会为这个请求开辟一个新的线程
服务器会把客户端的请求数据封装到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

2.response之重定向
response_第1张图片

google工具查看运行情况

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

你可能感兴趣的:(response,response)