Affichage dynamique et périodique d'images dans une jsp à partir d'une servlet

Résolu
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 15 mai 2010 à 00:19
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 18 mai 2010 à 16:06
bonsoir, je débute avec tomcat et les servlets..et voila la galère commence!!!
dans un autre post ils m'ont affirmé la faisabilté de ce que je compte faire mais en pratique, du coup je me bloque

un logiciel qui fait des captures ecran automatiquement chaque n secondes, sauvegarde ces captures dans un repertoire au choix en les attribuant comme nom date heure ou numero

ce que je veux réaliser est d'afficher ces captures dans mon navigateur au fur et a mesure de leurs création (une fois une caputre est faite -> elle s'affiche)

le problème réside:
comment détecter q'une nouvelle capture est ajouté dans le repertoire?
et dans la page jsp comment faire un appel périodique a ma servlet

j'ai trouvé plusieurs tutoriaux, mais tous ciblent des images bien définies qui n'est pas le cas pour moi

voila mon essai:

servlet:
package com.pfe.slide;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLDecoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * The Image servlet for serving from absolute path.
 * @author BalusC
 * @link http://balusc.blogspot.com/2007/04/imageservlet.html
 */
public class SlideServlet extends HttpServlet {

    // Constants ----------------------------------------------------------------------------------

    private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.

    // Properties ---------------------------------------------------------------------------------

    private String imagePath;

    // Actions ------------------------------------------------------------------------------------

    public void init() throws ServletException {

        // Define base path somehow. You can define it as init-param of the servlet.
        this.imagePath = "\images";

        // In a Windows environment with the Applicationserver running on the
        // c: volume, the above path is exactly the same as "c:\images".
        // In UNIX, it is just straightforward "/images".
        // If you have stored files in the WebContent of a WAR, for example in the
        // "/WEB-INF/images" folder, then you can retrieve the absolute path by:
        // this.imagePath = getServletContext().getRealPath("/WEB-INF/images");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
        // Get requested image by path info.
        String requestedImage = request.getPathInfo();
// je pense que cette ligne est inutile puisque je n'ai pas une image précise à récupérer

        // Check if file name is actually supplied to the request URI.
        if (requestedImage == null) {
            // Do your thing if the image is not supplied to the request URI.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Decode the file name (might contain spaces and on) and prepare file object.
        File image = new File(imagePath, URLDecoder.decode(requestedImage, "UTF-8"));

        // Check if file actually exists in filesystem.
        if (!image.exists()) {
            // Do your thing if the file appears to be non-existing.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            //response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404
        	image = new File(imagePath, "default.gif");

            return;
        }

        // Get content type by filename.
        String contentType = getServletContext().getMimeType(image.getName());

        // Check if file is actually an image (avoid download of other files by hackers!).
        // For all content types, see: http://www.w3schools.com/media/media_mimeref.asp
        if (contentType == null || !contentType.startsWith("image")) {
            // Do your thing if the file appears not being a real image.
            // Throw an exception, or send 404, or show default/warning image, or just ignore it.
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }

        // Init servlet response.
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(image.length()));
        response.setHeader("Content-Disposition", "inline; filename="" + image.getName() + """);

        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;

        try {
            // Open streams.
            input = new BufferedInputStream(new FileInputStream(image), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

            // Write file contents to response.
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            // Gently close streams.
            close(output);
            close(input);
        }
    }

    // Helpers (can be refactored to public utility class) ----------------------------------------

    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                // Do your thing with the exception. Print it, log it or mail it.
                e.printStackTrace();
            }
        }
    }


}




jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>

Test



</html>




web.xml:
<!DOCTYPE web-app PUBLIC
  '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN'
  'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
  <servlet>
    <servlet-name>SlideServlet</servlet-name>
    <servlet-class>com.pfe.slide.SlideServlet</servlet-class>
  </servlet>
 
  <servlet-mapping>
    <servlet-name>SlideServlet</servlet-name>
    /SlideServlet
  </servlet-mapping>
