1. 程式人生 > >JSP中out.println()與response.getWriter().println()輸出的區別

JSP中out.println()與response.getWriter().println()輸出的區別

首先說明兩者的主要區別(加*為重點)
*1.兩者的類不同,out的類是JspWriter,response.getWriter()的類是PrintWriter
*2.out是JSP的內建物件,直接就可以呼叫裡面的方法,而PrintWriter呼叫之前需要response.getWriter()獲取物件。
3. JspWriter的print()方法會丟擲IOException,而PrintWriter則不會 。
4. JspWriterPrintWriter都繼承自Java.io.Writer,但前者是抽象類**,而後者卻不是。
**5.最主要的區別:
在同一個jsp或servlet檔案中同時使用到了JspWriter

物件和PrintWriter物件,在呼叫print或println方法後的執行情況不同
演示如下

<%@ page language="java" import="java.io.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    response.setContentType("text/html;charset=utf-8");//設定響應的內容型別以及編碼方式
    out.print("out輸出");
    out.println("<br>");//輸出回車
    response.getWriter
().println("PrintWriter輸出"); %>

結果為
這裡寫圖片描述
顯然out的輸出方式被“插隊”了,這是為什麼呢?

這是因為,out物件是JspWriter類的一個例項,這個類的幕後其實還是PrintWriter類,
只是JspWriter具有快取,只有它的快取重新整理了後才會建立PrintWriter類,
並將JspWriter物件中的內容寫入到PrintWriter類物件中。

自己的理解是這相當於JspWriter只是個代購,在收到錢之後,他不是馬上就把貨給你,而是滿足他的條件後,再去PrintWriter的店取貨然後把貨給你。

只有滿足以下任一條件時,out物件才去呼叫getWriter()方法,通過PrintWriter

物件將out物件緩衝區中的內容寫到Response響應物件中:
1. 設定page指令將“buffer”屬性為“none” 。
2. 寫入到out物件中的內容充滿了out物件的緩衝區。
3. 整個JSP頁面執行完畢。

如果想讓out的輸出直接輸出出來,重新整理out的緩衝區即可,即修改jsp程式碼為:

<%@ page language="java" import="java.io.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    response.setContentType("text/html;charset=utf-8");//設定響應的內容型別以及編碼方式
    out.print("out輸出");
    out.println("<br>");//輸出回車
    out.flush();//輸出緩衝區
    response.getWriter().println("PrintWriter輸出");
%>

現在可以得到out輸出在前面的結果了
這裡寫圖片描述