Forum Programmation.java jsp response.sendRedirect

Posté par  .
Étiquettes : aucune
0
18
avr.
2005
Bonjour , je débute en jsp et j'aurais voulu avoir quelques éclaircissement.

Je souhaite faire des redirections (avec response.sendRedirect("maPage.jsp")) à partir d'une page jsp et en fonction de plusieurs tests (c'est à dire avoir plusieurs sendRedirect précédés de tests...).

J'ai cru comprendre qu'il fallait qu'il n'y ait eu aucun caractère d'écrit dans le flux de sortie avant de faire un sendRedirect. Est-ce vrai? car j'ai l'impression d'en faire et ca me semble bien marcher....

Est-ce que le code suivant le .sendRedirect("") est exécuté? moi, j'ai mis "return;" juste après pour qu'il n'exécute pas la fin de la page. C'est con ou quoi?


Enfin j'ai vu que ce bout code revenait à la même chose :

<jsp:forward page="{relativeURL | <%= expression %>}" >

<jsp:param name="parameterName" value="{ parameterValue | <%= expression %>}" />

</jsp:forward>

si oui, quel est le mieux?


ma configuration est : Tomcat 5.0 => JSP 2.0

merci.
  • # Nein !!!

    Posté par  . Évalué à 2.

    Un forward et un redirect, ce n'est pas la même chose ...

    Le forward est local au moteur de servlet/jsp, le redirect implique le navigateur (cf plus bas).

    - soit www.monsite.com/mapage.jsp
    si cette jsp fait un FORWARD vers "mapage2.jsp" (locale au serveur)
    le navigateur ne le sait pas (lui il voit comme url mapage.jsp)

    si cette jsp fait un redirect alors là le navigateur affichera la nouvelle URL ...


    Forward:
    - le navigateur fait une requête
    - ton moteur servlet / jsp invoque donc une servlet / jsp pour réponde à cette requête
    - cette servlet / jsp fait un forward (vers une autre servlet / jsp locale)
    - ton moteur servlet / jsp invoque alors cette nouvelle servlet / jsp pour produire le résultat (généré le contenu envoyé au navigateur) ...

    Navigateur ---> Tomcat (forward) ---> Tomcat ----> Navigateur

    Redirect:
    - le navigateur fait une requête
    - ton moteur servlet / jsp invoque donc une servlet / jsp pour réponde à cette requête
    - cette servlet / jsp fait un redirect (vers une url locale ou pas), ceci génère une réponse HTTP 301 (moved permanently) contenant l'url cible
    - c'est alors le navigateur qui refait (de façon automatique et caché) une nouvelle requête vers l'url cible ....

    Navigateur ---> Tomcat (redirect) ---> (301) Navigateur ---> Tomcat
    • [^] # Re: Nein !!!

      Posté par  . Évalué à 1.

      Merci pour cette information. Donc, c'est bien sendRedirect que j'ai besoin.


      J'ai l'impression que tout ce qui suit "response.sendRedirect('maPage.jsp')" est tout de même exécuté? faut-il mettre "return;" juste après pour que l'exécution de la page soit arrêtée?

      Ne faut-il vraiment rien envoyer dans le flux de sortie avant de mettre un sendRedirect() ?

      Quand je visionne le code source (index_jsp.java) qui a été généré automatiquement à partir du fichier index.jsp auquel j'ai mis des "response.sendRedirect()", je vois plusieurs "out.write("\n");" avant mes "response.sendRedirect()"... donc j'écrirais quelquechose dans le flux de sortie avant? par contre out.write("....); est positionné après tous mes "response.sendRedirect()"....
      J'avoue qu'il y a pas mal de chose qui m'échappe.
      • [^] # Re: Nein !!!

        Posté par  . Évalué à 2.

        >>J'ai l'impression que tout ce qui suit "response.sendRedirect('maPage.jsp')" est tout de même exécuté?

        Oui, il n'y pas de raison que l'execution s'arrête là, en plein milieu d'une méthode, je ne vois rien d'anormal à cela ...

        On peut imaginer le scénario suivant : tu fais ton redirect, mais en suivant tu (par exemple) envoies un mail, tu provoques des actions en BDDs etc etc

        >> Ne faut-il vraiment rien envoyer dans le flux de sortie avant de mettre un sendRedirect() ?

        Faut vérifier les specs, mais sincèrement je pense que au mieux c'est juste inutile, au pire c'est dangereux ..., donc on va dire que non, il ne faut rien écrire dans le flux de la response avant de faire le sendRedirect ...

        Hope this helps
      • [^] # Re: Nein !!!

        Posté par  . Évalué à 1.

        C'est parce que ce qui est ecrit sur la sortie est bufferise par defaut. Donc tant que le buffer n'est pas plein, rien n'a encore ete envoye au client et le sendRedirect() marche. Sinon tu te prends un IllegalStateException (ou quelque chose dans le genre). Tu peux le verifier, je crois qu'il y a une directive que tu peux mettre au debut de la page pour desactiver le buffer.

        Personnellement, je trouve que mettre des sendRedirect() dans une page JSP est une tres mauvaise idee, justement pour ce probleme la. Si ta page est suffisament longue, et que ton sendRedirect() est tout en bas, il va finir par ne plus marcher le jour ou tu rajouteras une ligne de trop, a cause de tous les out.write("\n") et autres. Bref, ca fait des bugs difficiles a detecter... Et oui, c'est du vecu :)

        Donc le plus sur, c'est de n'utiliser sendRedirect et forward que dans des servlets. C'est pas complique a ecrire, et c'est la que la logique devrait se trouver...

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.