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 :

HTTPClient ouverture document dans une JSP


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé
    Avatar de link256
    Profil pro
    Développeur Java
    Inscrit en
    Février 2003
    Messages
    596
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2003
    Messages : 596
    Points : 642
    Points
    642
    Par défaut HTTPClient ouverture document dans une JSP
    Bonjour,

    A partir d'une jsp j'ouvre un fichier PDF, ce qui s'excute correctement
    avec le code suivant :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <%
     
            System.out.println("lurl pdf :"+urlCodedocPdf);
     
            HttpClient client = new HttpClient();
     
        // Create a method instance.
        org.apache.commons.httpclient.methods.GetMethod method = new org.apache.commons.httpclient.methods.GetMethod(urlCodedocPdf);
        
        // Provide custom retry handler is necessary
        method.getParams().setParameter(org.apache.commons.httpclient.params.HttpMethodParams.RETRY_HANDLER, 
                    new org.apache.commons.httpclient.DefaultHttpMethodRetryHandler(3, false));
     
        try {
          // Execute the method.
          int statusCode = client.executeMethod(method);
     
          if (statusCode != org.apache.commons.httpclient.HttpStatus.SC_OK) {
            System.err.println("Method failed: " + method.getStatusLine());
          }
     
          // Read the response body.
          
                    response.setContentType ("application/pdf");
                    java.io.OutputStream os = response.getOutputStream();
                    try
                    {
                                    InputStream ips = method.getResponseBodyAsStream();
                                    java.io.InputStreamReader ipsr = new java.io.InputStreamReader(ips);
     
                                    byte buffer[] = new byte[512 * 1024];
                                    int nbLecture;
                                    while ((nbLecture = ips.read(buffer)) != -1) {
                                    os.write(buffer, 0, nbLecture);
                            }
                    }
                    catch (Exception e) {
            e.printStackTrace();
    } finally {
            try {
                    os.close();
            } catch (Exception e) {
            }
    }
    Mais il y a un mais ^^
    lorsque mon fichier PDF est enfin ouvert j'obtiens le message d'erreur suivant :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    WebGroup      E SRVE0026E: [Erreur de servlet]-[Flux de sortie obtenu]: java.lang.IllegalStateException: Flux de sortie obtenu
    	at com.ibm.ws.webcontainer.srt.SRTServletResponse.getWriter(SRTServletResponse.java:523)
    	at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:202)
    	at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:193)
    	at org.apache.jasper.runtime.JspWriterImpl.flush(JspWriterImpl.java:246)
    	at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:197)
    	at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:255)
    	at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:249)
    	at org.apache.jsp._OpenDocument._jspService(_OpenDocument.java:248)
    	at com.ibm.ws.webcontainer.jsp.runtime.HttpJspBase.service(HttpJspBase.java:89)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    	at com.ibm.ws.webcontainer.jsp.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:344)
    	at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.serviceJspFile(JspServlet.java:683)
    	at com.ibm.ws.webcontainer.jsp.servlet.JspServlet.service(JspServlet.java:781)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    ...
    ...
    
    	at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(ServletInstanceReference.java:40)
    	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:76)
    	at com.ft.dit.tipi.openged.utils.CharsetFilter.doFilter(CharsetFilter.java:25)	at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:132)
    	at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:71)
    	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispatch(WebAppRequestDispatcher.java:1010)
    	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:592)
    	at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:204)
    	at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:125)
    	at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInvoker.java:286)
    	at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocation(CachedInvocation.java:71)
    	at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(ServletRequestProcessor.java:182)
    	at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSEListener.java:334)
    	at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection.java:56)
    	at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java:615)
    	at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:449)
    	at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:912)
    et au vu de cette pile d'erreurs je n'en vois pas l'origine.
    Quelqu'un aurai-t-il déja rencontré ce type d'erreur ou une piste pour en trouvé l'origine.

    Merci

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    en faisant une recherche sur google, j'ai trouvé ce code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      1. public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
       2.     resp.setContentType("image/gif" );
       3.     BufferedImage image = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
       4.     Graphics2D g2D = (Graphics2D) image.getGraphics();
       5.     g2D.drawString(50, 50, "Coucou" );
       6.     ServletOutputStream output = resp.getOutputStream();
       7.     GifEncoder encoder = new GifEncoder(image, output);
       8.     encoder.encode();
       9. }
    Je pense que le problème vient que la JSP est sensée retournée un flux "texte" et toi, tu retournes un flux PDF... dans la même réponse...
    Pourquoi ne fais-tu pas une servlet pour retourner le pdf? c'est simple à mettre en oeuvre.

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

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Points : 540
    Points
    540
    Par défaut
    Citation Envoyé par mattheox Voir le message
    JSP est sensée retournée un flux "texte"
    En fait il exsite 2 flux de sortie :
    - 1 flux texte JspWriter w = response.getWriter(),
    - 1 flux binaire OutputStream out = response.getOutputStream().

    Seulement on ne peut écrire que dans l'un des deux flux, sans quoi un IllegalStateException est levé.

    Javadoc de getOutputStream() : "Either this method or getWriter() may be called to write the body, not both."

    Ce qui se passe dans ton cas, c'est que lorsque tu fais un saut de ligne dans ta JSP, la servlet générée par Tomcat enregistre ce saut de ligne dans le flux de sortie de type JspWriter.

    Exemple de jsp (header.jsp) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <% String s = "a"; %>
     
    <%
    String toto = "12";
    String titi = "b";
    java.io.OutputStream os = response.getOutputStream();
    os.write(...);
    %>
    Servlet associée :
    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
    public class header_jsp /*.....*/
    {
         public void _jspService(HttpServletRequest request, HttpServletResponse response)
            throws java.io.IOException, ServletException
        {
            response.getWriter().write("\r\n");
            response.getWriter().write("\r\n");
            response.getWriter().write("\r\n");
            response.getWriter().write("\r\n");
            response.getWriter().write("\r\n");
            response.getWriter().write("\r\n");
            java.io.OutputStream os = response.getOutputStream();
            os.write(....); <= 'Là c le CRASH !!!'
            // ....
          }
    }
    A moins que tu t'arranges pour tout écrire sur la même ligne, je te conseille très fortement de passer par une servlet comme l'a suggéré mattheox.

  4. #4
    Membre confirmé
    Avatar de link256
    Profil pro
    Développeur Java
    Inscrit en
    Février 2003
    Messages
    596
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2003
    Messages : 596
    Points : 642
    Points
    642
    Par défaut
    Je ne suis pas passé par une servlet car je n'y ai pas pensé j'avoue ^^

    je suis rester focaliser sur mon struts action--> jsp

    et comme tu le dis c'est assez simple à mettre en oeuvre je vais regarder le lien que as mis.


    merci pour le lien de ce qui y est dit :

    ce que tu veux faire n'est pas possible, d'après moi : une JSP doit retourner du texte. Je pense que c'est obligatoire parce que par exemple, la variable out (disponible dans la JSP) est un Writer obtenue par response.getWriter() ce qui empeche l'appel de response.getOutputStream() : seule une de ces 2 méthodes peut être appelées (cf la javadoc des méthodes).

    Y a peut être moyen de bidouiller pour s'en sortir, mais ce sera de la bidouille : une jsp c'est fait pour faire du texte.

    pkoi tu veux pas laisser ca dans une servlet ?

    Si j'arrive pas à corriger ca je vais surement devoir passer par une servlet.

  5. #5
    Membre confirmé
    Avatar de link256
    Profil pro
    Développeur Java
    Inscrit en
    Février 2003
    Messages
    596
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2003
    Messages : 596
    Points : 642
    Points
    642
    Par défaut
    OKi la je comprend mieux pourquoi vous me conseillez de passer par une servlet

    je comprend qu'il ne puisse pas ecrire sur les 2flux à la fois.

    Mais il ne crache que lorsqu'il a fini génerer le PDF et non au debut




    Edit : j'ai fait le test en supprimant toutes les lignes et espaces et en effet plus d'erreur mais c'est assez crade :p
    Donc la servlet est obligatoire dans ce cas la.

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

Discussions similaires

  1. Mise en Page d'un document xml dans une JSP
    Par sami117 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 03/01/2010, 19h32
  2. [ XML ][ XSL ][ JSP ] afficher du xml dans une JSP
    Par zozolh2 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 17/07/2009, 20h34
  3. Ouverture d'un dossier à partir d'un lien Web dans une JSP
    Par roseline43 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 03/09/2008, 11h46
  4. OUVERTURE DOCUMENT DANS UNE TABLE EXISTANTE
    Par cfn3cfn dans le forum 4D
    Réponses: 1
    Dernier message: 14/08/2007, 17h35
  5. [struts][jsp]Inclusion dans une jsp
    Par GreenJay dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 17/06/2004, 11h43

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