← 返回首页
Servlet基础教程(十五)
发表时间:2020-04-08 00:24:25
讲解Servlet的response对象

1.什么是response

response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。

response对象的功能分为以下四种: - 设置响应头信息 - 发送状态码 - 设置响应正文 - 重定向

2.response常用方法

通过一个实例,来了解response常用API。

package com.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

@WebServlet(name = "TestServlet", value = "/test", loadOnStartup = 1)
public class TestServlet extends HttpServlet {
    public TestServlet() {
        System.out.println("执行TestServlet的构造方法...");
    }

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

        String data = "测试TestServlet-使用字节流";
        String data2 = "测试TestServlet-使用字符流";

        //设置响应头
        response.setHeader("content-type", "text/html;charset=UTF-8");//通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码

        //一秒刷新页面一次
        //response.setHeader("refresh","1");
        //5秒后自动跳转到百度主页。
        //response.setHeader("Refresh","5; URL=http://www.baidu.com");
        //设置不使用缓存
        //response.setHeader("Pragma", "No-cache");
        //response.setHeader("Cache-Control", "no-cache");

        //设置contentType
        //注意:这句话必须在getOutputStream或者getWriter之前执行,否则会有中文乱码。
        response.setContentType("text/html;charset=utf-8");
        //设置字符响应流的字符编码为utf-8;
        //response.setCharacterEncoding("utf-8");
        //设置状态码
        //response.setStatus(200);
        /*
         * 注意:getOutputStream和getWriter这两个方法互相排斥,不能同时使用!
         ** */
        //获取字符输出流
        //PrintWriter outer = response.getWriter();
        //获取字节输出流
        OutputStream outputStream = response.getOutputStream();
        //字节流的方式输出内容
        outputStream.write(data.getBytes("utf-8"));
        //字符流的方式输出内容。
        //outer.write("<h1>"+data2+"</h1>");
        //outer.flush();
        //outer.close();
        outputStream.close();
    }

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

使用以上方法需要注意以下事项: 1)response.getWriter()是PrintWriter类型,所以它有缓冲区,缓冲区的默认大小为8KB。也就是说,在响应数据没有输出8KB之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。当Servlet执行结束后,服务器才会去刷新流,使缓冲区中的数据发送到客户端。所以最好在输出内容后,立刻调用flush()。

2)getWriter 和 getOutputStream() 的使用互斥,是有设计原因的,getWriter() 得到的 PrintWriter 和 getOutputStream() 得到的 ServletOutputStream 都维护了自己的 buffer, 如果要同时输出,其输出结果势必要以某种方式合并,这就增加了实现的复杂性,那么设计者就想,还是限制 getWriter() 和 getOutputStream() 的同时使用更省事儿,要么输出字节流,要么输出字符流。

3)通过setHeader来设置Content-Type或者Content-Length头部,内部是调用setsetContentType/setContentLength来实现的。所以两者功能上没有区别。但是推荐使用setsetContentType/setContentLength因为少了多余的判断,性能更高,函数名也更明义。

4)setContentType("text/html;charset=utf-8");这句话一定要在获得字符流之前执行,否则输出中文字符会出现中文乱码。

3.常见响应状态码