帮助从Servlet到JSP页面获取图像

时间:2009-07-20 15:27:09

标签: java image jsp servlets

我目前必须生成一个显示字符串文本的图像,我需要在Servlet上创建这个图像,然后以某种方式将图像传递给JSP页面以便它可以显示它。我试图避免保存图像,而是以某种方式将图像流式传输到JSP。

我没有找到一种生成图像的方法,因为我开始寻找如何将图像从Servlet传递到JSP并且卡住了。

编辑: jsp页面已经制作,不是由servlet创建的,我必须将图像传递给已经存在的jsp

感谢任何帮助。

5 个答案:

答案 0 :(得分:30)

您需要将图像作为字节数组写入响应的输出流。像这样:

byte[] imageBytes = getImageAsBytes();

response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length);

response.getOutputStream().write(imageBytes);

然后在JSP中,您只需使用标准的img元素:

<img src="url to your servlet">

答案 1 :(得分:7)

不能 1 在同一个回复中返回,因为你要返回不同的类型(类型为text/html的HTML页面和图像类型image/jpeg,例如)。

对于这种事情,我将在初始servlet请求期间生成图像(对于包含HTML页面)。我将它存储在我的servlet的缓存中,并使用带有句柄的图像标记写入包含该图像的URL的HTML页面。

e.g。浏览器要求http://whatever/page

servlet生成图像,并在页面中写入HTML标记,如

<img src="http://whatever/image/unique_handle_to_image">

浏览器将呈现HTML页面,并作为该问题的一部分向我的servlet发出一个带有图像句柄的新请求。

e.g。浏览器现在要求http://whatever/image/unique_handle_to_image

然后我将图片作为内容类型image/jpeg或类似内容返回。

所以你有两个请求正在进行中。一个用于页面,在其中渲染图像并临时存储,第二个用于返回图像。您必须记住清除图像缓存,但这一切都很简单。我不担心存储大量图像,因为浏览器的两个请求通常会(!)快速连续出现。

  1. 我想如果您的浏览器支持它,可以使用data uri,并创建类似

    的内容
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IAAAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1JREFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jqch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0vr4MkhoXe0rZigAAAABJRU5ErkJggg==" alt="Red dot" />
    
  2. 请注意,围绕这些有一些警告。请参阅链接页面。

答案 2 :(得分:3)

我会沿着这条路做点什么来实现这个目标:

在JSP页面上,您可以链接到图像:

<img src="servlet/path?word=value">the rest</img>

此链接指向您的servlet,它使用请求参数生成图像,您不需要保存它,只需将其放入响应的输出流即可。您必须记住禁用此servlet的浏览器缓存。

首先显示JSP页面,接下来请求所有图像,它应该可以正常工作。

当然,您不应该将文本显示在这样的参数中,您应该以某种方式对其进行加密或将其存储在HTTP会话中。

希望这有帮助。

答案 3 :(得分:1)

如果我理解你的问题,事件的顺序将是:

  1. 您生成一个HTML页面;
  2. 将HTML页面发送给客户端;和
  3. 客户端的浏览器会读取图片网址并将其作为单独的请求进行请求。
  4. 因此,您无法生成图像并将其传递给JSP。但是,您可以生成 URL 来获取图像并将其放入JSP中。这很容易通过servlet将它传递给HttpServletRequest对象(JSP中的请求范围)。例如,生成:

    <a href="http://myhost.com/image_servlet?id=1234"/>
    

    您并没有真正说出该文本是什么或生成图像需要哪些信息。如果您无法将其封装在GET URL中,则可能需要添加额外信息并将其放入HttpSession中,以便在下一次获取图像请求时检索它。

答案 4 :(得分:1)

...
response.setContentType("image/jpeg");
response.setContentLength(imageBytes.length); // imageBytes - image in bytes
response.getOutputStream().write(imageBytes);// 
outStream.flush();   
outStream.close();