2012-11-02 60 views
14

對於所有你「重複」的狂熱分子,在SO右here上有類似的問題。不同的是,我畫了一個生動的例子,我無法理解輸出。Java EE中JspWriter和PrintWriter的區別?

JspWriterPrintWriter文檔說有兩點不同:的JspWriter可以拋出異常,PrintWriter的不應該這樣做。 2. JspWriter在場景後面使用PrintWriter,但是由於默認情況下JSP頁面被緩衝,所以直到the buffer is flushed纔會創建PrintWriter - 無論在JSP頁面的上下文中是什麼意思。我不確定我是否理解了這最後一部分。考慮這個JSP頁面:

<%@page import="java.io.PrintWriter"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JspWriter versus PrintWriter</title> 
    </head> 
    <body> 
     <p>I should be row one.</p> 
     <% 
      out.println("<p>JspWriter said: I should be the second row.</p>"); 

      PrintWriter pw = response.getWriter(); 
      pw.println("<p>PrintWriter said: I should be the third row.</p>"); 
     %> 
     <p>I should be the fourth row.</p> 
    </body> 
</html> 

它產生以下輸出:

PrintWriter said: I should be the third row. 
I should be row one. 
JspWriter said: I should be the second row. 
I should be the fourth row. 

正如你可以看到,他的JspWriter輸出字符串到瀏覽器是我預期。但PrintWriter在將所有其他內容發送到瀏覽器之前輸出其字符串。如果我們檢查發送給瀏覽器的源代碼,則在DOCTYPE聲明之前,PrintWriter的字符串將作爲第一行發送。所以在上面的例子中,究竟發生了什麼?

回答

13

的解釋是你自己的問題:

的JspWriter使用幕後一個PrintWriter,但由於默認情況下 JSP頁面緩衝時,PrintWriter的將不會被創建,直到 緩衝區刷新

這意味着什麼寫入的JspWriter緩衝,一旦該緩衝區被刷新(或因爲緩衝區已滿,或因爲JSP已達到其執行結束),內容被寫入響應的PrintWriter。

所以您的示例的流程如下之一:

  • 靜態的HTML代碼,直到小腳本:寫入到內存緩衝區
  • 通過out.println(......):寫入內存緩衝器
  • pw.println(...):寫入響應
  • 靜態HTML代碼,直到JSP的末尾:寫入到內存中的緩衝
  • 平齊內存中的緩衝的:它包含的所有內容都寫入了resp onse
+0

呃你走了!謝謝你的隊友,非常感謝。 –

1

JSP應該使用由「out」隱式對象表示的JspWriter將輸出發送回客戶端。 JspWriter是PrintWriter的緩衝版本。有關詳細信息,請參閱JspWriter API。 JspWriter也不同於PrintWriter,通過拋出java.io.IOException(PrintWriter不會)。