無論是RequetDispatcher.forward還是HttpServletResponse.sendRedirrect()在調用它們之前都不能有內容已經被實際輸出到用戶端!!如果緩衝區中已有一些內容,這些內容將被清除!!
JspFractory
_jspxFactory.releasePageContext(_jspx_page_context)
有多個PrintWriter或者JspWriter對象時 先把內容輸出到緩衝區!到jsp頁面結束時才把內容輸出!!
在jsp頁面中調用pageContext.forward()進行頁面轉向!Servlet
如果轉向html靜態檔案!因為這是市轉向default servlet 沒有PrintWriter對象產生 所以在default
serlet會調用getServletOutputStream!然後返回jsp頁面!繼續完成剩下的頁面!!這時又向緩衝區列印!這時就報錯 !1
如果要想不報錯!只能在jsp頁面調用response.getWriter顯式的產生PrinterWriter對象!!這樣在default servlet 中才會使用這個printWriter對象!輸出頁面內容!!
<%
response.getWriter();
pageContext.forward("test.html");
%>
html常常出現快取頁面面的情況!如果你這次訪問成功!下次訪問的頁面應該失敗!但還是正確的頁面!這是因為緩衝的結果!!
如果轉向Servlet 但 Servlet中開啟了OutputStream流!則會報錯!!與jsp頁面的out衝突!!
<%
pageContext.forward("servlet/testForward");
%>
testForward Servlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
ServletOutputStream sos=response.getOutputStream();
}
再看
<body>
1
<%
PrintWriter pw= response.getWriter();
pw.print("3");
%>
2
</body>
列印出 312
編譯的Servlet代碼為JspWriter out = null;
JspWriter 和 PrintWriter關係!!
JspWriter繼承了java.io.Writer
同樣 PrintWriter也是其子類!!也就是在jsp頁面輸出時 只要是Writer子類!則把內容輸出到一個緩衝區內!!