作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 JSP 页面中从数据库中检索和显示图像?
最佳答案
让我们逐步看看会发生什么:
<img>
元素。src
属性。src
属性需要指向有效的 http://
URL,因此不是本地磁盘文件系统路径 file://
因为当服务器和客户端在物理上不同的机器上运行时,这将永远行不通。http://example.com/context/images/foo.png
)或作为请求参数(例如 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
还需要设置响应 header 。您可以通过 ServletContext#getMimeType()
获得合适的。基于您可以通过 <mime-mapping>
扩展和/或覆盖的图像文件扩展名在web.xml
.应该是这样的。它几乎是自己编写代码。让我们从 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">
如有必要,您还可以动态设置 src
与 EL在使用 JSTL 迭代时:
<c:forEach items="${imagenames}" var="imagename">
<img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>
然后定义/创建一个servlet它监听关于 /images/*
的 URL 模式的 GET 请求,下面的示例使用普通的 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 和缓存 header 以及正确响应这些请求,请使用此 abstract template for static resource servlet .
关于java - 如何在 JSP 页面中从数据库中检索和显示图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27733257/
我是一名优秀的程序员,十分优秀!