</web-app>




pouvez vous m'aider??

merci d'avance

29 réponses

coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 10:13
toute cette galère à cause d'une betise

en fait j'ai oublié: extends HttpServlet

merci encore pour ton aide DARKSIDIOUS
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 10:16
ah j'ajoute un truc, dans le navigateur on appelle directement la servlet car l'appel de la page jsp n'a pas fonctionné...
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 mai 2010 à 10:23
Salut,

Une page jsp n'est pas censée être appelée directement, c'est la servlet qui va charger les données, et la jsp va s'en servir pour l'affichage.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 10:33
dans mon cas je dois l'appeler directement parce qu'il fallait que je fasse un refresh de la page pour passer à l'image suivante...
et bien sur je peux pas imposer au client de faire un refresh manuellement

tu peux jeter un coup d'oeil sur ce lien?

You can't1 return both in the same response, since you're returning different types (an HTML page of type text/html and an image of type image/jpeg, say).


donc si l'image ne s'affiche par en appellant la page jsp c'est à cause du contentType qui doit etre "image/png" et non pas "text/html"

j'ai fait les modifs necessaires:

<%@page contentType="image/png" pageEncoding="UTF-8"%>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


ça fonctionne en local mais dans une autre machine ça marche pas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 mai 2010 à 10:39
Salut,

Il faut que tu fasse une servlet qui renvoie vers ta page jsp (et qui déclenche ton thread), et un appel ajax régulièrement dans ta jsp en question afin de charger les nouvelles images.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 10:50
j'ai pas bien compris ton idée, en fait ce que j'ai fait est de rafraichir la page jsp en attribuant dans le src de l'image l'url de la servlet..

si tu as noté j'ai optimisé mon code et j'utilise plus le thread, en fait c'est inutile (il suffit de mettre les images dans un tableau de fichier et le trier selon la dernière modification.. )

pour ajax je pense pas que c'est une bonne idée parce que mon application réelle est un client Android, cette servlet est just pour gerer l'histoire coté serveur, bref android et ajax, je pense pas
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
18 mai 2010 à 11:01
Salut,

Comment veux-tu rafraichir l'image sans passer par AJAX ???

Ce n'est pas en mettant l'url de la servlet dans le src de ton image qu'il va te rafraîchir automatiquement l'image : le src sera evalué une seule fois au chargement de la page, et c'est tout ! Il te faut faire toi même une requête au serveur à chaque fois que tu veux rafraîchir ta page (et là, rien de mieux que AJAX pour faire cà de façon totalement invisible pour l'utilisateur).

Tu pense qu'android ne gère pas AJAX ? Quel serait l'intérêt d'android alors ? S'il ne gère pas l'ajax, alors autant ne pas faire de navigateur sous android, car il servira pas à grand chose avec le web actuel qui est de plus en plus dynamique.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 11:05
en fait ma page web contient seulement une image!!
c'est pour ça je me ne suis pas intéressée à AJAX puisque il me suffit de rafraichir la page entière par:
<META http-equiv="Refresh" content="4">
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
18 mai 2010 à 16:06
il suffit d'utiliser ce code dans la jsp, ça fonctionne


<%-- 
    Document   : slider
    Created on : 18 mai 2010, 13:38:14
    Author     : jowo
--%>
 
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
 
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Conference's slides</title>
    </head>
 
    
        /SlideServlet" alt="spider">
        

        Hello ! The time is now   <%=new java.util.Date()%>
        <script type="text/javascript">
            var img = document.getElementById("slider");
            if (img) {
                var srcImage = img.src;
                var fct = function() {
                    img.src = srcImage+"?_="+new Date().getTime();
                };
                setInterval(fct, 2500);
            }
        </script>
    
</html>


merci encore une fois DARKSIDIOUS
0
Rejoignez-nous