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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 chevronné 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
    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 averti
    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
    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 )?

  4. #4
    Membre averti
    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
    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

  5. #5
    Membre averti
    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
    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??

  6. #6
    Membre averti
    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
    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.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    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.

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