我尝试使用 Spring mvc Controller 以动态方式生成图像。
@Controller
@RequestMapping("/")
public String generateMik(final HttpServletResponse response){
...
BufferdImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
...
response.setContentType("image/png");
try {
OutputStream os = response.getOutputStream();
ImageIO.write(buffer, "png", os);
os.flush();
os.close();
...
}
我在 .jsp 中显示这张图片:
<img src="picture" id="picture">
一切正常,图片显示在我的浏览器中,但我遇到了异常,并且我不知道如何正常解决此问题(我不想捕获此异常)。
org.apache.catalina.core.ApplicationDispatcher invoke
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:626)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:215)
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:190)
...
我的问题是:如何以可能简单的方式生成动态图片?我不想临时保存图片。也许放入模型outputStream并在jsp中以某种神奇的方式显示?
最佳答案
您需要使用@ResponseBody
注释将图像写入流的@RequestMapping
方法,以告诉Spring MVC不要尝试查找要使用的 View 呈现响应。您可以在自己处理写入输出流的任何方法上使用 @ResponseBody
。
由于您的@RequestMapping
方法返回一个String
,Spring将您的方法的响应值解释为它在渲染响应时应该使用的 View 的名称。
您看到异常是因为您正在写入(并关闭)响应流,然后 Spring MVC 尝试调用 View 类来写入相同的响应流。
关于java - jsp中的动态图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957990/