<%@ 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)
有一段这样的代码
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);
}
<%@ 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>
<%
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 这个错误没有报