无论是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子类!则把内容输出到一个缓冲区内!!