<%@ page contentType="text/html; charset=GBK" language="java"%><%@ page import="java.io.*"%><html><body><form name="form" method="post">
<%
    String bb = (String) request.getSession().getAttribute("content");//得到含有图片的字符串
    byte[] date = bb.getBytes();
%><table>
<tr>
<td>
<%
    response.setContentType("image/jpeg");
    OutputStream toClient = response.getOutputStream();
    InputStream in = new ByteArrayInputStream(date);
    int len;
    byte[] buf = new byte[1024];
    while ((len = in.read(buf, 0, 1024)) != -1) {
        toClient.write(buf, 0, len);
    }
    toClient.close();
%>
</td> </tr>
</table>
</form></body>
</html>
在这个jsp页面中,我从session中将字符串图片取出来并转化为byte[]数据显示在jsp页面中。现在字符串图片数据已经取出来,可显示图片的时候报这个错误:
ERROR 2009-10-13 09:55:47 org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/BOSP].[jsp] Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:607)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:196)
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:179)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:116)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:76)
at org.apache.jsp.jsp.authority.au.auuser.aaa_jsp._jspService(aaa_jsp.java:98)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at gap.authority.filter.FunOrgAuFilterServlet.doFilter(FunOrgAuFilterServlet.java:35)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at venus.frames.web.SetEncodingFilter.doFilter(SetEncodingFilter.java:33)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at sgcc.global.util.LoginManager.doFilter(LoginManager.java:61)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:835)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286)
at java.lang.Thread.run(Thread.java:595)

解决方案 »

  1.   

    在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
    有一段这样的代码
    finally {
           if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
         }
    这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
    response.getOutputStream()相冲突的!所以会出现以上这个异常。
    然后当然是要提出解决的办法:
    在使用完输出流以后调用以下两行代码即可:
    out.clear();
    out = pageContext.pushBody();
    文件代码如下:OutputStream o=response.getOutputStream();
    //输出文件用的字节数组,每次发送500个字节到输出流
    byte b[]=new byte[500];
    //下载的文件
    File fileLoad=new File("f:/2000","book.zip");
    //客户使用的保存文件的对话框
    response.setHeader("Content-disposition","attachment;filename="+"book.zip");
    //通知客户文件的MOME类型
    response.setContentType("application/x-tar");
    //通知客户文件的长度
    long fileLength=fileLoad.length();String length=String.valueOf(fileLength);response.setHeader("Content_Length",length);
    out.clear();
    out = pageContext.pushBody();//读取文件book.zip,并发送给客户下载
    FileInputStream in=new FileInputStream(fileLoad);
    int n=0;
    while((n=in.read(b))!=-1)
    {
    o.write(b,0,n);
    }
     
     
      

  2.   

    修改后的代码如下:
    <%@ page contentType="text/html; charset=GBK" language="java"%><%@ page import="java.io.*"%><html><body><form name="form" method="post">
    <%
        String bb = (String) request.getSession().getAttribute("content");//得到含有图片的字符串
        byte[] date = bb.getBytes();
    %><table>
        <tr>
            <td>
            <%
                response.setContentType("image/jpeg");
                OutputStream toClient = response.getOutputStream();
                out.clear();
                out = pageContext.pushBody();

                InputStream in = new ByteArrayInputStream(date);
                int len;
                byte[] buf = new byte[1024];
                while ((len = in.read(buf, 0, 1024)) != -1) {
                    toClient.write(buf, 0, len);
                }
                toClient.close();
            %>
            </td>    </tr>
    </table>
    </form></body>
    </html>
      

  3.   

    一个页面就一个response,要是被你用来写图片了,那其他的不就不能用了。
      

  4.   

    <%@ page contentType="text/html; charset=GBK" language="java"%><%@ page import="java.io.*"%><html><body><form name="form" method="post">
    <%
        String bb = (String) request.getSession().getAttribute("content");//得到含有图片的字符串
        byte[] date = bb.getBytes();
    %><table>
        <tr>
            <td>
            <%
                response.setContentType("image/jpeg");
                OutputStream toClient = response.getOutputStream();
                out.clear();
                out = pageContext.pushBody();
                InputStream in = new ByteArrayInputStream(date);
                int len;
                byte[] buf = new byte[1024];
                while ((len = in.read(buf, 0, 1024)) != -1) {
                    toClient.write(buf, 0, len);
                }
                toClient.close();
            %>
            </td>    </tr>
    </table>
    </form></body>
    </html> 修改后,图片还是没显示出来。java.lang.IllegalStateException: getOutputStream() has already been called for this response  这个错误没有报
      

  5.   

    图自应该是二进制形式保存的,String bb = (String) request.getSession().getAttribute("content");//得到含有图片的字符串,不对吧,基本的东西没搞清楚吧
      

  6.   

    我读取图片的是放到byte[]中的,数据库字段是字符串型的,所以又转化成字符串了。我在显示图片的jsp页面中在将字符串转化为byte[]:byte[] date = bb.getBytes();