Maison  >  Questions et réponses  >  le corps du texte

Récupérer et afficher des images d'une base de données dans une page JSP : un guide étape par étape

<p>Comment récupérer et afficher des images de la base de données dans une page JSP ? </p>
P粉191610580P粉191610580419 Il y a quelques jours647

répondre à tous(1)je répondrai

  • P粉251903163

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

    Voyons ce qui se passe étape par étape :

    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/*< URL 模式上的 GET 请求/code>, 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 :

    répondre
    0
  • Annulerrépondre