response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作。
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");这句话一定要在获得字符流之前执行,否则输出中文字符会出现中文乱码。
