getOutputStream和getWriter在servlet中的區別


response輸出數據時的細節:

(1)getOutputStream和getWriter這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一方法。 

(2)Servlet程序向ServletOutputStream或PrintWriter對象中寫入的數據將被Servlet引擎從response里面獲取,Servlet引擎將這些數據當作響應消息的正文,然后再與響應狀態行和各響應頭組合后輸出到客戶端。

(3)Serlvet的service方法結束后,Servlet引擎將檢查getWriter或getOutputStream方法返回的輸出流對象是否已經調用過close方法,如果沒有,Servlet引擎tomcat將調用close方法關閉該輸出流對象。

 另外參考這篇文檔:response細節,重定向的用處和getWriter/getOutputStream的用法沖突的處理http://blog.csdn.net/xh16319/article/details/8449255

1.重定向的實現:

 

[java]  view plain  copy
 
  1. //和下句代碼可互換位置,此兩行相當於response.sendRedirect("");  
  2.     response.setStatus(302);  
  3.     //或者"location.jsp"  
  4.     response.setHeader("location","/HTTPHeader/location.jsp");  

2.重定向的用處:

 

   一般情況下盡量不要用重定向,因為其會向服務器發送兩次請求,增加服務器的負荷,並且會產生兩個request和response對,除了特殊的場合:如:

    (1)用戶登錄成功后跳轉至首頁,如果用轉發的話,那么用戶無法從地址欄上看到首頁地址

    (2)購物時,點擊"加入購物車"按鈕,然后就轉向“顯示購物車商品的頁面showCar.jsp”,如果使用轉發技術的,那么在“showCar.jsp”頁面上如果刷新頁面的話,則就會將“加入購物車的事件在作一次”。

    (3)在表單提交后(get和post方式都是一樣),如果想跳轉至某頁面,如果用轉發的話,則轉至頁面后,如果刷新頁面,則會造成表單重復提交:

如:當提交以post方式的表單后,如果刷新頁面:

當點擊重試后:

提交表單后,如果改為重定向到該頁面,則刷新頁面也只是刷新該頁面,而不會造成表單重復提交

3. getOutputStream和getWriter互斥問題:

     這兩個方法互相排斥,調用了其中的任何一個方法后,就不能再調用另一方法。

    如:ExpiresServlet:

 

[java]  view plain  copy
 
  1. public void doGet(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.        //設置緩存時間為1小時:時間單位為毫秒  
  4.      response.setDateHeader("Expires", System.currentTimeMillis()+1000*3600);  
  5.      String data = "abcdefghigk";  
  6.      //response.getWriter().print(data);  
  7.      response.getOutputStream().write(data.getBytes());  
  8.      //jsp中是也PrintWriter對象輸出內容的  
  9.      request.getRequestDispatcher("index.jsp").forward(request, response);//改為response.sendRedirect("index.jsp");則不會拋該異常  
  10. }  

如果訪問該Servlet,則會拋出:java.lang.IllegalStateException: getOutputStream() has already been called for this response 異常


 

這說明同一個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方法關閉該輸出流對象

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM