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

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


让我们看看将会发生什么:

  • JSP基本上是一种应该生成HTML输出的视图技术。
  • 要以HTML格式显示图像,您需要HTML <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 )。
  • 在JSP / Servlet世界中,您可以让Servlet侦听特定的URL模式(如/images/* ,以便您可以在特定的URL上执行一些Java代码。
  • 图像是二进制数据,要从数据库中获取byte[]InputStream ,JDBC API为此提供了ResultSet#getBytes()ResultSet#getBinaryStream() ,JPA API为此提供了@Lob
  • 在Servlet中,您可以将这个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。

    也可以看看:

  • 我应该如何在基于servlet的应用程序中连接到JDBC数据库/数据源?
  • 如何上传图像并将其保存在数据库中?
  • 在Java Web应用程序中从应用程序服务器之外提供静态数据的最简单方法

  • 我建议你解决这个问题。 有两个相关的问题和答案。

  • 如何从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?