这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置缓存时间为1小时:时间单位为毫秒
response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600);
String data = "abcdefghigk";
//response.getWriter().print(data);
response.getOutputStream().write(data.getBytes());
//jsp中是也PrintWriter对象输出内容的
request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常
}
如果访问该Servlet,则会抛出:java.lang.IllegalStateException: getOutputStream() has already been called for this response 异常
解决办法:将request.getRequestDispatcher("index.jsp").forward(request, response);//改为response.sendRedirect("index.jsp");则不会抛该异常
原因分析:改为重定向后,则 是两个response对象
4.其他问题:
(1)getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
(2)getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
(3)Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
(4)Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象