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 :

est-ce que RequestDispatcher.forward met fin à l'execution de la servlet appelante?


Sujet :

Servlets/JSP Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut est-ce que RequestDispatcher.forward met fin à l'execution de la servlet appelante?
    Bonjour tout le monde,

    J'ai une petite question concernant la methode RequestDispatcher.forward.
    Si j'appelle celle-ci à partir d'une servlet par exemple, est-ce que cet appel mettra fin à l'execution de ma servlet? Plus exactement, est-ce que le code de la servlet situé après l'appel du forward sera pris en compte ou non?

    En fait je connais pas trop l'enchainement qui suit l'appel d'un forward:
    -Est-ce qu'on quitte definitivement la servlet pour aller executer la cible du forward?
    -Ou est-ce qu'on quitte temporairement la servlet pour aller executer la cible du forward pour revenir enfin executer le reste du code de la servlet?
    -Ou bien le reste du code de la servlet ainsi que la cible du forward sont executés parallèlement?

    Merci à tous!

  2. #2
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    Un RequestDispatcher peut être employé pour faire suivre la requête à une autre ressource, ou pour inclure la réponse d'une autre ressource dans celle de la ressource courante. Pour faire suivre une requête, utilisez la syntaxe :

    void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOEception

    Cette méthode confiant la création de la réponse à une autre ressource, la servlet appelante ne doit pas avoir déjà écrit des données dans la réponse. Dans le cas contraire, cette méthode lance une exception. De plus, lorsque la ressource recevant la requête aura terminée son traitement, la réponse sera complète. La servlet appelante ne doit donc pas non plus tenter d'écrire des données dans la réponse après le retour de la méthode forward().

    Donc, on ne quitte pas définitivement la servlet appelante. Cependant, un include parait mieux adapter si tu as d autre traitement a faire avec la reponse car si tu essaie de modifer la réponse apres un forward, tu aura une exception. et de meme si tu essaie d'ecrire dans la réponse AVANT d'appeller la seconde servlet.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Citation Envoyé par lam3allam Voir le message
    -Est-ce qu'on quitte definitivement la servlet pour aller executer la cible du forward?
    NON

    Citation Envoyé par lam3allam Voir le message
    -Ou est-ce qu'on quitte temporairement la servlet pour aller executer la cible du forward pour revenir enfin executer le reste du code de la servlet?
    OUI

    Citation Envoyé par lam3allam Voir le message
    -Ou bien le reste du code de la servlet ainsi que la cible du forward sont executés parallèlement?
    NON

    Ce mécanisme permet par exemple de générer une page d'attente :

    - dans la servlet on fait un forward à l'utilisateur d'une page temporaire "traitement en cours"
    - on flag que le traitement est commencé en session
    - on exécute le traitement
    - on flag que le traitement est fini en session

    Quand le traitement est terminé, le forward se fait sur la page réelle.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Yes,

    j'avais effectivement lu sur la page de documentation de Sun que si le buffer de la reponse était deja commité (commited ou flushed) avant l'appel du forward, une IllegalStateException est lancée. Sinon, le contenu du buffer de la réponse est effacé pour être ensuite reconstruit par la cible du forward (tu me corrigeras si je me trompe). Par contre la page n'a rien cité au sujet de la reponse apres le retour du forward.

    En ce qui me concerne, je n'essaie pas de modifier la réponse apres le retour du forward, j'ai juste besoin de liberer quelques ressources (liberer la session hibernate par exemple).

    Ceci étant, j'ai toujours besoin de savoir l'enchainement qui suit l'appel du forward:

    -Est ce que la servlet appelante attend le retour du forward pour reprendre le code restant.
    -Ou est ce que la cible du forward ainsi que le reste du code de la servlet sont executés parallèlement (ou pseudo-parallèlement pour faire plaisir aux puristes )?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Pardon Duc Lebowski, j'avais posté mon dernier message avant que tu ne postes le tien, j'avais donc pas encore lu ta reponse, Merci

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Merci déjà pour les réponses qui ont été faites

    J'aimerais savoir davantage sur l'astuce de la page d'attente:

    Dans la servlet appelante, quel est l'état des objets ServletRequest et ServletResponse apres le retour du forward, et est-ce qu'il est possible d'appeler un second forward à partir de la meme servlet vers la page réelle?

    Est ce que c'est comme ca que ca se passe??

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    En fait l'origine de toutes mes questions est le passage d'un bouquin que je lisais au sujet d'hibernate (hibernate in Action).

    Le passage en question portait sur le code utilisé dans une servlet. Ce code contient un bloc try dans lequel on recupère une session hibernate avec laquelle on effectue les traitements voulus, puis on effectue un forward vers une page de resultats; un bloc catch pour les exceptions lancées, puis un bloc finally pour fermer la session hibernate (avec un session.close()).
    Jusqu'ici, tout va bien.

    Dans le commentaire portant sur les faiblesses de ce code, on a cité que, le temps d'aller executer la jsp cible, la session sera déjà fermée et ne sera pas exploitable dans la jsp. Le texte original du bouquin est le suivant: "By the time we get to the JSP, the Hibernate session is already closed".

    Ce qui me met en confusion, c'est que la fermeture de la session hibernate se fait en dernier lieu dans le bloc finally, elle ne précède pas l'execution du forward. C'est pourquoi je me demandais si le reste du code de la servlet ainsi que la cible du forward s'executaient parallèlement.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Citation Envoyé par lam3allam Voir le message
    le temps d'aller executer la jsp cible, la session sera déjà fermée
    Je ne suis pas un pro d'hibernate mais je ne serai pas très surpris qu'ils aient mis en place un timeout sur la session. Sil elle n'est pas utilisée pendant un certain temps elle est fermée.

    Ce n'est qu'une hypothèse mais vu que les 3/4 des développeurs se fichent de faire le bloc finally et de refermer les sessions (c'est aussi vrai pour les connections JDBC ou les flux IO), ils ont peut-être pris les devants...

    En tout cas ce n'est pas lié au contexte JSP/Servlet.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    En fait la session hibernate n'a rien à voir avec la session http, elle ne définit pas de timeout, elle sert principalement à recuperer une connection JDBC et à effectuer des requetes.

    La fermeture d'une session hibernate est comme toute autre instruction java, donc je crois que c'est bien de servlet et de jsp qu'il s'agit et que je poste dans la bonne rubrique; j'essaie juste de comprendre pourquoi cette fermeture de session (qui figure dans la clause finally) s'opere avant la fin de l'execution de la jsp ciblée par le forward (dans la clause try).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    C'est justement de la session hibernate dont je te parles, qui n'a effectivement rien à voir avec la session HTTP. Je parle bien d'un timeout sur la session hibernate

    Quand tu ne fermes pas explicitement une connection JDBC par exemple, au bout d'un certain temps elle expire automatiquement. Je pense que les développeurs d'hibernate ont appliqué le même principe pour la session hibernate... maintenant je n'ai pas les sources d'hibernate sous les yeux donc effectivement je ne pourrai pas te montrer la ligne de code exact qui gère ça...

    Maintenant le plus propre serait quand même de faire le forward après le finally !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    désolé Duc, je l'avais pas compris comme ça
    T'as probablement raison sur ce point
    Mais je ne pense pas que le timeout soit aussi court que ça

    Je commence à croire qu'ils se sont trompés dans leur exemple,
    ce n'est pas l'exemple qu'il fallait pour illustrer leur propos (même si les auteurs du bouquin sont parmi les developpeurs d'hibernate )

    C'est bon, je vais tester ça chez moi, ça fait 1 semaine qu j'ai la flème de le faire

    je te tiens au courant

    thanks for all

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    En fait Duc, j'ai besoin que tu m'explicites un peu plus l'astuce de la page d'attente.

    Comment tu fais pour enchainer tes deux forwards?? parce que JoloKossovar avait mentionné que la réponse était complète au retour d'un forward et qu'il etait pas possible de la modifier, donc pas possible d'appeler deux forward successivement.

    Peut être que ma question est bête ou quelque chose m'echappe

    De toute façon on est la pour aider et apprendre, n'est ce pas

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Non, tu ne peux pas faire 2 forward. Pour faire la page d'attente c'est un peu plus compliqué que ça.

    Il faut que ton premier forward se fasse sur la page d'attente, et que celle-ci demande de se rafraîchir genre toutes les 5 secondes vers la servlet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="refresh" content="5; URL=/monContexte/maServlet">
    et côté servlet, tant que le traitement n'est pas terminé tu forward sur cette même page, qui va à nouveau appeler la servlet, et ainsi de suite...

    jusqu'à ce que le vrai traitement qui tourne derrière soit fini, et là tu forward vers la jsp finale.

    Enfin c'était juste pour évoquer la petite subtilité, aujourd'hui en Ajax on peut faire nettement mieux en ne travaillant que sur certaines zones de la page.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    bien reçu, vraiment pas mal comme truc

    j'étais pas au courant de l'existence du refresh avec le protocole http
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="refresh" content="5; URL=/monContexte/maServlet">
    C'est peut être mieux avec Ajax, j'en ai fait pendant un mois seulement, donc je suis pas tres expert, mais je fais presque toujours la meme chose avec: je récupère du flux xml depuis une servlet et je modifie les éléments de la page html via la proprieté innerHTML; est ce que c'est comme ça que ça se passe??

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Citation Envoyé par lam3allam Voir le message
    je récupère du flux xml depuis une servlet et je modifie les éléments de la page html via la proprieté innerHTML
    Pas seulement mais essentiellement oui

    Mais là c'est un autre sujet !

    ?

Discussions similaires

  1. Est ce que la fin du C est proche ou pas ?
    Par Nasky dans le forum C
    Réponses: 116
    Dernier message: 13/12/2016, 15h23
  2. Réponses: 28
    Dernier message: 02/08/2012, 11h30
  3. Réponses: 28
    Dernier message: 01/08/2012, 15h08
  4. Réponses: 38
    Dernier message: 03/10/2010, 11h03
  5. Réponses: 38
    Dernier message: 03/10/2010, 11h03

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