Récupérer et afficher des images d'une base de données dans une page JSP : un guide étape par étape
P粉191610580
P粉191610580 2023-08-27 21:30:22
0
1
710
<p>Comment récupérer et afficher des images de la base de données dans une page JSP ? </p>
P粉191610580
P粉191610580

répondre à tous(1)
P粉251903163

Voyons ce qui se passe étape par étape :

  • JSP est essentiellement une technologie d'affichage conçue pour générer une sortie HTML.
  • Pour afficher une image au format HTML, vous avez besoin de l'élément HTML .
  • Pour qu'il positionne une image, vous devez spécifier son attribut src.
  • L'attribut
  • src 属性需要指向有效的 http:// doit pointer vers une URL http:// valide, donc pas vers un chemin du système de fichiers du disque local file://
  • car cela ne fonctionnera jamais lorsque le serveur et le client s'exécutent sur des machines physiquement différentes. marchera.
  • http://example.com/context/images/foo.png)或作为请求参数(例如 http://example.com/context/images?id=1Les URL d'image doivent inclure l'identifiant de l'image dans le chemin de la requête (par exemple
  • http://example.com/context/images/foo.png) ou en tant que paramètre de requête (par exemple http:// exemple.com/context/images?id=1).
  • /images/*Dans le monde JSP/Servlet, vous pouvez demander à un servlet d'écouter un modèle d'URL spécifique, tel que
  • /images/*, afin que vous puissiez exécuter du code Java sur une URL spécifique.
  • byte[]InputStream 的形式获取,JDBC API 提供 ResultSet#getBytes()ResultSet#getBinaryStream() 为此,JPA API 提供@LobLes images sont des données binaires qui peuvent être obtenues à partir de la base de données sous la forme byte[] ou 李>InputStream, API JDBC
  • fournit byte[]InputStream 写入响应的 OutputStreamResultSet#getBytes() et ResultSet#getBinaryStream() Pour ce faire, API JPA
  • Fourni
  • @Lob pour cela. Content-Type 响应头也需要设置。您可以通过 ServletContext#getMimeType() 基于图像文件扩展名,您可以通过 web.xml 中的 扩展和/或覆盖该扩展名
  • Dans une servlet, il vous suffit d'écrire ceci
byte[] ou

InputStream dans le OutputStream de la réponse (de la manière habituelle Java IO

.

Le client doit être invité à gérer les données comme une image, donc au moins l'en-tête de réponse srcContent-Type doit également être défini. Vous pouvez obtenir le type correct via

ServletContext#getMimeType()🎜 En fonction de l'extension du fichier image, vous pouvez étendre et/ou remplacer l'extension via 🎜 dans 🎜web.xml. 🎜 🎜 🎜C’est comme ça que ça devrait être. Il écrit quasiment le code lui-même. Commençons par HTML (en 🎜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">
🎜Si nécessaire, vous pouvez également utiliser les paramètres dynamiques 🎜EL🎜 🎜="https://stackoverflow.com/tags/jstl/info">JSTL🎜 : 🎜
<c:forEach items="${imagenames}" var="imagename">
    <img src="${pageContext.request.contextPath}/images/${imagename}">
</c:forEach>

Ensuite, définissez/créez un servlet qui écoute sur /images/*, l'exemple suivant utilise JDBC simple pour faire le travail :

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

}

C'est tout. Si vous vous inquiétez des en-têtes HEAD et du cache et que vous répondez correctement à ces demandes, utilisez ce Modèle abstrait pour les servlets de ressources statiques.

Voir aussi :

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal