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 :

Appel d'une JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par d�faut Appel d'une JSP
    Bonjour � tous,

    Cela fait maintenant plusieurs jours que je me casse la t�te, sans grand r�sultat...

    Je d�veloppe actuellement une appli JEE / Struts 2.

    A l'inscription, j'ai une action qui se charge d'envoyer un mail � l'utilisateur, et une JSP qui affiche le r�sultat (mail correctement envoy� ou erreur).

    Plutot que de g�n�rer le contenu du mail dynamiquement dans l'action (comme ce qui est fait actuellement), je souhaiterais g�n�rer le contenu du mail en passant par une JSP (puisque celles-ci sont justement con�ues pour la g�n�ration de code).

    En gros ce que je voudrais donc faire :
    1 - L'utilisateur appel l'action
    2 - Je cr�e une response fictive qui appel la JSP pour g�n�rer le mail (r�ponse qui ne sera donc jamais envoy�e au client, mais juste utilis�e pour r�cup�rer le code g�n�r� par la JSP)
    3 - J'envois le mail avec le code g�n�r� au destinataire
    4 - L'action forward sur la JSP normalement

    Quelqu'un aurait-il une id�e de la mani�re dont il faut proc�der ?

    J'ai essay� ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    RequestDispatcher rd =  request.getSession().getServletContext().getRequestDispatcher("/jsp/generateMailContent.jsp");
     
    HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request);
     
    rd.include(wrapper, response);
     
    String mailContent = response.toString();
     
    /* Envoit du mail ici OK */
     
    response.reset();
     
    return SUCCESS;

    Je r�cup�re bien le r�sultat dans mailContent, mais un message d'erreur appara�t lors du forward de l'action :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    java.io.IOException: Stream closed
    	org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:204)
    	org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:115)
    	org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:173)
    	org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:956)
    Merci d'avances.

  2. #2
    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
    Je suppose que c'est sur le reset() que tu provoques l'erreur mais dans l'absolu, je ne comprends pas ta fa�on de faire.
    Pourquoi passer par une JSP, c'est plut�t con�u pour g�n�rer du html ? Il y a une raison ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par d�faut
    OButterlin,

    M�me sans le reset, l'erreur est la m�me.

    Pourquoi passer par une JSP ? Eh bien simple. Il est possible d'envoyer des mails au format HTML (mise en forme, image...), ce qui est bien plus convivial que des mails en mode texte classique.
    Et je d�sire g�n�rer le contenu du mail (html donc) via une servlet JSP, plutot que de faire "le bourrain" et tout g�n�rer dans l'action, ce qui est beaucoup plus propre � mon go�t !

    Second point, il est possible dans mon application d'envoyer des messages automatiques aux utilisateurs. Ces messages seront en code HTML directement visionnable sur le site. M�me interet ici a g�n�rer du code HTML � partir d'une JSP.

  4. #4
    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
    Je comprends le besoin, si les jsp sont plus simples pour toi pour g�n�rer le contenu du message qu'un formatage par code, pourquoi pas...

    En tout cas, tu ne r�cup�reras pas le contenu par response.toString() (ou alors on n'a pas le m�me comportement), tu auras avec ce code quelque chose dans le genre
    org.apache.catalina.connector.ResponseFacade@491a4f
    Il faudrait passer par un tag (TagLib) impl�mentant BodyTagSupport et englober le contenu de ta jsp dans ce tag (+ le fichier tld qui va bien) pour envoyer (via request.setAttribute par exemple) le r�sultat � la servlet appelante.

    J'ai fait un test, �a fonctionne.

    Ceci dit, ton erreur de stream closed est inexpliqu�e...
    Que fait la page jsp de formatage au juste ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par d�faut
    Merci pour ta r�ponse.

    J'ai fait d'autres test, et proc�de comme ceci :


    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
    HttpServletResponse newResponse = new FictiveHttpServletResponse((HttpServletResponse) response);
     
    RequestDispatcher rd =  request.getSession().getServletContext().getRequestDispatcher("/jsp/generateMailContent.jsp");
     
    rd.forward(request, newResponse);
     
    // Message OK
    System.out.println(">>>>> Code HTML récupéré : " + newResponse.toString());
     
    //-- SCENARIO 1 : ne fonctionne pas --//
    return SUCCESS;
    //-- Fin SCNENARIO 1 --//
     
    //-- SCENARIO 2 : fonctionne --//
     
    RequestDispatcher rd =  request.getSession().getServletContext().getRequestDispatcher("/jsp/inscriptionOK.jsp");
     
    rd.forward(request, response);
     
    return null;
    //-- Fin SCNENARIO 2 --//


    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
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
     
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
     
    public class FictiveHttpServletResponse extends HttpServletResponseWrapper {
    	private StringWriter replacementWriter;
     
    	public FictiveHttpServletResponse(HttpServletResponse response) {
    	    super(response);
     
    	    replacementWriter = new StringWriter();
    	  }
     
    	  public PrintWriter getWriter() throws IOException {
    	    return new PrintWriter(replacementWriter);
    	  }
     
    	  public String toString() {
    	    return replacementWriter.toString();
    	  }
    }


    Le second sc�nario fonctionne bien. Le probl�me c'est qu'on dirait qu'il ne connais plus le forward vers le r�sultat SUCCESS, et qu'il faille donc faire un forward manuel pour terminer l'action...

    Il semblerait donc que le premier rd.forward(request, newResponse) modifie quelque chose dans l'objet request, qui emp�che par la suite Struts 2 de forwarder vers son r�sultat...

  6. #6
    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
    Une question en passant : le "newResponse.toString()" te renvoie le contenu html de la r�ponse ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par d�faut
    Oui puisque la m�thode de ma classe FictiveHttpServletResponse contient la m�thode :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    public String toString() {
    	    return replacementWriter.toString();
    	  }

  8. #8
    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
    Je n'avais pas fait attention (et jamais vu cette utilisation).
    Je pr�f�re pour ma part la solution "tag" qui me para�t plus simple mais �a ne remet pas en cause ton choix

    Pour le fond du probl�me, il semble bien que ce soit struts 2 qui fait quelque chose sur le request/response en cours... mais comme je n'utilise pas struts 2 (je n'adh�re pas), je ne te serai d'aucune aide... d�sol�
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti
    Inscrit en
    Janvier 2009
    Messages
    46
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 46
    Par d�faut
    Humm effectivement, la solution du tag est tout aussi interessante.
    H�las elle ne r�soud pas non plus mon probl�me...

    De toute mani�re, comme la solution me para�t laborieuse, j'ai d�cid� de passer par des fichiers properties afin des stocker les mails / messages.

    Cependant si quelqu'un a une solution, je serais ravis de l'entendre ^^

    Et encore merci OButterlin pour ton aide

Discussions similaires

  1. appel d'une jsp en r�seau local
    Par yasinfo dans le forum Servlets/JSP
    R�ponses: 1
    Dernier message: 10/05/2009, 14h20
  2. r�cup�rer une variable apr�s appel asynchrone � une jsp
    Par troussepoil dans le forum Servlets/JSP
    R�ponses: 9
    Dernier message: 29/08/2008, 14h07
  3. [Ajax appel d'une Jsp] Probl�me sauvegarde informations
    Par Iphelias dans le forum Servlets/JSP
    R�ponses: 11
    Dernier message: 17/07/2007, 11h28
  4. Appel d'une jsp contenue dans un JAR
    Par shaun_the_sheep dans le forum Servlets/JSP
    R�ponses: 10
    Dernier message: 22/09/2006, 09h37
  5. [Pl/Sql] Appel d'une jsp dans une procedure
    Par shaun_the_sheep dans le forum Oracle
    R�ponses: 7
    Dernier message: 21/04/2006, 08h13

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