gpt4 book ai didi

java - 如何在 JSP 页面中检索并显示数据库中的图像?

转载 作者:行者123 更新时间:2023-11-29 20:51:57 24 4
gpt4 key购买 nike

如何在 JSP 页面中检索和显示数据库中的图像?

最佳答案

让我们分步骤看看会发生什么:

  • JSP 基本上是一种 View 技术,旨在生成 HTML 输出。
  • 要以 HTML 格式显示图像,您需要 HTML <img>元素。
  • 要让它定位图像,您需要指定其 src属性。
  • src属性需要指向有效的 http:// URL,因此不是本地磁盘文件系统路径 file://因为当服务器和客户端在物理上不同的机器上运行时,这永远不会起作用。
  • 图像网址需要在请求路径中(例如 http://example.com/context/images/foo.png )或请求参数(例如 http://example.com/context/images?id=1 )中包含图像标识符。
  • 在 JSP/Servlet 世界中,您可以让 Servlet 监听某个 URL 模式,如 /images/* ,这样您就可以在特定的 URL 上执行一些 Java 代码。
  • 图像是二进制数据,可以通过 byte[] 形式获取。或InputStream从数据库中,JDBC API提供 ResultSet#getBytes() ResultSet#getBinaryStream() 为此,和 JPA API优惠 @Lob 为此。
  • 在 Servlet 中你可以这样写 byte[]InputStreamOutputStream通常的响应 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">

如果需要,您还可以动态设置 srcEL使用 JSTL 进行迭代时:

<c:forEach items="${imagenames}" var="imagename">
<img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>

然后定义/创建一个 servlet它监听 URL 模式 /images/* 上的 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/37967913/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com