Rumah  >  Soal Jawab  >  teks badan

Mendapatkan semula dan memaparkan imej daripada pangkalan data dalam halaman JSP: panduan langkah demi langkah

<p>Bagaimana untuk mendapatkan dan memaparkan imej daripada pangkalan data dalam halaman JSP? </p>
P粉191610580P粉191610580419 hari yang lalu649

membalas semua(1)saya akan balas

  • P粉251903163

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

    Mari lihat apa yang berlaku langkah demi langkah:

    bait[] ini atau

    InputStream pada respons OutputStream (cara biasa Java IO

    .

    Pelanggan perlu diarahkan untuk mengendalikan data sebagai imej, jadi sekurang-kurangnya pengepala respons srcJenis Kandungan perlu ditetapkan juga. Anda boleh mendapatkan jenis yang betul melalui

    ServletContext#getMimeType()🎜 Berdasarkan sambungan fail imej, anda boleh melanjutkan dan/atau mengatasi sambungan itu melalui 🎜 dalam 🎜web.xml. 🎜 🎜 🎜Begitulah sepatutnya. Ia cukup banyak menulis kod itu sendiri. Mari kita mulakan dengan HTML (dalam 🎜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">
    
    🎜Jika perlu, anda juga boleh menggunakan tetapan dinamik 🎜EL🎜 🎜="https://stackoverflow.com/tags/jstl/info">JSTL🎜: 🎜
    <c:forEach items="${imagenames}" var="imagename">
        <img src="${pageContext.request.contextPath}/images/${imagename}">
    </c:forEach>
    

    Kemudian tentukan/buat servlet yang mendengar pada /images/*< URL 模式上的 GET 请求/code>, contoh berikut menggunakan JDBC biasa untuk melakukan kerja:

    @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);
            }
        }
    
    }

    Itu sahaja. Jika anda bimbang tentang HEAD dan pengepala cache dan membalas permintaan ini dengan betul, gunakan Templat Abstrak untuk servlet Sumber Statik ini.

    Lihat juga:

    balas
    0
  • Batalbalas