如何将InputStream从jsp传递给servlet

时间:2014-07-10 15:33:26

标签: java jsp inputstream

我必须在jsp页面上打印一些我以InputStream形式获得​​的图像。

首先,我有一个servlet,它将包含InputStream的变量传递给jsp页面,这样:

request.setAttribute("Image", InputStream);
request.getRequestDispatcher(pagename).include(request, response);

在我的jsp页面中,我有这个来获取InputStream:

${requestScope.VariableContainingInputStream}

要将InputStream转换为图像,我应该以这种方式使用servlet:

<img src="ServletName">

如何将该InputStream传递给该servlet?

2 个答案:

答案 0 :(得分:1)

  

如何将该InputStream传递给该servlet?

你不会。您的JSP将创建一个临时(或永久)文件,并将InputStream的内容写入其中。然后,您将提供一个端点,用于提供该文件的内容。

然后,您将在JSP的<img>元素中提供该端点的URL。

答案 1 :(得分:0)

如果你把它作为一个InputStream,我假设图像是动态生成的,或者一般来说你有某些根据一些参数给你的东西

您应该考虑一下普通(或愚蠢......)浏览器的工作方式:

  • 用户点击链接,提交按钮或在地址栏中传递网址
  • 浏览器生成相应的请求并将其发送到服务器
  • 服务器生成(通常是HTML)页面,其中包含指向图片的链接并将其发送回浏览器
  • 浏览器分析页面,并发送单独的图像请求
  • 服务器为每个请求发回一个图像
  • 浏览器显示包含图像的整页

(您可以通过css页面,js scrips或任何其他资源替换图像)

所以你应该在运行你的jsp时获取输入流来编写HTML页面但写入<image source=/ImageServlet_url?params_for_current_image/>

然后,当浏览器要求提供图像时,图像servlet将要求InputStream并将其直接放在响应正文中,并在响应标题中使用正确的类型。

这是解决问题最强大的方法。如果真的不是一个选项,并且InputStream在运行jsp时只能是不可取的,那么你必须输入 session 属性。然后,当ImageServlet被调用时,它将在会话中查找并发送它。问题是InputStream不一定是Serializable,并且将不可序列化的项放入会话中是不安全的。所以你应该:

  • 在您的应用中的某处设置全局Hash<String, InputStream>
  • 在尝试将InputStream放入会话时,实际放入哈希(使用唯一键)并将密钥存储在会话中
  • 从会话中获取InputStream时,从会话中获取密钥并从哈希中获取InputStream ...并且不要忘记将其从哈希中删除...

强烈建议您坚持第一个解决方案,而不是HTML页面请求与图片之间的说话或网络错误或断电......

相关问题