Hi Lyallex!
You're getting a OutputStream ftrom a JSP? If the JSP has a simple
single empty line before your java code <%%>, the JSP framework get a
writer before your java code is executred. This is the cause of the
IllegalState Exception. The rigth way to do this is from a servlet, but
if you prefer still using JSP, clean any empty space before your java code.
This code probably fails:
<[EMAIL PROTECTED] import ..>
<[EMAIL PROTECTED] ... >
<%
//my java code
%>
EOF
An this avoid the problem:
<%page ....><%
//my java code
//other java line
%>EOF
Best regards.
Ricardo
Lyallex escribió:
Hi
I'm not sure this is a Tomcat question, more likely a poor
understanding of
the Request/Response lifecycle on my part but I'll give it a go anyway.
After agonising for days(weeks) over whether to store my images in a
database or on the filesystem I opted for the database.
I have everything working fine ... apart from one little niggling
thing that
I just cannot figure out.
Every time I get an image from the database I get an exception
java.lang.IllegalStateException: getOutputStream() has already been
called
for this response ...
Now I think I understand why this is happening, I read somewhere that you
cannot get a JspWriter (via a call to the implicit object out for
example)
and a binary output stream
(ServletOutputStream outStream = response.getOutputStream ()) from the
same
response. Nothing falls over and the images appear fine. It's really the
exception traces I'm trying to get rid of
It appears that others are also using a database to store images and have
things working.
(mainly from http://marc.info/?l=tomcat-user)
Can anyone advise me as to how to write both text and image data out
to the
same response without this exception clogging up all my log files ?
I have included code below if you want/need to read it
Many thanks
Duncan
//============== get an image in a jsp =============
//where p is a Product Object that contains information on the image
name as
stored in the database
//images can be thumbnails or normal size
<img
src="imageproxy.jsp?imageid=<%=p.calculateImageId()%>&imagetype=thumb"
width='80'>
//============== imageproxy.jsp ================
//where ImageServer is a singleton that gets an InputStream on a MySQL
database BLOB
boolean DEBUG = false;
ServletOutputStream outStream = response.getOutputStream();
response.reset();
response.setHeader("Expires", "-1");
response.setHeader("Cache-Control", "no-cache");
String imageId = request.getParameter (imageid);
String imageType = request.getParameter(imagetype);
ImageServer images = ImageServer.getServer();
InputStream inStream = images.getImageData(imageId, imageType);
if(DEBUG){
System.out.println("imageproxy.jsp, inStream has " +
inStream.available() + " bytes available");
}
byte[] bytes = new byte[1000];
int bytesRead = inStream.read(bytes);
while (bytesRead != -1) {
outStream.write(bytes,0,bytesRead);
bytesRead = inStream.read(bytes);
}
outStream.flush ();
inStream.close();
//============= Just FYI here is the trace (one per image) =============
SEVERE: 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
:599)
at org.apache.catalina.connector.ResponseFacade.getWriter(
ResponseFacade.java:195)
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.imageproxy_jsp._jspService(imageproxy_jsp.java:94)
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:332)
at org.apache.jasper.servlet.JspServlet.serviceJspFile (
JspServlet.java:314)
at
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
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.authenticator.AuthenticatorBase.invoke(
AuthenticatorBase.java:432)
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:869)
at
org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(
Http11BaseProtocol.java:664)
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)
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]