Mendapatkan semula dan memaparkan imej daripada pangkalan data dalam halaman JSP: panduan langkah demi langkah
P粉191610580
P粉191610580 2023-08-27 21:30:22
0
1
725
<p>Bagaimana untuk mendapatkan dan memaparkan imej daripada pangkalan data dalam halaman JSP? </p>
P粉191610580
P粉191610580

membalas semua(1)
P粉251903163

Mari lihat apa yang berlaku langkah demi langkah:

  • JSP pada asasnya ialah teknologi paparan yang direka untuk menjana output HTML.
  • Untuk memaparkan imej dalam format HTML, anda memerlukan elemen HTML .
  • Untuk meletakkannya imej, anda perlu menentukan atribut srcnya.
  • Atribut
  • src 属性需要指向有效的 http:// perlu menghala ke URL http:// yang sah, jadi bukan laluan sistem fail cakera tempatan file://
  • kerana ini tidak akan berfungsi apabila pelayan dan klien berjalan pada mesin yang berbeza secara fizikal akan bekerja.
  • http://example.com/context/images/foo.png)或作为请求参数(例如 http://example.com/context/images?id=1URL imej perlu memasukkan pengecam imej dalam laluan permintaan (cth.
  • http://example.com/context/images/foo.png) atau sebagai parameter permintaan (cth. http:// contoh. com/context/images?id=1).
  • /images/*Dalam dunia JSP/Servlet, anda boleh meminta servlet mendengar corak URL tertentu, seperti
  • /images/*, supaya anda boleh melaksanakan beberapa kod Java pada URL tertentu.
  • byte[]InputStream 的形式获取,JDBC API 提供 ResultSet#getBytes()ResultSet#getBinaryStream() 为此,JPA API 提供@LobImej ialah data binari yang boleh diperoleh daripada pangkalan data sebagai bait[] atau 李>InputStream, JDBC API
  • menyediakan byte[]InputStream 写入响应的 OutputStreamResultSet#getBytes() dan ResultSet#getBinaryStream() Untuk melakukan ini, JPA API
  • Disediakan
  • @Lob untuk ini. Content-Type 响应头也需要设置。您可以通过 ServletContext#getMimeType() 基于图像文件扩展名,您可以通过 web.xml 中的 扩展和/或覆盖该扩展名
  • Dalam Servlet, anda cuma tulis
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/*, 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:

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan