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

Servlets/JSP Java Discussion :

[Servlet] Page d'attente


Sujet :

Servlets/JSP Java

  1. #1
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut [Servlet] Page d'attente
    Bonjour

    Je sais que j'avais posé une question à ce sujet il y a bien longtemps maintenant, mais je me rends compte que la solution que j'ai adopté n'est certainement pas la meilleure.
    Voici ce que j'ai fait.
    Tout part évidemment d'une JSP contenant un formulaire. J'envoie ce formulaire à une servlet. Cette servlet appelle un thread qui fait une opération sur base des paramètres reçus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @SuppressWarnings("unchecked")
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException, MessagingException, InterruptedException {
            ProcessThread pt = new ProcessThread(request.getParameterMap());
            pt.start();
            while(pt.isAlive()){
                Thread.sleep(500);
            }
            TreeMap<String, Integer>errors = pt.getErrors();
            if(shouldRedirect(errors.values())){
                redirect(request, response, "errorVector", errors, "submitJob.jsp");
                return;
            }
            else{
                this.attributes = pt.getAttributes();
                redirect(request, response, "preselect.jsp");
            }
        }
    Or, ce que je voudrais, c'est afficher dans cette servlet un texte d'attente.
    Est-ce possible ?
    Il y a bien les balises meta redirect, mais je ne vois pas trop comment les placer.

    Merci d'avance de votre aide.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Tu ne peux pas le faire de cette manière, car tant que ton thread n'est pas fini, tu n'as pas renvoyé la réponse au navigateur client.

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut
    Bonjour fr1man

    Merci de ta réponse. Mais dans ce cas, quelle solution alternative dois-je prendre ?

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Je pense qu'il faudrait lancer une requête asynchrone (AJAX) à partir de la page qui appelle ta servlet de traitement.
    Tu pourrais afficher un message d'attente (via une div par exemple) et la cacher à la fin de ton traitement)

  5. #5
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 893
    Par défaut
    Hello

    Pas mal, mais, j'oubliais de le mentionner:
    1) Je ne connais pas Ajax (mauvais argument car au moins j'apprendrais )
    2) Je souhaite ne pas trop dépendre de JavaScript (certains de mes clients n'ont pas JavaScript d'activé sur leur browser).
    Merci en tout cas de ta suggestion.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Sans Javascript, tu vas avoir du mal.
    En tout cas, je ne sais pas faire sans.

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par GLDavid Voir le message
    1) Je ne connais pas Ajax (mauvais argument car au moins j'apprendrais )
    2) Je souhaite ne pas trop dépendre de JavaScript (certains de mes clients n'ont pas JavaScript d'activé sur leur browser).
    Et Ajax c'est du JavaScript...



    Une solution serait de passer par les balises META qui permettent de rafraichir la page.
    Dans la servlet on met la référence de notre thread en session, et on gère deux cas :
    • Le thread n'existe pas (premier appel). On le crée et on le met en session avant de le démarrer.
    • Le thread existe déjà en session, et on récupère son instance.


    Ensuite le traitement est le même :
    • Si le thread n'est pas terminé, on renvoi un page d'attente avec un meta pour raffraichir automatiquement.
    • Si le thread est terminé on récupère son résultat et on renvoi la réponse


    Par exemple prenons ce thread qui simule un traitement lent en dormant 10 secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Task extends Thread {
     
    	private volatile String result = null;
     
    	@Override
    	public void run() {
    		try {
    			Thread.sleep(10000); // 10 secondes
    		} catch (InterruptedException e) {
    			throw new RuntimeException(e);
    		}
    		this.result = "Hello World !";
    	}
     
    	public String getResult() {
    		return this.result;
    	}
    }

    La servlet pourrait ressembler à ceci (note : j'écris directement le code HTML dans la servlet pour simplifier, mais il faudrait bien entendu utiliser des JSP pour la présentation ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    public class TestServlet extends HttpServlet {
     
    	@Override
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		// On récupère la session :
    		final HttpSession session = request.getSession();
    		// On récupère la tâche :
    		Task task = (Task) session.getAttribute("task");
    		if (task==null) {
    			// Si elle n'existe pas on la crée et on la lance :
    			task = new Task();
    			session.setAttribute("task", task);
    			task.start();
    		}
     
    		final PrintWriter out = response.getWriter();
    		try {
    			// Si le thread est toujours vivant :
    			if (task.isAlive()) {
    				// On affiche une page de raffraichissement par META
    				out.println("<html>");
    				out.println("<head>");
    				out.println("<meta http-equiv='refresh' content='2'/>"); // toutes les 2 secondes
    				out.println("</head>");
    				out.println("<body>");
    				out.println("<h1>En attente...</h1>");
    				out.println("</body>");
    				out.println("</html>");
    			} else {
    				// Sinon on supprime la tâche de la session
    				session.removeAttribute("task");
     
    				// Et on renvoit le résultat :
    				out.println("<html>");
    				out.println("<body>");
    				out.println("<h1>" + task.getResult() + "</h1>");
    				out.println("</body>");
    				out.println("</html>");
    			}
    		} finally {
    			out.close();
    		}
    	}
     
    }
    a++

  8. #8
    Membre émérite Avatar de Lorantus
    Homme Profil pro
    Consultant développeur indépendant / Java/VB/C(++)/ObjectPal
    Inscrit en
    Août 2007
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant développeur indépendant / Java/VB/C(++)/ObjectPal

    Informations forums :
    Inscription : Août 2007
    Messages : 599
    Par défaut
    Pourquoi pas un javascript simle, avec un time out après un beforeUnload... ?
    Le script affiche un écran grisé, et un text d'attente... avec un genre de barre.gif toujours en mouvement, pour faire patienter...

    Je peux te donner plus d'infos... j'utilise cette méthode pour faire patienter les opérateurs de mes applications. C'est pas mal.. sauf que c'est du virtuel... en cas de perte de connexion, ... et pas d'info de progression fiable sur les longs traitements. Mais pour les envois simple, à quelques secondes, c'est bien.

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Par défaut
    Salut Lorantus, moi je suis preneur de ton petit code javascript

    En fait c'est un script qui s'active lorsque l'utilisateur clique sur le bouton submit d'un formulaire par exemple?

    Qu'est ce qu'il se passe si le javascript est désactivé? Y a une influence ou c'est juste que ça ne s'execute pas et on ressent l'attente entre 2 pages?

  10. #10
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Si tu n'as pas envie de te compliquer la vie, tu peux t'inspirer de cet exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <html>
    <head>
     
    <script language="javascript">
     
    function showWaiting()
    {
        document.getElementById("waiting").style.display = "block";
    }
     
    </script>
    </head>
     
    <body>
     
    <div id="waiting" style="display:none;position:absolute;top:0px;left:0px;width:100%;height:100px;text-align:center;padding-top:50px;background:#f0f0f0;border-style:solid;border-color:#000000;border-width:2px">
    Veuillez patienter, nous traitons votre demande...
    </div>
     
    <form action="http://www.ibm.fr/" onsubmit="showWaiting()">
     
    Champ 1 <input type="text" name="Champ1" value="Test 1"/><br>
    Champ 2 <input type="text" name="Champ2" value="Test 2"/><br>
    <br>
    <br>
    Puis, un autre texte...
    <a href="http://www.oracle.com" onclick="showWaiting()">et un lien vers une autre page</a>
    <br>
     
    <input type="submit" value="Envoyer"/>
    </form>
     
    </body>
    </html>
    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 511
    Par défaut
    J'ai déjà fait quelque chose dans ce style.
    Quand tu submit la première jsp, le serveur te renvoie la page d'attente qui s'auto-submit en lançant ton thread qui une fois terminé te retourne la page traitée. Donc le tout sans js.

  12. #12
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 31
    Par défaut
    Effectivement OButterlin, c'est vraiment tout bete !!! Un petit gif pour patienter et le tour est joué.
    Merci

Discussions similaires

  1. Une petite page d'attente!!!
    Par stoyak dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/03/2006, 10h50
  2. [Système] Creer une page d'attente....
    Par Paulux1 dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2006, 16h56
  3. [Struts] Page d'attente
    Par remika dans le forum Struts 1
    Réponses: 4
    Dernier message: 17/02/2006, 16h34
  4. [STRUTS] Page d'attente
    Par remods dans le forum Struts 1
    Réponses: 1
    Dernier message: 19/10/2005, 13h10
  5. [JSP]Servlet / page html
    Par ana2sb dans le forum Servlets/JSP
    Réponses: 17
    Dernier message: 10/08/2004, 16h10

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