<%
BufferedImage image = new BufferedImage(400, 400 , 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" , 300, 80 );
g.drawString("green:swim", 300, 120 );
g.drawString("blue:jump", 300, 160 );
ImageIO.write(image, "bmp" , response.getOutputStream());
// out.clear();
//out = pageContext.pushBody();
%>
BufferedImage image = new BufferedImage(400, 400 , 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" , 300, 80 );
g.drawString("green:swim", 300, 120 );
g.drawString("blue:jump", 300, 160 );
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,
null, true, 8192, true);
_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(400, 400, 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" , 300, 80);
g.drawString("green:swim", 300, 120);
g.drawString("blue:jump", 300, 160);
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);
}
}
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,
null, true, 8192, true);
_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(400, 400, 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" , 300, 80);
g.drawString("green:swim", 300, 120);
g.drawString("blue:jump", 300, 160);
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
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.
PrintWriter
object that can return character data to the client
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
getOutputStream()
,
setCharacterEncoding(java.lang.String)
解决方法如下:
将JSP页面的最后两行代码的注释去掉,这两行代码的作用如下:
out.clear():清空缓存的内容。
pageContext.pushBody():参考API
public BodyContent pushBody ()
·返回一个新的BodyContent(代表一个HTML页面的BODY部分内容)
·保存JspWriter实例的对象out
·更新PageContext的out属性的内容