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

Struts 1 Java Discussion :

Afficher PDF dans une nouvelle page avec Struts


Sujet :

Struts 1 Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut Afficher PDF dans une nouvelle page avec Struts
    Bonjour,

    Je souhaite ouvrir un pdf dans jsp(une nouvelle jsp) en passant par ActionStruts.

    J'ai cherché sur google mais je n'ai pas trouvé un bon exemple qui explique cela pas-à-pas. Je vous remercie d'avance si vous pouvez m'indiquer un bon tutoriel un exemple.

    (avec struts 1)


    Merci.


    Bien Cordialement, Luis

  2. #2
    Membre éprouvé Avatar de Lician
    Homme Profil pro
    Architecte Logiciel
    Inscrit en
    Mars 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Architecte Logiciel
    Secteur : Services de proximité

    Informations forums :
    Inscription : Mars 2011
    Messages : 93
    Par défaut
    Bonjour,

    Ton pdf doit-il avoir une forme particulière?
    Tu peux utiliser Crystal Clear Report pour la template et le .jar crystal clear qui lui est associé par la suite.

    Sinon tu as aussi ce lien qui me semble pas mal pour tout type de documents...

    http://www.vaannila.com/struts/strut...example-1.html

    Bon courage!

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Et bien, imaginons que nous générons un pdf avec Itext et que ensuite on le li byte par byte et on affiche dans une nouvelle fenêtre.

    Merci.

  4. #4
    Membre émérite Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Par défaut
    Il te suffit de remplir le flux de réponse de la servlet avec tes datas.
    Il peut être judicieux de remplir qqs éléments du header comme le contentType ou le Content-Disposition.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Oui comme ce ci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     response.setContentType ("application/pdf");
    		 response.setHeader ("Content-Disposition", "attachment; filename=\""+fichier+"\"");

    J'ai un exemple dans la FAQ de struts mais je ne comprend certaine chose:

    voici l'exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <html:link page="/openpdf.do"
    name="pdfForm"
    property="pdfName"
    target="_blank">
    <html:img src="./images/PDF.gif" border="0" alt="View PDF"/>
    </html:link>
    Dans la méthode execute de l'Action :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ByteArrayOutputStream bos = new ByteArrayOutputStream(5000);
    // Remplir ici votre bos avec le flux du PDF
    httpServletResponse.setContentType("application/pdf");
    httpServletResponse.setContentLength(bos.size());
    OutputStream os = httpServletResponse.getOutputStream();
    os.write(bos.toByteArray(), 0, bos.size());
    os.flush();
    os.close();
    return null;

    Donc je pense que dans le fichier struts-config.xml


    je dois avoir un bean déclarer comme çà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <form-bean name="pdfForm" type="org.apache.struts.validator.DynaValidatorForm"/>
    et dans une autre action de struts avoir mit une propriété nommée pdfName dans la session , ça pourrait être l'array de bytes, non?

    Pour que je puisse faire par la suite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    os.write(bos.toByteArray(), 0, bos.size());
    os.flush();
    os.close();

    Merci

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Bonjour,

    Finalement ça marche, je ne sais pas si c'est la meilleur façon, je vous montre le code:


    Dans la JSP j'ai éliminé la référence au form et à la propriété car c'est ma page initial et je ne suis pas passé par une autre action pour la mettre en session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <html:link page="/ajaxAction.do"
    		   target="_blank">
    	<html:img src="images/pdf.jpg" border="0" alt="View PDF"/>
    </html:link>
    Dans la méthode execute de l'Action :


    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
    	 ByteArrayOutputStream bos = new ByteArrayOutputStream();
    	// Remplir ici votre bos avec le flux du PDF
    	 InputStream ips = new FileInputStream("C:/pdf/Pool.pdf");
     
    	 byte buffer[] = new byte[512 * 1024];
    		int nbLecture;
    		while ((nbLecture = ips.read(buffer)) != -1) {
    			bos.write(buffer, 0, nbLecture);
    		}
     
    		response.setContentType("application/pdf");
    		response.setContentLength(bos.size());
    		OutputStream os = response.getOutputStream();
    		os.write(bos.toByteArray(), 0, bos.size());
    		os.flush();
    		os.close();
    et voilà le pdf s'ouvre dans une nouvelle fenêtre sur IE et un nouvel onglet sur FireFox, J'avoue ne pas contrôler ce genre de Phénomène .


    Je ne ferme pas encore ce thème, je vais attendre des suggestions.



    Merci.

  7. #7
    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
    Si tu veux ouvrir une fenêtre, tu peux également passer par du javascript.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html:img src="images/pdf.jpg" border="0" alt="View PDF" onclick="window.open('./ajaxAction.do', 'PDF', 'width=800,height=600,resizable').focus()"/>
    Dans les 2 cas, le problème viendra d'une erreur dans l'action qui te laissera une fenêtre blanche ouverte... pas top...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Je vais aussi tester cette solution, mais ce que j'ai posté ultérieurement ça marche, j’obtiens bien l'ouverture du pdf dans la fenêtre.


    J'ai pas bien saisi ta dernière phrase....


    Merci.

  9. #9
    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
    Si pour une raison X ton contrôleur se plante ou renvoie un MappingForward null (sans renvoyer le pdf), tu gardes une page blanche... il faut prévoir le plantage pour renvoyer une demande de fermeture de la fenêtre.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Ok, je vois le problème maintenant, quand j’écris directement dans le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    os = response.getOutputStream(); 
    os.write(bos.toByteArray(), 0, bos.size());
    je suis déjà entrain d’écrire dans la réponse.


    Je simule une erreur comme tu me la faite remarquer

    et je luis dis de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mapping.findForward("fail");
    le problème maintenant c'est j'ai cette exception qui saute....


    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
    46
    47
    48
    GRAVE: "Servlet.service()" pour la servlet jsp a lancé une exception
    java.lang.IllegalStateException: "getOutputStream()" a déjà été appelé pour cette réponse
    	at org.apache.catalina.connector.Response.getWriter(Response.java:633)
    	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
    	at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
    	at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    	at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    	at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:182)
    	at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext(JspFactoryImpl.java:123)
    	at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext(JspFactoryImpl.java:80)
    	at org.apache.jsp.error_jsp._jspService(error_jsp.java:90)
    	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
    	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
    	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
    	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
    	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
    	at org.apache.struts.action.RequestProcessor.doInclude(RequestProcessor.java:1116)
    	at org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:260)
    	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
    	at org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:318)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
    	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
    	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    	at java.lang.Thread.run(Unknown Source)
    14 déc. 2011 14:59:17 org.apache.catalina.core.StandardWrapperValve invoke

    Et voilà j'ai cette erreur car je pense que j'ai déjà envoyé le pdf ver le navigateur, dans la méthode execute je devrais faire return null


    Mais comment redirigé ver une page d'erreur si je ne charge pas correctement le pdf?

    Après un peut de recherche sur google voici sur quoi je suis tombé....

    Basic rule of HTTP: one request, one response.

    You can only send back one thing to a request.
    Either an HTML page, or a PDF document, or an image or....
    Specifically you can't send an HTML page AND a PDF document.
    Java complains if you have already obtained a writer/outputstream as you should only be getting ONE of these.
    http://www.coderanch.com/t/547668/St...dy-been-called


    Merci d'avance.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 277
    Par défaut
    Ceci n'est pas très élégant mais si l’erreur se produit avant de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os = response.getOutputStream();
    je peux toujours ouvrir dans la page qui était réserve pour l'ouverture du pdf.


    Si il y a l'ouverture du pdf, à la fin de la méthode execute je dois retourner null vu que j'ai déjà envoyer le pdf ver le broswer....


    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
    	 OutputStream os = null;
     
    	 int iter =0;
     
    	 ByteArrayOutputStream bos = new ByteArrayOutputStream();
    	// Remplir ici votre bos avec le flux du PDF
    	 InputStream ips = new FileInputStream("C:/pdf/Pool.pdf");
     
    	try{ 
     
    	 byte buffer[] = new byte[512 * 1024];
    		int nbLecture;
    		while ((nbLecture = ips.read(buffer)) != -1) {
    			bos.write(buffer, 0, nbLecture);
    			if(iter == 9)
    				throw new Exception();
    			iter++;
    		}
     
    		response.setContentType("application/pdf");
    		response.setContentLength(bos.size());
    		os = response.getOutputStream();
    		os.write(bos.toByteArray(), 0, bos.size());
    		os.flush();
     
    	}catch(Exception e){
    		return mapping.findForward("fail");
     
    	}finally{
    		if(os != null)
    			os.close();
    	}
     
      return null;

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

Discussions similaires

  1. [Débutant] Comment afficher le resultat dune BDD avec javascript dans une nouvelle page
    Par modemo2005 dans le forum Langages
    Réponses: 1
    Dernier message: 16/12/2014, 19h24
  2. ouvrir un lien dans une nouvelle page avec un select
    Par laurentSc dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 20/01/2013, 17h09
  3. Ouvrir un lien dans une nouvelle page avec un select sans javascript
    Par laurentSc dans le forum Balisage (X)HTML et validation W3C
    Réponses: 22
    Dernier message: 22/12/2012, 16h39
  4. Afficher PDF dans une page web
    Par Ishida dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/08/2008, 23h26
  5. Afficher un lien dans une nouvelle page
    Par newmar dans le forum Struts 1
    Réponses: 4
    Dernier message: 26/05/2008, 14h06

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