Rumah > Soal Jawab > teks badan
P粉2519031632023-08-28 18:47:50
Mari lihat apa yang berlaku langkah demi langkah:
. src
nya. src
属性需要指向有效的 http://
perlu menghala ke URL http://
yang sah, jadi bukan laluan sistem fail cakera tempatan file://http://example.com/context/images/foo.png
)或作为请求参数(例如 http://example.com/context/images?id=1
URL imej perlu memasukkan pengecam imej dalam laluan permintaan (cth. http:// contoh. com/context/images?id=1
). /images/*
Dalam dunia JSP/Servlet, anda boleh meminta servlet mendengar corak URL tertentu, seperti byte[]
或 InputStream
的形式获取,JDBC API 提供 ResultSet#getBytes()
和 ResultSet#getBinaryStream()
< /a> 为此,JPA API 提供@Lob
Imej ialah data binari yang boleh diperoleh daripada pangkalan data sebagai bait[] atau 李>InputStream, JDBC APIbyte[]
或 InputStream
写入响应的 OutputStream
ResultSet#getBytes() dan ResultSet#getBinaryStream()< /a> Untuk melakukan ini, JPA APIContent-Type
响应头也需要设置。您可以通过 ServletContext#getMimeType()
基于图像文件扩展名,您可以通过 web.xml 中的
扩展和/或覆盖该扩展名
InputStream pada respons OutputStream (cara biasa Java IO
.
Pelanggan perlu diarahkan untuk mengendalikan data sebagai imej, jadi sekurang-kurangnya pengepala respons src
Jenis Kandungan perlu ditetapkan juga. Anda boleh mendapatkan jenis yang betul melalui
<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.