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

发布于 2021-02-02 23:25:39

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

关注者
0
被浏览
286
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    让我们逐步查看会发生什么:

    • JSP基本上是一种视图技术,应该可以生成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从DB中,JDBC API提供ResultSet#getBytes()ResultSet#getBinaryStream()此,和JPA API提供@Lob用于此。
    • 在Servlet中,你可以仅使用通常的Java IO方法将其写入byte[]或写入响应。InputStreamOutputStream
    • 需要指示客户端将数据作为图像处理,因此至少也Content-Type需要设置响应头。你可以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,该servlet侦听URL模式为的GET请求/images/*,以下示例将普通的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);
            }
        }
    }
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看