1. //
2. byte[] imageData = (byte[]) ImageUtil.getImage(...);
3.
4. response.setContentType("image/png");
5. OutputStream output = response.getOutputStream();
6. InputStream in = new
7. int
8. byte[] buf = new byte[1024];
9. while ((len = in.read(buf)) != -1) {
10. 0, len);
11. }
12. output.flush();
13. //如果没有下面两行,可能出现getOutputStream() has already been called for this response的异常
14. out.clear();
15. out = pageContext.pushBody();
以上是在jsp页面中显示一个图片。注意在读取图片的时候,图片的路径问题。因为tomcat读取文件是要参照服务器上的路径的,所以你需要getRealPath,像下面:
File file = new File(request.getServletContext().getRealPath("/")+"jsp\\2.jpg");
下面简单说一下我在这次图片显示的思考中所得到的:
我的需求是从数据库中读取出图片的字节流,然后保存成byte[],然后将这些byte[]数组转换成图片显示在jsp页面山。我想把根据byte[]转换成图片并且显示的这项功能写成一个servlet,然后通过img标签来显示图片。
得到上面的程序之后,我想这就好办了,由于我不仅要显示头像,还要显示菜肴的图片,店铺的图片等,因而我在逻辑jsp中读取出来持久化对象中的byte[]成员,然后将这个数组直接通过参数的形式传递给servlet,servlet再根据byte[]返回图像,这样最后就可以成功显示了,而且程序还具有很高的灵活性。
但是我失败了。。。浏览器在解析的时候总是崩溃。。。。。根本无法显示页面
原因后来我想明白了,因为我把图片的最大容量限制为2M,这样我的参数的十六进制字符串的最大容量就是2M,这些信息在浏览器进行遍历和解析的时候,会被存储在dom节点的,但是一个dom节点的最大容量是多少呢?我想浏览器是有规定的,参数大小也应该是有限制的,因而发生了内存溢出,造成浏览器崩溃。。。后来我把参数去掉之后,成功的显示了图片。
但是这样以来,我怎么知道该显示哪张图片呢?
现在的想法是,传递的参数应该换一换。换成什么呢?根据type的内容分类,然后再根据不同的类型进行细节化,因为很多持久化对象已经存储在了固定的字段值session对象中,那么我们可以取得这个对象,然后取出byte数组,最后再显示。这只能这么做了现在。