jsp頁面out.print()和後臺response.getWriter().print()的區別
【1】二者常見區別
① 這兩個物件的型別是完全不同的:內建物件out的型別是JspWriter;response.getWrite()返回的型別是PrintWriter。
② 獲取方式不同:JspWriter是JSP的內建物件,直接使用即可,物件名out是保留字,也只能通過out來呼叫其相關方法。此外還可以通過內建物件pageContext.getOut();獲得。PrintWriter則是在用的時候需要通過內建物件response.getWriter()獲得。
③ JspWriter的print()方法會丟擲IOException而PrintWriter則不會。
④ JspWriter和PrintWriter都繼承自Java.io.Writer,但JspWriter是抽象類,而PrintWriter不是抽象類。
JspWriter類繼承示意圖如下:
public abstract class JspWriter extends Writer { public static final int NO_BUFFER = 0; public static final int DEFAULT_BUFFER = -1; public static final int UNBOUNDED_BUFFER = -2; protected int bufferSize; protected boolean autoFlush; protected JspWriter(int bufferSize, boolean autoFlush) { this.bufferSize = bufferSize; this.autoFlush = autoFlush; } //... }
PrintWriter繼承示意圖如下:
【2】二者執行情況
最最主要的區別是:如果在同一jsp或Servlet檔案中同時使用了JspWriter物件和PrintWriter物件,在呼叫print或者println方法後的執行情況不同!
有如下的jsp檔案:
執行結果如圖:
網頁原始碼如圖:
通過兩張圖可以看出:PrintWriter物件的輸出已經脫離了程式碼,而JspWriter對 象的輸出仍然是在內輸出 。
解釋如下:
JspWriter相當於一個帶緩衝功能的PrintWriter,它對PrintWriter有依賴。初始化一個JspWriter物件的時候要關聯ServletResponse物件的一個PrintWriter物件,最終JspWriter物件的輸出任務還是通過與之關聯的PrintWriter物件完成的。
白話一點:火車票的兩種售票途徑,JspWriter物件和PrintWriter物件都可以輸出response緩衝區的資料,只是JspWriter物件是個代售點,最終還是得依賴PrintWriter物件。
JspWriter物件不是直接將資料輸出到頁面,而是將資料先重新整理到response的緩衝區,然後等待out內建物件滿足一定的條件後才會呼叫PrintWriter物件的print系列方法把out內建物件的緩衝區中的內容輸出到瀏覽器。
out內建物件呼叫PrintWriter物件的print系列方法輸出緩衝區中內容的條件:
- 設定page指令的buffer屬性關閉了out物件的快取功能。
- 寫入到out物件中的內容充滿了out物件的緩衝區。
- 整個JSP頁面結束。
如果想讓PrintWriter物件的輸出回到內,只需讓內建物件out重新整理緩衝區即可(這樣即會立即重新整理緩衝區),即修改jsp程式碼如下:
執行結果如圖:
網頁原始碼如圖: