日期:2014-05-17  浏览次数:20736 次

请问:jspsmartupload 下载文件出错提示:getOutputStream() has already been called 谢谢。


错误信息:
org.apache.jasper.JasperException: java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:410)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


root cause 

java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:610)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:188)
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
org.apache.jsp.file_005fload_jsp._jspService(file_005fload_jsp.java:94)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)



------解决方案--------------------
在Java脚本范围外(即<% ... %>之外),不要包含HTML代码、空格、回车或换行等字符,有的话将不能正确下载。不信的话,可以在上述源码中%><%之间加入一个换行符,再下载一下,保证出错。因为它影响了返回给浏览器的数据流,导致解析出错。 

------解决方案--------------------
<%

// 新建一个SmartUpload对象
 SmartUpload su = new SmartUpload();
 // 初始化
 su.initialize(pageContext);
 // 设定contentDisposition为null以禁止浏览器自动打开文件,
 //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
 //doc时,浏览器将自动用word打开它。扩展名为pdf时,
 //浏览器将用acrobat打开。
 su.setContentDisposition(null);
 // 下载文件
 String file = request.getParameter("file");
 su.downloadFile(file);


 //解决 java.lang.IllegalStateException
 //getOutputStream() has already been called for this response
 //这个问题
 out.clear();
 out=pageContext.pushBody(); 

 %>

------解决方案--------------------
由于jsp container在处理完成请求后会调用releasePageContet方法释放所用的PageContext object,并且同时调用
getWriter方法,由于getWriter方法与在jsp页面中使用流相关的getOutputStream方法冲突,所以会造成这种异常,解决
办法是:只需要在jsp页面的最后加上两条语句:
out.clear();
out=pageContext.pushBody();即可(其中out,pageContext均为jsp内置对象!)