getOutputStream和getWriter互斥問題:
這兩個方法互相排斥,呼叫了其中的任何一個方法後,就不能再呼叫另一方法。
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方法關閉該輸出流物件