我正在制作一个小应用程序,它将经过身份验证的用户的图像上传到数据库中,并显示之前通过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文件上显示图像。
答案 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}" />