搜尋

首頁  >  問答  >  主體

在 JSP 頁面中從資料庫檢索和顯示圖像:逐步指南

<p>如何在 JSP 頁面中擷取並顯示資料庫中的影像? </p>
P粉191610580P粉191610580498 天前771

全部回覆(1)我來回復

  • P粉251903163

    P粉2519031632023-08-28 18:47:50

    讓我們分步驟看看會發生什麼:

    • JSP 基本上是一種視圖技術,旨在產生 HTML 輸出。
    • 要以 HTML 格式顯示圖像,您需要 HTML 元素。
    • 要讓它定位圖像,您需要指定其 src 屬性。
    • src 屬性需要指向有效的http:// URL,因此不是本機磁碟檔案系統路徑file:// 因為當伺服器和用戶端在物理上不同的機器上運行時,這永遠不會起作用。
    • 映像URL 需要在請求路徑中包含映像識別碼(例如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()< /a> 為此,JPA API 提供#@Lob 為此。
    • 在Servlet 中,您只需將此byte[]InputStream 寫入回應的OutputStream(通常的Java IO 方式。
    • 需要指示客戶端將資料作為映像處理,因此至少Content-Type 回應頭也需要設定。您可以透過ServletContext#getMimeType() 基於映像檔副檔名,您可以透過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">
    

    如果需要,您也可以在使用

    EL 動態設定src ="https://stackoverflow.com/tags/jstl/info">JSTL

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

    然後定義/建立一個

    servlet,它會偵聽 /images/*,下面的範例使用普通的 JDBC 來完成這項工作:< URL 模式上的 GET 请求/code>

    @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的抽像模板

    另請參閱:

    #

    回覆
    0
  • 取消回覆