如何从JSP页面中的数据库中检索和显示图像?
如何从JSP页面中的数据库中检索和显示图像?
让我们看看将会发生什么:
<img>
元素。 src
属性。 src
属性需要指向一个有效的http://
URL,因此不是本地磁盘文件系统路径file://
因为当服务器和客户端在物理上不同的机器上运行时,它永远不会工作。 http://example.com/context/images/foo.png
)或请求参数(例如http://example.com/context/images?id=1
)中具有图片标识符http://example.com/context/images?id=1
)。 /images/*
,以便您可以在特定的URL上执行一些Java代码。 byte[]
或InputStream
,JDBC API为此提供了ResultSet#getBytes()
和ResultSet#getBinaryStream()
,JPA API为此提供了@Lob
。 byte[]
或InputStream
写入响应的OutputStream
中,即通常的Java IO方式。 Content-Type
响应标头。 您可以通过基于图像文件扩展名的ServletContext#getMimeType()
来获取正确的图像文件,您可以通过web.xml
<mime-mapping>
扩展和/或覆盖图像文件扩展名。 应该是这样的。 它几乎写代码本身。 我们从HTML开始(在JSP中):
<img src="${pageContext.request.contextPath}/images/foo.png">
<img src="${pageContext.request.contextPath}/images/bar.png">
<img src="${pageContext.request.contextPath}/images/baz.png">
您可以根据需要在使用JSTL进行迭代时动态地使用EL来设置src
:
<c:forEach items="${imagenames}" var="imagename">
<img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>
然后定义/创建一个servlet,它侦听/images/*
URL模式上的GET请求,下面的示例使用普通的vanilla JDBC作为作业:
@WebServlet("/images/*")
public class ImageServlet extends HttpServlet {
// content=blob, name=varchar(255) UNIQUE.
private static final String SQL_FIND = "SELECT content FROM Image WHERE name = ?";
@Resource(name="jdbc/yourDB") // For Tomcat, define as <Resource> in context.xml and declare as <resource-ref> in web.xml.
private DataSource dataSource;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String imageName = request.getPathInfo().substring(1); // Returns "foo.png".
try (Connection connection = dataSource.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_FIND)) {
statement.setString(1, imageName);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
byte[] content = resultSet.getBytes("content");
response.setContentType(getServletContext().getMimeType(imageName));
response.setContentLength(content.length);
response.getOutputStream().write(content);
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
}
}
} catch (SQLException e) {
throw new ServletException("Something failed at SQL/DB level.", e);
}
}
}
而已。 如果您担心HEAD和缓存标头并正确响应这些请求,请将此抽象模板用于静态资源servlet。
也可以看看:
我建议你解决这个问题。 有两个相关的问题和答案。
如何从MySQL中加载blob
查看实例检索存储为blob的图像
如何动态显示图像
请参阅动态显示缩略图
您还可以创建用于显示图像的自定义标签。
1)创建自定义标记java类和tld文件。
2)编写逻辑以显示图像,例如通过Base64将字节[]转换为字符串。
因此无论您是在单个jsp页面中仅显示一个图像还是多个图像,它都会用于每个图像。
链接地址: http://www.djcxy.com/p/46217.html上一篇: How to retrieve and display images from a database in a JSP page?
下一篇: How to convert Part to Blob, so I can store it in MySQL?