Notification update image

coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 24 mai 2010 à 15:20
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010 - 25 mai 2010 à 20:53
bonjour à tous,
mon souci consiste à appeler une servelt qui sert à afficher une image dynamiquement, mais tant de fois l'image est la même donc ça sert à rien de la renvoyer au navigateur tant qu'elle n'a pas changé
c'est pour ça, je veux en premier temps tester si l'image (son nom, son id..n'importe quoi) est modifié, si oui alors une autre requête pour l'afficher sinon on garde l'ancien affichage (ainsi on a gagner quelques ko :) )
bon la première chose qui me vienne à l'esprit est la session
pour commencer,je récupère ma variable mais le hic c'est comment récupérer l'ancienne variable (a laquelle je vais la comparer )??
autre chose, est il différent de faire cette comparaison dans la servlet ou dans la page jsp?

merci d'avance

13 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 mai 2010 à 15:57
Salut,

est il différent de faire cette comparaison dans la servlet ou dans la page jsp


Si tu te poses cette question, c'est que tu n'as pas compris à quoi sert une jsp... La jsp sers à formatter les données en vue d'être interprêté niveau serveur afin de produire du code java qui sera compilé pour enfin générer une page HTML.
Donc si tu veux y mettre du code java, c'est ton choix, mais tu sacrifies la lisibilité, la maintenabilité, la testabilité et l'efficacité... La règle d'or de java : PAS DE CODE JAVA DANS UNE JSP !!!

Tu ne programme pas en java comme tu le fais en php où tu mélange allègrement le code php avec les balises HTML, ce qui rend une page illisible, et encore, quand il n'y a pas de code javascript et des styles css directement au sein de la même page

Donc, oui, c'est différent de faire cette comparaison dans la servlet ou dans la jsp : la servlet est faite pour cà, la jsp ne l'est pas du tout !
Pour ce genre de chose, tu peux même oublier la jsp : elle ne te sert absolument à rien, tu peux tout faire dans la servlet en renvoyant un flux xml ou JSon au navigateur.

Sinon, concernant ton problème, tu peux te baser sur la date de dernière modification par exemple (ce sera bien plus fiable que de se baser sur le nom de fichier (s'il ton fichier est modifié mais non renommé, ta servlet ne verra pas la modification).

Donc tu stockes dans ta session, ou en base de données la date de modification du dernier fichier affiché, et à chaque fois que tu appelle ta servlet, tu compare la dernière date de modification des fichiers avec cette date (récupérée de la session).
______________________________________

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
24 mai 2010 à 16:19
merci merci merci pour l'explication c'est plus clair mnt, sincérement je pensais que la jsp est utile seulement pour eviter que la servlet traine du code html, donc la jsp s'en occupe..

bref,retournons à mon prob!
bah c'est ce que j'ai proposé est de comparer le nom ou la date de modification de l'image avec l'ancienne valeur
mais mon souci que le discours entre le client et le serveur n'est pas toujours le meme, je donne un exp de scénario
c->s:any update for pic?
s->c:yes
c->s: send me last pic
s->c: send last pic
c->s: any update for pic?
s->c: no
c: keep last display

donc est ce que je peux gérer ce scénario?
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
24 mai 2010 à 16:21
apropos l'histoire de stockage en bd, je ça me parait pas pratique de stocker une variable dans toute une bd
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 mai 2010 à 16:41
Salut,

Ce n'est pas stocké 1 image, c'est stocke 1 image pour chaque utilisateur, c'est différent. Après tu fais comme tu veux, c'est à toi de faire ton choix.

Concernant ton scénario, va falloir passer par AJAX niveau client, et non utiliser la bidouille que tu as trouvé, car dans ce cas là, tu seras obligé de renvoyer une image valide.

Je sais bien que tu es frileux pour utilisé AJAX, mais je vois pas comment tu vas pouvoir t'en passer sans sacrifier l'expérience de l'utilisateur.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

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

Posez votre question
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
24 mai 2010 à 17:00
petite correction je suis une fille donc "frileuse"

alors tu trouves que le code jsp de l'autre fois est une bidouille??

je suis pas contre AJAX mais essaie d'ecrire dans google "android ajax" tu trouveras presque rien! donc c'est inutile de s'investir dans une solution qui ne mene à nulle part, tu vois?

a mon avis le premier pas est d'élaborer le scénario décrit dans l'autre post, et je suis entrain d'essayer
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 mai 2010 à 17:13
Salut,

Ben disons que si tu laisse de côté la solution AJAX, tu n'as plus qu'à recharger la page a chaque fois pour demander au serveur si une nouvelle image existe... niveau expérience utilisateur et optimisation de la bande passante, tu peux faire une croix dessus.

AJAX est la solution pour faire des requêtes comme tu le souhaite : une petite requête invisible pour l'utilisateur qui ne fait QUE demander si une nouvelle image existe, et si ce n'est pas le cas, ne fait rien, si c'est le cas, alors affiche la nouvelle image.

Google doit forcément proposer quelque chose dans son sdk (gestion de AJAX, ou une autre façon de faire) pour pouvoir effectuer une requête asynchrone vers un serveur sous android, sinon le genre de chose basique que tu essaye de faire est tout bonnement impossible sans nuire à l'expérience de l'utilisateur.
______________________________________

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
24 mai 2010 à 20:33
salut,
j'ai tant galéré avec ajax mais y a pas grand chose à retenir spécialement pour les images

voici quelques liens, il y en a d'autres

lien
aussi celui la

autre lien

c'est une panoplie de post qui finissent par utiliser la concaténation de la date pour éviter l'image stockée dans le cache

dans je trouve que ajax n'est pas utile dans mon cas
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 mai 2010 à 21:00
Salut,

Ajax, c'est juste pour interroger ton serveur pour savoir s'il y a une nouvelle version ou pas, et si c'est le cas, récupérer l'url de cette nouvelle image, pas pour charger l'image par ajax !

tu envoie une requete, le serveur t'envoie l'url de limage à afficher : si l'url est modifiée, alors le navigateur va la télécharger (pas de problème de cache ainsi avec la bidouille de la date).

je trouve que ajax n'est pas utile dans mon cas


tu veux vraiment pas l'utiliser ! A toi de voir les autres alternatives... tu verras vite que tu n'a guère le choix.
______________________________________

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
24 mai 2010 à 21:09
le hic que mon src de l'image est une url d'une SERVLET
donc je pointe pas sur une image précise
de plus comment je peux interroger le serveur par le biais d'ajax s'il l'image est modifié ou 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
24 mai 2010 à 21:49
Salut,

C'est là toute la subtilité : au lieu de faire pointer l'url de ton image vers une servlet (donc l'url ne change jamais, donc mise en cache, donc jamais rechargée, donc bidouille avec une date), tu l'a fait pointer vers une vraie url d'une image qui existe : c'est la servlet qui t'indique l'url sur laquelle pointer.

Au premier chargement : la servlet te remplie ta jsp avec l'url de la dernière image mise à jour.
Pour les appels ajax, elle te renvoie soit l'ancienne url (déjà mise en cache, donc non rechargée) soit une url pointant vers la nouvelle image, et là, tu n'as plus qu'à l'appliquer en javascript, et ton navigateur la téléchargera et l'affichera automatiquement.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
24 mai 2010 à 21:53
Salut,

Sinon, au pire, ta bidouille de pointer l'url de l'image vers une servlet peut peut-être fonctionner en lui passant en paramètre une nombre incrémenté (une date par exemple), mais là cà devient encore plus de la bidouille, et ca te chargera à chaque fois une image (perte en bande passante, surtout si tu as de nombreux clients connectés en même temps et que tes images prennent pas mal de place, et en plus, la connexion du téléphone client va s'en ressentir).
______________________________________

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
24 mai 2010 à 22:06
merci pour la réponse
oui en fait mon code est fonctionnel :
 /SlideServlet" alt="slider">
 <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>


j'ai le refresh de l'image dynamiquement c nickel
mais je veux optimiser, c a d je veux réaffichier l'image seulement si elle est modifiée, sinon je laisse l'affichage de l'ancienne, c'est pour cette raison je dois interroger le serveur s'il y a un update ou non

alors fixons les idées:
1)
/SlideServlet/image.png" alt="slider">

(je dois pointer sur le meme nom d'image et jouer sur la date de modification?
2) appel ajax pour récuperer l'url

pfff la démarche à suivre me semble un peu floue
0
coccolata Messages postés 86 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 26 mai 2010
25 mai 2010 à 20:53
j'ai laissé tomber ajax car vraiment y a pas d'issue
j'ai essayé de surcharger la methode getLastModified afin de jouer sur le cache (s'il n'y a pas une nouvelle image alors affichage de celle dans le cache)

protected  long getLastModified(HttpServletRequest req) {

  return (lastSlide==null) ? -1 : lastSlide.lastModified();
}
 


et dans la doGet:

 
.....
long  lastModified = getLastModified(request);
       long ifModifiedSince = request.getDateHeader("If-Modified-Since");
       if (ifModifiedSince != -1 && lastModified < ifModifiedSince + 1000)
        {    
   response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
   return;
  }

         // Init servlet response.---------------------------------------------------------------
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType("image/png");
        response.setHeader("Content-Length", String.valueOf(lastSlide.length()));
        response.setHeader("Content-Disposition", "inline; filename="" + lastSlide.getName() + """);
       
       response.setDateHeader("Last-Modified", lastModified);
        
        
        // Prepare streams.
        BufferedInputStream input = null;
        BufferedOutputStream output = null;
 
       ....


mais mon souci mnt est que ifModifiedSince prend toujours la valeur -1 ce qui fait n'entre jamais dans la boucle if
0
Rejoignez-nous