打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
getOutputStream() has already been called for this response的解决方法
<%
  BufferedImage image 
= new BufferedImage(400400, BufferedImage.TYPE_INT_RGB);
  Graphics g 
=
 image.getGraphics();
  g.fillRect(
0,0,400,400
);
  g.setColor(
new Color(255,0,0
));  
  g.fillArc(
20,20,100,100,30,120
);
  g.setColor(
new Color(0,255,0
));
  g.fillArc(
20,20,100,100,150,20
);
  g.setColor(
new Color(0,0,255
));
  g.fillArc(
20,20,100,100,270,120
);
  g.setColor(
new Color(0,0,0
));
  g.drawString(
"red:climb" , 30080
);
  g.drawString(
"green:swim"300120
);
  g.drawString(
"blue:jump"300160
);
  ImageIO.write(image, 
"bmp"
, response.getOutputStream());
  
//
out.clear();
  
//out = pageContext.pushBody();

%>
在Tomcat下运行时抛出如下异常:

    
at org.apache.catalina.connector.Response.getWriter(Response.java:601)
    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:
185
)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:
116
)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:
76
)
    
at org.apache.jsp.pages.drawImage_jsp._jspService(drawImage_jsp.java:84)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:
98
)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
803
)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:
328
)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:
315
)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:
265
)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:
803
)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
269
)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
188
)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
210
)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
174
)
    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:
151
)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
870
)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:
665
)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:
528
)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:
81
)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:
685
)
    at java.lang.Thread.run(Thread.java:
595)

查看转换后的JSP代码,发现第84行如下(绿色高亮处):

  public void
 _jspService(HttpServletRequest request, HttpServletResponse response)
        
throws java.io.IOException, ServletException 
{

    JspFactory _jspxFactory 
= null
;
    PageContext pageContext 
= null
;
    HttpSession session 
= null
;
    ServletContext application 
= null
;
    ServletConfig config 
= null
;
    JspWriter out 
= null
;
    Object page 
= this
;
    JspWriter _jspx_out 
= null
;
    PageContext _jspx_page_context 
= null
;


    
try 
{
      _jspxFactory 
=
 JspFactory.getDefaultFactory();
      response.setContentType(
"text/html; charset=UTF-8"
);
      pageContext 
= _jspxFactory.getPageContext(this
, request, response,
                  
nulltrue8192true
);
      _jspx_page_context 
=
 pageContext;
      application 
=
 pageContext.getServletContext();
      config 
=
 pageContext.getServletConfig();
      session 
=
 pageContext.getSession();
      out 
=
 pageContext.getOut();
      _jspx_out 
=
 out;

      out.write(
"\r\n"
);
      out.write(
"\n"
);
      out.write(
"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");

      out.write("<html>\n");
      out.write(
"<head>\n"
);
      out.write(
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n"
);
      out.write(
"<title>Draw Image</title>\n"
);
      out.write(
"</head>\n"
);
      out.write(
"<body>\n"
);
      out.write(
"\r\n"
);

  BufferedImage image 
= new BufferedImage(400400
, BufferedImage.TYPE_INT_RGB);
  Graphics g 
=
 image.getGraphics();
  g.fillRect(
0,0,400,400
);
  g.setColor(
new Color(255,0,0
));  
  g.fillArc(
20,20,100,100,30,120
);
  g.setColor(
new Color(0,255,0
));
  g.fillArc(
20,20,100,100,150,20
);
  g.setColor(
new Color(0,0,255
));
  g.fillArc(
20,20,100,100,270,120
);
  g.setColor(
new Color(0,0,0
));
  g.drawString(
"red:climb" , 30080
);
  g.drawString(
"green:swim"300120
);
  g.drawString(
"blue:jump"300160
);
  ImageIO.write(image, 
"bmp"
, response.getOutputStream());
  
//
out.clear();
  
//out = pageContext.pushBody();


      out.write(
"\r\n");
      out.write(
"</body>\n"
);
      out.write(
"</html>"
);
    }
 catch (Throwable t) {
      
if (!(t instanceof SkipPageException))
{
        out 
=
 _jspx_out;
        
if (out != null && out.getBufferSize() != 0
)
          out.clearBuffer();
        
if (_jspx_page_context != null
) _jspx_page_context.handlePageException(t);
      }

    }
 finally {
      
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
    }

  }

我们看到在JSP页面释放资源的时候,调用了ServetResponse.getWriter()方法,之后程序即抛出异常了,查看Servlet的API发现问题: 
public java.io.PrintWriter getWriter()throws java.io.IOException
Returns a PrintWriter object that can send character text to the client. The PrintWriter uses the character encoding returned by getCharacterEncoding(). If the response's character encoding has not been specified as described in getCharacterEncoding (i.e., the method just returns the default value ISO-8859-1), getWriter updates it to ISO-8859-1.

Calling flush() on the PrintWriter commits the response.

Either this method or getOutputStream() may be called to write the body, not both.

 

Returns:
a PrintWriter object that can return character data to the client
Throws:
UnsupportedEncodingException - if the character encoding returned by getCharacterEncoding cannot be used
java.lang.IllegalStateException - if the getOutputStream method has already been called for this response object
java.io.IOException - if an input or output exception occurred
See Also:
getOutputStream(), setCharacterEncoding(java.lang.String)
如API所言,由于ServletResponse.getOutputStream()方法和该方法都有可能被调用,来输出JSP页面的内容,如果其中的一个方法被调用了,再调用另一个方法就会抛出异常。

解决方法如下:

将JSP页面的最后两行代码的注释去掉,这两行代码的作用如下:

out.clear():清空缓存的内容。

pageContext.pushBody():参考API

public BodyContent pushBody()
Return a new BodyContent object, save the current "out" JspWriter, and update the value of the "out" attribute in the page scope attribute namespace of the PageContext.

 

Returns:
the new BodyContent

·返回一个新的BodyContent(代表一个HTML页面的BODY部分内容)
·保存JspWriter实例的对象out
·更新PageContext的out属性的内容


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JSP 的技术原理
Eclipse Tomcat Jasper 入门 - [Matrix - 与 Java 共舞]
JSP动态输出Excel及中文乱码的解决
图解JSP与Servlet的关系
JSP文件下载的解决方法
初学 Java Web 开发,请远离各种框架,从 Servlet 开发
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服