通过Servlet在jsp页面上显示图像

时间:2014-04-06 12:40:02

标签: java image jsp servlets jstl

我正在制作一个小应用程序,它将经过身份验证的用户的图像上传到数据库中,并显示之前通过servlet动态上传的所有图像。

我使用以下代码从数据库加载页面检索图像:

<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<jsp:include page="/RetrieveImagesServlet.do"></jsp:include>
</head>

这会在页面请求中设置用户图像,并且工作正常。

现在以表格格式显示图像数据我使用jstl。由于用户图像对象包含byte[]格式的图像,因此我调用servlet来打印图像文件,如下所示。

<c:forEach var="imageDto" items="${requestScope.userImages}">
                <tr>
                    <td><c:out value="${imageDto.getSerialNumber()}"></c:out></td>
                    <td><c:out value="${imageDto.getImageName() }"></c:out></td>
                    <td><c:out value="${imageDto.getImageSize()}"></c:out></td>
                    <td>
                        <c:set var="imageDto" scope="request" value="${imageDto}"></c:set>
                        <jsp:include page="/ImageDisplayServlet.do"></jsp:include> 
                        <c:remove var="imageDto" scope="request" /></td>
                    <td></td>
                </tr>
            </c:forEach>

上面代码中包含的行<jsp:include page="/ImageDisplayServlet.do"></jsp:include>调用要显示的servlet,其中包含以下代码

response.setContentType("image/jpeg");
    final ImageDto imageDto = (ImageDto) request.getAttribute("imageDto");
    System.out.println(imageDto.getImageName());
    final OutputStream outputStream=response.getOutputStream();
    outputStream.write(imageDto.getImageFile());
    outputStream.close();

我能够在调用的servlet中获取图像,因为它能够打印imageName,但它会在final OutputStream outputStream=response.getOutputStream();处抛出illegalStateException。

请指导我错误的地方,如何在jsp文件上显示图像。

1 个答案:

答案 0 :(得分:0)

您不了解浏览器和HTTP的工作原理。加载HTML页面时,您发出HTTP请求。对请求的响应是包含HTML代码的页面。例如:

<img src="someImage.png" />

然后,浏览器解析HTML,看到有img标记,然后向someImage.png发送第二个不同的请求。对第二个请求的响应是图像的字节。

您尝试在第一个请求的响应中发送HTML代码图像的字节。那不行。 JSP生成的HTML页面必须包含一个img标记,指向将将图像的字节发送到响应的servlet。例如:

<img src="ImageDisplayServlet.do?imageId=${imageDto.id}" />