相关文章
更多最近更新
更多getOutputStream() has already been called for this response 问题
2019-03-25 13:46|来源: 网路
做一个jsp下载excel的功能,功能描述如下:首先将excel下载到服务器,然后从服务器下载到本地。
最开始是一个页面,点击下载,用ajax跳转到后台,将文件下载到服务器,然后跳回jsp,执行如下js:
if(xmlHttpRequest.status==200){//服务器状态码
var loadDir = "/webrpt/loadFile.jsp?flag=1&dir=BBSJ_DOWNLOAD.zip" ;
window.location.href (loadDir) ;
}
此时跳转到下载jsp页面,自动弹出下载窗口,下载jsp loadFile.JSP代码如下:
加断点显示,当弹出下载窗口的时候还没报错,再执行之后的outputstream出错,错误信息如下:
严重: Servlet.service() for servlet debugjsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:596)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:186)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.loadFile_jsp._jspService(org.apache.jsp.loadFile_jsp:84)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
整了一天了,一直没有解决。。。。
问题补充:
可是out在上面还没有定义,该如何定义呢。
问题补充:
可out在上面还没有进行定义,该如何定义呢。
问题补充:
out是jsp内置的对象,不用定义的
不好意思,还是不大明白你的意思,我像你那样说的,将response.getOutputStream()直接改成out,是会出错的。
还需要其他的修改吗?
问题补充:
谢谢您的建议,问题已解决,找了个servlet下载的,把原来的稍加修改就可以了,3q。
最开始是一个页面,点击下载,用ajax跳转到后台,将文件下载到服务器,然后跳回jsp,执行如下js:
if(xmlHttpRequest.status==200){//服务器状态码
var loadDir = "/webrpt/loadFile.jsp?flag=1&dir=BBSJ_DOWNLOAD.zip" ;
window.location.href (loadDir) ;
}
此时跳转到下载jsp页面,自动弹出下载窗口,下载jsp loadFile.JSP代码如下:
<%@ page contentType="text/html;charset=GBK" %> <%@ page import="java.io.*" %> <HTML> <meta http-equiv="Content-Type" content="text/html; charset=gbk"> <BODY> <% java.io.BufferedInputStream bis=null; java.io.BufferedOutputStream bos=null; try{ String filename=request.getParameter("dir"); response.reset(); File fileLoad=new File("D://",request.getParameter("dir")); filename=new String(filename.getBytes("iso8859-1"),"gbk"); response.setContentType("application/x-download"); response.setHeader("Content-disposition","attachment; filename="+new String(filename.getBytes("gbk"),"iso8859-1")); bis=new java.io.BufferedInputStream(new java.io.FileInputStream(fileLoad)); bos=new java.io.BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while(-1 != (bytesRead = bis.read(buff, 0, buff.length))){ bos.write(buff,0,bytesRead); } bos.flush(); }catch(Exception e){ e.printStackTrace(); }finally{ if(bis != null)bis.close(); if(bos != null)bos.close(); }%> </BODY> </HTML>
加断点显示,当弹出下载窗口的时候还没报错,再执行之后的outputstream出错,错误信息如下:
严重: Servlet.service() for servlet debugjsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:596)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:186)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:117)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:191)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:115)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:75)
at org.apache.jsp.loadFile_jsp._jspService(org.apache.jsp.loadFile_jsp:84)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:322)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:291)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:241)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)
整了一天了,一直没有解决。。。。
问题补充:
xiaolongfeixiang 写道
第17行
改为:
bos=new java.io.BufferedOutputStream(response.getOutputStream());
改为:
bos=new java.io.BufferedOutputStream(out);
可是out在上面还没有定义,该如何定义呢。
问题补充:
xiaolongfeixiang 写道
第17行
改为:
bos=new java.io.BufferedOutputStream(response.getOutputStream());
改为:
bos=new java.io.BufferedOutputStream(out);
可out在上面还没有进行定义,该如何定义呢。
问题补充:
xiaolongfeixiang 写道
引用
可是out在上面还没有定义,该如何定义呢。
out是jsp内置的对象,不用定义的
不好意思,还是不大明白你的意思,我像你那样说的,将response.getOutputStream()直接改成out,是会出错的。
还需要其他的修改吗?
问题补充:
xiaolongfeixiang 写道
out是jsp内置的对象
你在jsp中调用 response.getOutputStream() 会报错如下:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
建议你用Servlet完成此功能
你在jsp中调用 response.getOutputStream() 会报错如下:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
建议你用Servlet完成此功能
谢谢您的建议,问题已解决,找了个servlet下载的,把原来的稍加修改就可以了,3q。
相关问答
更多-
使用struts2 进行文件下载是,总报错: java.lang.IllegalStateException: getOutputStream() has already been called for this respons 解决办法: 把对应的action的返回设置为空,即可轻松解决。 例如: public class DownloadFileAction extends ActionSupport implements ServletRequestAware, ServletResponseAwar ...
-
一种方法是编写一个拦截servlet请求的ServletFilter ,使用一个Decorator来包装HttpServletResponse,它的response.getOutputStream()会告诉你该方法已被调用,并将调用委托给包装的HttpServletResponse以返回实际的输出流。 One way is to write a ServletFilter that intercepts the servlet requests, uses a Decorator to wrap the H ...
-
好的,你应该使用一个servlet而不是JSP,但如果你真的需要...添加这个指令在你的页面顶部: <%@ page trimDirectiveWhitespaces="true" %> 或者在jsp-config部分你的web.xml
*.jsp true Spring:已经为此响应调用了getOutputStream()(Spring: getOutputStream() has already been called for this response)[2022-07-20]
如果返回'test',则在使用响应outputStream返回二进制文件后,指示控制器将您发送到某个视图。 以下是如何管理这个的想法: 从弹簧控制器下载文件 If you return 'test', you are instructing your controller to send you to some view... after using the response outputStream to return a binary file. Here is an idea of how you s ...所以你做错了。 只要没有调用getWriter() ,就可以多次调用getOutputStream() 。 您应该通过将输出流管理为单例来注入一次字符串: ServletOutputStream outputStream; // an instance member of your Wrapper @Override public synchronized ServletOutputStream getOutputStream() throws IOException { if (outputS ...也许问题出在JQuery方面? 您可以通过在浏览器中手动打开retrieveTicketsToExcel.htm下载工作吗? 如果是这样,那么尝试使用window.location.href="retrieveTicketsToExcel.htm"而不是JQuery的ajax(); 编辑:我现在很确定问题出在查询方面。 首先,ajax请求不能启动文件下载对话框。 window.location.href或提交表单是你的选择。 另外,您在ajax调用中将json作为dataType提供。 这是错误的,因为da ...已经为此响应调用了“getOutputStream()”(“getOutputStream()” has already been called for this response)[2023-09-05]
首先编写一个自己的响应,然后返回视图的名称,从而告诉Spring它应该使用generate.jsp生成一个HTML页面。 使您的方法返回void而不是String。 HTTP响应只能有一个正文:要么是文件附件,要么是HTML页面,而不是两者。 You start by writing a response by yourself, and then return the name of the view, and thus telling Spring that it should generate an ...实际上我在Windows上面临同样的问题,它解决了从Prgramfile文件夹中删除我的glassfishe并从http://download.oracle.com/glassfish/4.0/promoted/glassfish-4.0-b87.zip下载新版本并解压缩你想要的但不是在programfile中,因为它需要管理员滚动,然后创建新的服务器。 Actually I faced the same problem on windows, and it resolved be delete my gl ...异常消息很明确: 无法显示异常页面 :已为此响应调用了getOutputStream() 已经为此响应调用了java.lang.IllegalStateException:getOutputStream() 在org.apache.catalina.connector.Response。 getWriter (Response.java:610) 抛出了IOException并且您将其重新抛出为自定义异常,这迫使servletcontainer显示将使用getWriter()的异常页面。 事实上你应该让任何 ...在try / catch的末尾添加以下内容,以避免JSP引擎通过getWriter()刷新响应时出现的错误 out.clear(); // where out is a JspWriter out = pageContext.pushBody(); 这不是最佳做法,但它可以避免日志中的错误。 理想情况下,我们应该在Servlet中而不是在JSP中执行此操作。 如果你仍然需要它在JSP中,请按照上面的代码来摆脱错误。 Add the following inside the end of the try/c ...