首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jsp中的动态图像

jsp中的动态图像
EN

Stack Overflow用户
提问于 2012-10-18 23:17:38
回答 3查看 4.2K关注 0票数 0

我尝试使用Spring mvc控制器来动态生成图像。

代码语言:javascript
复制
@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中展示了这张图片:

代码语言:javascript
复制
<img src="picture" id="picture">

一切正常,图片显示在我的浏览器中,但我得到了一个异常,我没有任何想法来解决这个问题在正常的原因(我不想捕捉这个异常)。

代码语言:javascript
复制
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中显示出来?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-10-19 00:06:52

您需要使用@ResponseBody注释将图像写入流的@RequestMapping方法,以告诉Spring MVC不要尝试寻找用于呈现响应的视图。您可以在自己处理输出流写入的任何方法上使用@ResponseBody

因为您的@RequestMapping方法返回一个String,所以Spring将您的方法的响应值解释为它在呈现响应时应该使用的视图的名称。

您之所以看到异常,是因为您正在编写(和关闭)响应流,然后Spring MVC尝试调用一个视图类来写入相同的响应流。

票数 3
EN

Stack Overflow用户

发布于 2012-10-18 23:31:02

我想这是因为你在控制器方法中有返回参数,它要求spring将请求转发给特定的视图。

您应该将返回类型设置为void。

代码语言:javascript
复制
public void generateMik(final HttpServletResponse response)
票数 3
EN

Stack Overflow用户

发布于 2012-10-18 23:28:39

这个对我来说很好用:

代码语言:javascript
复制
@RequestMapping(value = "/img", method = RequestMethod.GET)
public @ResponseBody void getImage(HttpServletResponse response)
{
    BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);

    response.setContentType("image/png");
    OutputStream out;
    try
    {
        out = response.getOutputStream();
        ImageIO.write(image, "png", out);
        out.close();
    }
    catch (IOException ex)
    {
        Logger.getLogger(IndexController.class.getName()).log(Level.SEVERE, null, ex);
    }
}

但是,我有99.8%的把握,有一个更聪明的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12957990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档