jsp error: getOutputStream() has already been called for thi

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Jack

jsp error: getOutputStream() has already been called for thi

Post by Jack » Tue Dec 03, 2002 5:53 pm

I am tried to use JFreeChart in a jsp page. Although it renders correctly on the web page, I have found the exception regarding getOutputStream() in the tomcat log. Any idea why this is happening?

Tomcat 4.06 on XP Pro SP1
JDK 1.4.1_01

<<< Error: >>>
2002-12-03 11:48:14 StandardContext[/metric]: Mapped to servlet 'jsp' with servlet path '/chart.jsp' and path info 'null' and update=true
2002-12-03 11:48:14 StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.ResponseBase.getWriter(ResponseBase.java:750)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:165)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:166)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:158)
at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:205)
at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:177)
at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:198)
at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:193)
at org.apache.jsp.chart$jsp._jspService(chart$jsp.java:108)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:201)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:381)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:473)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.CertificatesValve.invoke(CertificatesValve.java:246)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2347)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1027)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1125)
at java.lang.Thread.run(Thread.java:536)



<<< Code: >>>
<%@page contentType="image/jpeg"%>
<%@page import="java.util.*,java.io.*,java.awt.*"%>
<%@page
import="com.jrefinery.data.*,com.jrefinery.chart.*,com.jrefinery.chart.ui.*,com.jrefinery.chart.data.*"%>
<%
String[] xAxisData = {"11", "22", "33", "44"};
Number[][] data ={
{new Integer(120),new Integer(138),new Integer(300), new Integer(400)},
{new Integer(95), new Integer(87), new Integer(99), new Integer(400)},
{new Integer(180),new Integer(156),new Integer(173), new Integer(400)}
};

String[] year ={"2000","2001","2002"};

DefaultCategoryDataset dataSet = new DefaultCategoryDataset(year,data);

dataSet.setCategories(xAxisData);

JFreeChart chart=null;
chart = ChartFactory.createVerticalBarChart3D("1111111", "xx", "yy", dataSet, true);

OutputStream ostream = response.getOutputStream();

ChartUtilities.writeChartAsJPEG(ostream, chart, 300, 200);

ostream.close();

%>



Thanks,
Jack

Stacey

Re: jsp error: getOutputStream() has already been called for

Post by Stacey » Tue Dec 03, 2002 10:00 pm

I ran into the same problem. Using Tomcat, the output stream is already called. I had a hard time getting around it but what I eventually did was use a servlet to request the work to be done. Hope this helps.

Jack

Re: jsp error: getOutputStream() has already been called for

Post by Jack » Wed Dec 04, 2002 3:59 am

That does it. Thanks for the hint...


-Jack

Gideon Krause

Re: jsp error: getOutputStream() has already been called for

Post by Gideon Krause » Wed Dec 04, 2002 10:35 am

Hi,
omit blanks and line breaks outside the script delimiters (also at the beginning and at the end of your code), e.g.:

<%
@page contentType="image/jpeg"%><%
@page import="java.util.*,java.io.*,java.awt.*"%><%
@page import="com.jrefinery.data.*,com.jrefinery.chart.*,com.jrefinery.chart.ui.*,com.jrefinery.chart.data.*"%><%
String[] xAxisData = {"11", "22", "33", "44"};
Number[][] data ={
{new Integer(120),new Integer(138),new Integer(300), new Integer(400)},
[...]
%>


hth

Gid

bmoody
Posts: 9
Joined: Tue Nov 25, 2003 7:02 pm

getOutputStream() has already been called for

Post by bmoody » Wed Dec 03, 2003 8:08 pm

I also receive the exception "org.apache.jasper.JasperException: getOutputStream() has already been called for this response". I'm using a jsp which invokes a servlet to obtain 2 different graphs to display. I have included the jsp and servlet code below. How can I avoid the exception?

.....the jsp file...............
<tr>
<td colspan=2 valign='top' align='left'>
<img src='DB?imgType=dbUsage' border=0 width=250 height=187>
</td>
</tr>
<tr>
<td colspan=2 valign='top' align='left'>
<img src='DB?imgType=poolUsage' border=0 width=400 height=300>
</td>
</tr>
...


....the servlet
String imgType = request.getParameter("imgType");
OutputStream out = response.getOutputStream();

if(imgType.equals("dbUsage"))
{
.........
response.setContentType("image/png");
ChartUtilities.writeChartAsPNG(out, chart, 250, 187);

}
else if(imgType.equals("poolUsage"))
{
CategoryDataset dataset = createDataset();
JFreeChart chart = createChart(dataset);

response.setContentType("image/png");
ChartUtilities.writeChartAsPNG(out, chart, 400, 300);
}

bmoody
Posts: 9
Joined: Tue Nov 25, 2003 7:02 pm

Post by bmoody » Fri Dec 05, 2003 9:05 pm

One workaround that I found was to synchronize my servlet.

synchronized (this) {
.....





}

Locked