我用的是jspSmartUpLoad组件下载的,源代码如下
wenjianxianzai.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>下载</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<a href="./wenjianxiazai.jsp">点击下载</a>
</body>
</html>
wenjianxiazai.jsp
<%@ page contentType="text/html;charset=gb2312" language="java" import="com.jspsmart.upload.*" %><%
                 // 新建一个SmartUpload对象
         SmartUpload su = new SmartUpload();
                 // 初始化
         su.initialize(pageContext);
                 // 设定contentDisposition为null以禁止浏览器自动打开文件,
                 //保证点击链接后是下载文件。若不设定,则下载的文件扩展名为
                 //doc时,浏览器将自动用word打开它。扩展名为pdf时,
                 //浏览器将用acrobat打开。
         su.setContentDisposition(null);
                 // 下载文件
         su.downloadFile("/upload/java.txt");
%>
运行后出现的错误如下:
exception 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:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
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:186)
org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:118)
org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:77)
org.apache.jsp.wenjianxiazai_jsp._jspService(wenjianxiazai_jsp.java:77)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

解决方案 »

  1.   

    getOutputStream() has already been called for this response 把wenjianxiazai.jsp 的方法写在一个servlet里面.
      

  2.   

    产生这样的异常原因:是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的response.getOutputStream()产生冲突.即Servlet规范说明,不能既调用response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出IllegalStateException,因为在jsp中,out变量实际上是通过response.getWriter得到的,你的程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。
    解决方案:在程序的最后添加:
    out.clear();
    out = pageContext.pushBody(); 
    就可以了。
      

  3.   

    out.clear(); 
    out = pageContext.pushBody();