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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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