IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Web en Java Discussion :

[Stratégie] Animation de chargement pendant l'affichage des pages


Sujet :

Développement Web en Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut [Stratégie] Animation de chargement pendant l'affichage des pages
    Bonjour,

    Je travaille sur une application J2EE et certaines pages mettent parfois quelques secondes à s'afficher en raison de traitements conséquentes avec un BD volumineuse.

    J'aurais donc voulu mettre une animation de chargement pendant que la page ou le cadre en question se charge, afin d'empecher l'utilisateur de cliquer partout pendant ce laps de temps.

    Il faudrait que cette mise en place soit la plus simple et la plus souple possible

    Merci d'avance pour votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    Il y a un truc qui permet de faire ça, mais c'est plutôt "costaud". Prêt?

    1. L'idée est d'utiliser un thread pour lancer le traitement. La référence du thread est placée en session.

    2. Pendant ce temps, le serveur renvoie une page html avec une barre de chargement.

    3. Cette page contient du code javascript (peut-être y a-t-il un en-tête html qui le permet) qui fait une nouvelle requête au bout de quelques secondes.

    4. Quand le serveur reçoit cette requête, il va voir ou en est le thread (c'est pour ça qu'on a mis sa référence en session.) Si le traitement est fini, victoire! Il renvoie le résultat. Sinon, retour à l'étape deux en mettant à jour la barre de chargement.

    C'est faisable avec une servlet. Bon courage!

  3. #3
    Membre émérite Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Par défaut
    Peux-tu préciser les technos utilisées ?

    Avec Struts j'avais trouvé un LongWaitRequestProcessor par exemple, avec JSF ça doit pas être très compliqué, etc...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut
    Merci pour vos réponses

    @BugFactory, cela va être très compliqué à généraliser

    @remika, ni Struts, ni JSF, il s'agit d'un ancien framework de 2001 (un peu l'ancêtre des deux).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut
    En fait, je pensais plutôt à un truc du côté du web (jsp, html, js)

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    Ajax et la classe Javascript XMLHttpRequest ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut
    Oui, je regarde à ce sujet depuis longtemps, mais j'ai du mal avec la mise en pratique.

    Ok, je peux faire une requête vers le serveur.
    Ok, je peux attendre son résultat.

    Mais je fais une requête de quoi ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    La page contient l'animation d'attente. Le code javascript effectue des requêtes à intervalles réguliers pour voir si le serveur a terminé sa tâche de fond. Quand c'est le cas, affiche les résultats. C'est en fait équivalent à ma première proposition, mais avec Ajax.

    Si vous souhaitez afficher une animation pendant le chargement, vous devrez envoyer une page d'attente sans attendre le résultat, puis afficher les résultats quand ceux - ci seront près. En client serveur HTTP, l'initiative de la connexion ne peut venir que du client, et le seul mode de communication est la requête HTTP. C'est donc à lui de faire des vérifications à intervalles réguliers.

    Vos alternatives sont les applets java (que le serveur peut prendre l'initiative de contacter) ou Flash (que je ne connais pas personnellement). Mais ces solutions nécessitent que le client ait le plugin aproprié sans parler des temps de développement.

    Donc à moins de trouver un composant existant, vous devrez probablement implémenter cette solution.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    Je pense à un truc plus simple que je n'ai jamais testé.

    On pourrait avoir une partie de la page en visibility="visible". elle contiendrait tout ce qui est important (partie "infos"). Et une autre partie de la page en visibility="hidden" qui contiendrait un gif ou un truc dans ce genre(partie "attente").

    Quand tu clique sur ton action tu passe la partie "infos" de ta page en hidden et la partie "attente" en visible avec un peu de javascript (pas bien compliqué)

    Ensuite, quand ton serveur à terminé son travail, il ré-affiche la page et en utilisant les valeurs hidden et visible qui sont déclaré en dur dans ta page. Le client va donc afficher la partie "infos" et cacher la partie "attente".

    Donc à priori tu une animation d'attente assez simple à implémenter. C'est pas aussi propre qu'avec ajax mais ça peut faire l'affaire.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    Oui, mais comme je le disais plus haut, le serveur ne peut pas prendre l'initiative de réafficher la page, c'est le client qui doit vérifier de temps en temps.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 28
    Par défaut
    L'idée du Thread de BugFactory me parait pas mal.
    Combinant ça à :
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="refresh" content="0; URL=/controleurTravaux?workID=monJob">
    qui renvoie la meme page tant que le job n'est pas fini ou renvoie à une autre dès que c'est terminé.
    2/ XMLHttpRequest & AJAX pour faire la meme chose

    Attention, ces deux solutions dépendent de la config client.

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    Oui, mais comme je le disais plus haut, le serveur ne peut pas prendre l'initiative de réafficher la page, c'est le client qui doit vérifier de temps en temps.
    Quand le serveur renvoie sa réponse au client. il peut demander l'affichage d'une page (forward(), redirect() ) ou meme le réaffichage de la meme page. En demandant l'affichage de la meme page, celle ci va reprendre ses valuers "visible" et "hidden" par défaut dans la page.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    Ce qui est la même chose que ma proposition.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut
    Merci pour toutes vos réponses.
    Je comprends bien tout ceci.

    Mais comment puis-je savoir si le serveur a terminé son travail ou non ?

    Ok, c'est le client qui peut demander, donc chaque dixième de seconde par exemple, je vais interroger le serveur.

    Mais interroger le serveur avec quoi ? C'est cela précisement ma question

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    968
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 968
    Par défaut
    Citation Envoyé par tibouchou
    Ok, c'est le client qui peut demander, donc chaque dixième de seconde par exemple, je vais interroger le serveur.
    Pauvre réseau! Il met plus d'un dixième de seconde à répondre alors une requête tous les dixièmes de seconde ça va faire mal. Partez plutôt sur cinq secondes et modulez selon les besoins.

    Citation Envoyé par tibouchou
    Mais comment puis-je savoir si le serveur a terminé son travail ou non ?

    Mais interroger le serveur avec quoi ? C'est cela précisement ma question
    Quand la servlet reçoit la requête, elle cherche en session la variable "travail en cours". Il y a alors trois solutions :
    - Pas de "travail en cours" en session. Donc c'est la première fois qu'on demande cette page! La servlet crée un nouveau thread qui exécute la tâche. Ce thread est mis en session comme "travail en cours". On renvoie la page de chargement.
    - Il y a déjà un travail en session, et il n'est pas terminé. Donc on renvoie la page de chargement, avec l'animation mise à jour pour refléter l'avancement.
    - Il y a un travail en cours, et il est terminé. Victoire! On renvoie le résultat, et on n'oublie pas d'effacer le "travail en cours" de la session pour nettoyer.

    Vous devriez probablement créer une classe Travail, avec une méthode commencer qui lance le thread, une méthode estTerminé qui renvoie vrai quand on a fini et une méthode getAvancement qui renvoie le pourcentage terminé. C'est une instance de cette classe qui sera mise en session comme "travail en cours".

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 62
    Par défaut
    Ok merci bien pour les explications.

    Je vais essayer ça

    Je vous tiens au courant

Discussions similaires

  1. Réponses: 11
    Dernier message: 27/08/2009, 22h18
  2. [ADSL] Problème d'affichage des pages
    Par adam22 dans le forum Dépannage et Assistance
    Réponses: 9
    Dernier message: 07/12/2005, 14h36
  3. [Outils] [PHPeclipse] : Affichage des pages via le browser
    Par matsri2003 dans le forum Eclipse PHP
    Réponses: 5
    Dernier message: 01/12/2005, 14h40
  4. Réponses: 15
    Dernier message: 15/11/2005, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo