1. 程式人生 > >jsp頁面out.print()和後臺response.getWriter().print()的區別

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程式碼如下:
在這裡插入圖片描述

執行結果如圖:
在這裡插入圖片描述
網頁原始碼如圖:
在這裡插入圖片描述