Java 如何将InputStream从jsp传递到servlet

Java 如何将InputStream从jsp传递到servlet,java,jsp,inputstream,Java,Jsp,Inputstream,我必须在jsp页面上以InputStream的形式打印一些图像 首先,我有一个servlet,它将包含InputStream的变量传递给jsp页面,如下所示: request.setAttribute("Image", InputStream); request.getRequestDispatcher(pagename).include(request, response); <img src="ServletName"> 在我的jsp页面中,我有以下内容来获取输入流: ${r

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

首先,我有一个servlet,它将包含InputStream的变量传递给jsp页面,如下所示:

request.setAttribute("Image", InputStream);
request.getRequestDispatcher(pagename).include(request, response);
<img src="ServletName">
在我的jsp页面中,我有以下内容来获取输入流:

${requestScope.VariableContainingInputStream}
要将该InputStream转换为图像,我应该这样使用servlet:

request.setAttribute("Image", InputStream);
request.getRequestDispatcher(pagename).include(request, response);
<img src="ServletName">

如何将InputStream传递给该servlet

如何将InputStream传递给该servlet

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


然后,您将在JSP的
元素中提供指向该端点的URL。

如果您将其作为InputStream获取,我假设图像是动态生成的,或者一般来说,您有一些东西根据一些参数提供给您

您应该考虑一下普通(或愚蠢的…)浏览器将如何工作:

  • 用户单击链接、提交按钮或在地址栏中传递url
  • 浏览器生成相应的请求并将其发送到服务器
  • 服务器生成一个(通常为HTML)页面,其中包含指向图像的链接,并将其发送回浏览器
  • 浏览器分析页面,并分别发送图像请求
  • 服务器为每个请求发回一个映像
  • 浏览器将显示包含图像的完整页面
(您可以用css页面、js脚本或任何其他资源替换图像)

因此,在运行jsp以组成HTML页面时,您应该而不是获取输入流,而是在其中写入

然后,当浏览器请求图像时,图像servlet将请求
InputStream
,并将其直接放在响应体中,在响应头中输入正确的类型

这是迄今为止解决您的问题最有效的方法。如果它确实不是一个选项,并且
InputStream
仅在运行jsp时才可显示,则必须在会话属性中输入。然后,当调用
ImageServlet
时,它将在会话中查找并发送它。问题是InputStream不一定是可序列化的,在会话中放置不可序列化的项是不安全的。所以你应该:

  • 在应用程序中的某个位置设置全局
    哈希值
  • 当尝试将
    InputStream
    放入会话时,实际将其放入散列(使用唯一密钥)并将密钥存储在会话中
  • 从会话中获取
    InputStream
    时,从会话中获取密钥并从散列中获取
    InputStream
    。。。别忘了从散列中删除它

strong建议您坚持第一种解决方案,不要在HTML页面请求和图像之间出现语音或网络错误或断电…

您还可以在servlet中对生成的字节数组进行base64编码,并在jsp中使用MHTML数据结果创建图像标记。如果映像足够小,您可能会受到轻微的性能影响。如果该文件是临时文件,则必须对多个请求保持可分发状态;如果是永久文件,则必须提供一种方法,以便在经过一定时间后仍未收集该文件时将其删除。