2016-02-26 95 views
0

我收到我的AttachedFiles.jsp页以下错误:我应该在每次写入ServletOutputStream时都刷新它?

SEVERE: Servlet.service() for servlet [jsp] in context with path [/da8] threw exception [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause 
java.lang.IllegalStateException: getOutputStream() has already been called for this response 
    at org.apache.catalina.connector.Response.getWriter(Response.java:678) 
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213) 
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125) 
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118) 
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:194) 
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:126) 
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80) 
    at org.apache.jsp.jsp.AttachedFiles_jsp._jspService(AttachedFiles_jsp.java:786) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395) 

我以前的版本有:

fileIn.close(); 
outStream.flush(); 
outStream.close(); 

while循环之后的权利,但我认为这是一个很好的做法,将关闭所有对象都在finally块中。 我也读了关闭()也刷新OutputStream。

后,我做了这个变化我得到上述错误:/

AttachedFiles.jsp

FileInputStream fileIn = null; 
    ServletOutputStream outStream = null; 
    try 
    { 
     File fileToDownload = new File(file); 

     response.setContentType("APPLICATION/OCTET-STREAM"); 
     String fileName = request.getParameter("fileName"); 
     if(fileName == null) fileName = ""; 

     String disHeader = "Attachment; Filename=\""+fileName+"\""; 
     response.setHeader("Content-Disposition", disHeader); 
     fileIn = new FileInputStream(fileToDownload); 
     outStream = response.getOutputStream(); 

     byte[] outputByte = new byte[(int) fileToDownload.length()]; 

     //copy binary contect to output stream 
     while(fileIn.read(outputByte) != -1) 
     { 
      outStream.write(outputByte); 
     } 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    finally 
    { 
     try 
     { 
      outStream.close(); 
      if (fileIn != null) 
       fileIn.close(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

有谁知道为什么我收到此错误?

如果是的话,我应该在写入outputStream后立即刷新while循环吗?

+0

我会争辩说,因为你没有打开流,这是不是你的关闭。这可能更真实,因为你已经将所有这些内容嵌入到JSP中 - 这本身就是一个有问题的实践。根本不需要刷新 - 一旦控制权离开JSP,写入器/流将被刷新。我唯一使用flush的是在处理过程中进行部分更新。 – stdunbar

+1

切勿在循环内部冲洗。您的复制循环会忽略'read(),'应该作为write()'的第三个参数提供的值以及零偏移量参数返回的值。 – EJP

回答

0

JSP编译成Servlet。它已经准备好它在产生的Servlet的隐含对象:

  • 要求
  • 响应
  • 出来(为PrintWriter)
  • 会议
  • 应用
  • 配置
  • 的pageContext

你可以用写出来。但是出来是一个作家,因此它写字。你可能想写二进制文件。

如果您将代码重写为Servlet将会很酷。它会更干净。

否则,为了解决JSP内部的问题,可以在这里说的东西将是一个黑客...不会很酷。

  • 你可以插入一个明确的“return”写完之后。
  • 您可以尝试清除缓冲区并重置内部状态。
  • 添加疯狂捕捞角落找寻你的JSP
  • 铝至少,不要太哈克,加<%@页trimDirectiveWhitespaces =“真正的”%>来保证的JspWriter不会为页面创建。
相关问题