response响应

在service()中可以使用request来获取请求数据,还可以使用response向客户端响应,response有响应流。request和response是一次性的,即每次请求都要创建新的。
这里写图片描述
response是类型是javax.servlet.http.HttpServlet.Response
response对象和功能:

  • 设置响应头信息;
  • 发送状态码;
  • 设置响应正文;
  • 重定向;

响应正文

response有两个响应流,一个是字符流,一个是字节流

  • PrintWriter out = response.getWriter();//获取字符流
  • ServletOutputStream out = response.getOutputStream();//获取字节流
    注意:在一个请求中不能同时使用response.getWriter()和response.getOutputStream()这两个流,不然会抛出非法的状态异常。

使用字符流有两个问题:
1、编码
在调用getWrite()方法之前使用setCharacterEncoding()来设置字符流编码,如果不设置默认是iso-8859-1。

//response.setCharacterEncoding("utf-8");//设置字符流的编码为utf-8,设置之后用字符流发送的字符串都是utf-8的。
response.setContentType("text/html;charset=utf-8");//设置字符流编码,而且还会添加content-Type响应头,这个头通知浏览器用utf-8解码。
response.getWriter("中国");

浏览器一般默认使用gbk来解码。
2、缓冲区:默认是8kb,就是说,在响应数据没输出8kb之前,数据都是存放在缓冲区中,而不会立刻发送到客户端,当servlet执行结束后,服务器才会去刷新流,使缓冲区的数据发送到客户端。
缓冲区刷新:

  • response.getWriter.flush();
  • response.flushBuffer();
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        for(int i=0; i < 1024; i++) {
            response.getWriter().print("A");
        }
        ///System.out.println(response.isCommitted());//检测是否发送
        /*刷新缓冲区,这下面两句话的效果相同
         * 
         */
        //response.getWriter().flush();//
        //response.flushBuffer();
        try {
            Thread.sleep(5000);//休眠5秒钟
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

设置response响应头

  • 下面操作会出现两个头:
    response.addHeader("a","A");
    response.addHeader("a","AA");

    a:A
    a:AA
  • 下面操作只能出现一个头:
    response.addHeader("Content-type","text/html;charset=utf-8");
    response.addHeader("Content-type","text/html;charset=gbk");最后是gbk。
  • 下面操作形成一个头覆盖:
    response.setHeader("a","A");
    response.setHeader("a","AA");

response.setHeader("Refresh","5;URL=www.baidu.com");5秒后自动跳转到百度主页

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setHeader("Refresh","5;URL=/day05_1/index.jsp");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("一会儿会自动跳转到主页");

    }

设置状态码

response.setStatus(int code);
response.sendError(int code , String msg);

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   
        //response.setStatus(200);设置状态码
        response.sendError(500,"您访问的资源找到了");//设置错误提示

    }

重定向

这里写图片描述

手动重定向

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
         * 重定向:
         * 1、状态码为302
         * 2、响应头Location
         */
        response.setStatus(302);
        response.setHeader("Location", "/day05_2/index.jsp");
    }

这里写图片描述

自动重定向

response.sendRedirect(“重定向的URL”);

/**
 * 自动重定向
 * 
 * @author green
 *所谓自动,其实就是response提供的简便方法,可以完成设置状态码和Location头。
 */
@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*下面sendRedirect()两个功能:
         * 1、设置状态码为302
         * 2、设置响应头Location
         */
        response.sendRedirect("/day05_2/index.jsp");
    }
}

注意:

  • 重定向一定有两个请求。
  • 重定向第一个请求无论是GET或者POST,第二个请求一定是GET。
  • 重定向可以定向到其他应用中,不局限于当前应用。
  • 重定向就不要去响应,重定向就不要再使用response.getWriter()或response.getOutputStram()输出数据,不然会出现异常。
    response.getWriter().print("哈哈哈");
    response.sendRedirect("/day05_2/index.jsp");

    这会在重定向时抛出异常。

猜你喜欢

转载自blog.csdn.net/green703338130/article/details/79503360