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 :

Récupérer le contenu de "response"


Sujet :

Servlets/JSP Java

  1. #1
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut Récupérer le contenu de "response"
    Bonjour,

    Je crois que le plus simple est d'exposer les faits parce que je ne suis pas certain de la solution.

    J'ai 2 webapps (webapp1 et webapp2) qui possèdent le même context. Dans webapp1, je forward (ou include) une requête à webapp2 par le code suivant :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    String ops ="/orbeon";
    String srv="/xforms-renderer";
    ServletContext opsContext = config.getServletContext().getContext(ops);
    if (opsContext == null) throw new RuntimeException("can't find Orbeon context; tomcat /MYWEBAPP webapp is missing <Context crossContext='true' />");
    RequestDispatcher dispatcher = opsContext.getRequestDispatcher(srv);
    if (dispatcher == null) throw new RuntimeException("can't find Orbeon request dispatcher");
     
    String xform = "mon code XForms";
    request.setAttribute("oxf.xforms.renderer.document", xform);
    try {
    	dispatcher.forward(request, response); // ou include(...);
    } catch (Exception e) {
    	e.printStackTrace();
    }

    Une fois la requête envoyée à webapp2, celle-ci fait un traitement sur le code passé en l'attribut et génère la réponse et la page JSP.

    Le problème c'est que je dois inclure cette réponse dans une page de webapp1 et que là ça n'affiche que le code de webapp2.
    J'ai donc besoin de récupérer le contenu de response et de le modifier (supprimer le head et ne garder que le contenu du body).

    Et là je sèche dessus depuis 3 jours, tout ce que j'essaye n'aboutit pas.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Tu dois créer un nouvel objet HttpServletResponse dans lequel les outputStream pointe vers un buffer et non pas vers le socket réseau. Utilise HttpServletResponseWrapper pour t'aider.

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    C'est déjà une avancée, merci.

    Seulement, à moins que je ne sois vraiment une quiche, je ne vois pas comment récupérer le contenu de l'OutputStream. Apparement c'est possible pour un PipedOutputSteam ou un ByteArrayOutputStream, mais pas pour un ServletOutputStream.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu fournis ton propre serlvetoutputstream qui écrit dans une bytearrayoutputstream.....

  5. #5
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    La seule façon que je vois de faire ça ce serait de surcharger les classes HttpServletResponseWrapper et ServletOutputStream et de réimplémenter toutes les méthodes d'écriture de ServletOutputStream pour qu'il écrive ça dans un ByteArrayOutputStream, c'est de ça dont tu me parles ?

    Bon, si c'est la seule façon de faire je prends, mais c'est pas super propre...

  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
    Citation Envoyé par tchize_ Voir le message
    tu fournis ton propre serlvetoutputstream qui écrit dans une bytearrayoutputstream.....
    J'ai jamais vu ça, tu as un exemple par hasard ?

    Sinon, pour Loceka, tu peux (peut-être) passer par une <iframe> pour la partie gérée par la webapp2.
    Peux-tu expliquer en gros le traitement ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    tu peux (peut-être) passer par une <iframe> pour la partie gérée par la webapp2.
    Peux-tu expliquer en gros le traitement ?
    Oui, je peux passer par une iframe - ça fonctionne tout à fait bien - mais c'est pas dans la "politique de la maison". En gros mon chef n'en veut pas pour des questions d'accessibilité.

    Sinon le traitement c'est que, dans mon appli (webapp1), je crée un formulaire en utilisant la norme xforms, je le passe à orbeon (webapp2) qui le transforme en HTML/JS pour qu'il soit reconnu par les navigateurs actuels.

    Ca ça fonctionne, mais l'intégration dans notre charte graphique (une page de notre site quoi) ça, j'y arrive pas.

    Le processus de va-et-viens entre les webapps est effectué en mettant la notre en crossContext puis en appliquant des filtres sur certains répertoires pointant sur des ressources de la seconde webapp.

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par OButterlin Voir le message
    J'ai jamais vu ça, tu as un exemple par hasard ?

    http://svn.apache.org/viewvc/myfaces...va?view=markup


    http://java.sun.com/javaee/5/docs/ap...putStream.html :
    Provides an output stream for sending binary data to the client. A ServletOutputStream object is normally retrieved via the ServletResponse.getOutputStream() method.

    This is an abstract class that the servlet container implements. Subclasses of this class must implement the java.io.OutputStream.write(int) method.
    http://www.google.be/search?hl=nl&cl...G=Zoeken&meta=

    http://code.google.com/p/njowebapp/s...amWrapper.java


    et enfin, dans la doc officielle de sun:
    public class HttpServletResponseWrapper
    extends ServletResponseWrapper
    implements HttpServletResponse

    Provides a convenient implementation of the HttpServletResponse interface that can be subclassed by developers wishing to adapt the response from a Servlet. This class implements the Wrapper or Decorator pattern. Methods default to calling through to the wrapped response object.
    Bref, tout est fait pour faire ainsi, on subclass servletoutputstream en implémentant le write et on utilise le wrapper pour retourner notre prpore instance de de HttpServletResponse.

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    par contre, balader les données entre 2 contextes.... là çà sent mauvais, et effectivement je préfèrerais utiliser un get sur une url locale et utiliser le retour du get dans la servelt principale (bref la premier webapp deviens le client de la 2ème)

  10. #10
    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
    Citation Envoyé par tchize_ Voir le message
    http://svn.apache.org/viewvc/myfaces...va?view=markup


    http://java.sun.com/javaee/5/docs/ap...putStream.html :

    http://www.google.be/search?hl=nl&cl...G=Zoeken&meta=

    http://code.google.com/p/njowebapp/s...amWrapper.java


    et enfin, dans la doc officielle de sun:


    Bref, tout est fait pour faire ainsi, on subclass servletoutputstream en implémentant le write et on utilise le wrapper pour retourner notre prpore instance de de HttpServletResponse.
    Merci, j'ai fait une rapide recherche sur le net, j'ai trouvé un exemple de mise en oeuvre, si ça intéresse quelqu'un...
    http://www.orionserver.com/tutorials/filters/3.html

    Je testerai plus tard.

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Bon, ben merci beaucoup

    J'ai pas encore testé mais je pense que ça résoudra mon problème.

    EDIT:
    Bon, ça marche vraiment ! (non pas que j'en doutais, mais ça fait toujours plaisir)

    Merci tchize_ !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer le contenu d'une variable quotée
    Par wayat91 dans le forum VBScript
    Réponses: 3
    Dernier message: 04/03/2011, 11h01

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