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

JSF Java Discussion :

Ouvrir un PDF depuis JSF


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut Ouvrir un PDF depuis JSF
    Bonjour,
    Je désire à l'aide d'un lien ouvrir un PDF dans mon browser grâce à JasperReport. Mon lien dans ma page JSF est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h:commandLink action="generate_report" actionListener="#habilitationManagedBean.displayHabilitationTechnicien}">
         <h:outputText value="Generate Report"/>
    </h:commandLink>

    Ma fonction Java dans mon Managed Bean est le 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
     
        public void displayHabilitationTechnicien(ActionEvent event) throws IOException, ClassNotFoundException, SQLException, JRException
        {
     
            Connection connection;
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse)
            context.getExternalContext().getResponse();
            InputStream reportStream = context.getExternalContext().getResourceAsStream("/WEB-INF/reports/liste_habilitations_by_tech.jasper");
            ServletOutputStream servletOutputStream = response.getOutputStream();
            Class.forName("oracle.jdbc.driver.OracleDriver");
            connection = DriverManager.getConnection("jdbc:oracle:thin:@kermorvan:1521:LSYB", "SIEL", "SIEL");
            JasperRunManager.runReportToPdfStream(reportStream,    servletOutputStream, new HashMap(), connection);
            connection.close();
            response.setContentType("application/pdf");
            response.setHeader("Content-disposition", "inline");
            servletOutputStream.flush();
            servletOutputStream.close();
        }
    Lorsque je clique sur le lien j'obtiens l'exception suivante :

    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
     
    11:09:28,167 ERROR [[Faces Servlet]] "Servlet.service()" pour la servlet Faces Servlet a généré une exception
    java.lang.IllegalStateException: Impossible d'utiliser faire-suivre (forward) après que la réponse ait été envoyée
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:313)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:408)
        at com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
        at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
        at com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.renderView(ViewHandlerImpl.java:298)
        at org.apache.shale.validator.faces.ValidatorViewHandler.renderView(ValidatorViewHandler.java:130)
        at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
        at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
        at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
        at java.lang.Thread.run(Thread.java:595)
    Quelqu'un peut-il m'aider ? Je ne sais pas comment faire pour ne pas commiter la reponse Http 2 fois ? Merci beaucoup pour votre aide.
    Si des personnes utilisent d'autres techniques pour generer du PDF depuis une page JSF ?!!? (exemple API Acrobat Java avec Acrobat Viewer)

  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
    Plusieurs choses

    1) ne ferme *pas* les stream associé au servlet!
    2) Par sécurité, bien que çà aie l'air de marcher pour toi, défini les headers et le content type *avant* de générer le report pdf
    3) Quand t'as tous fais, appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    context.responseComplete()
    pour signaler à JSF que la réponse a déjà été envoyée et qu'il ne faut plus rien envoyer sur le stream (sinon il essaie de mettre ton formulaire après le contenu binaire dans la reponse, pas bien )

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Par défaut
    Autrement dit je dois coder quelque chose comme :

    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
     
    public void displayHabilitationTechnicien(ActionEvent event) throws IOException, ClassNotFoundException, SQLException, JRException
        {
     
            Connection connection;
            FacesContext context = FacesContext.getCurrentInstance();
            HttpServletResponse response = (HttpServletResponse)
     
            //Definition du header et contenType avant la génération PDF
            response.setContentType("application/pdf");
            response.setHeader("Content-disposition", "inline");
     
            context.getExternalContext().getResponse();
            InputStream reportStream = context.getExternalContext().getResourceAsStream("/WEB-INF/reports/liste_habilitations_by_tech.jasper");
            ServletOutputStream servletOutputStream = response.getOutputStream();
            Class.forName("oracle.jdbc.driver.OracleDriver");
            connection = DriverManager.getConnection("jdbc:oracle:thin:@kermorvan:1521:LSYB", "SIEL", "SIEL");
            JasperRunManager.runReportToPdfStream(reportStream,    servletOutputStream, new HashMap(), connection);
            connection.close();
            context.responseComplete()
     
        }
    ???

    Merci pour ta réponse

Discussions similaires

  1. ouvrir des .pdf et .doc depuis html ds une nouvelle fenetre
    Par NemKa dans le forum Microsoft Office
    Réponses: 3
    Dernier message: 09/09/2008, 16h33
  2. Ouvrir un fichier pdf depuis une macro
    Par Maluje dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/03/2008, 17h51
  3. [FPDF] Pb pour ouvrir des PDF depuis les dossiers Web
    Par Diggi dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 12/12/2007, 08h51
  4. Ouvrir un Pdf depuis Excel
    Par liop49 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/10/2007, 16h34
  5. Ouvrir un fichier PDF depuis un formulaire
    Par yao67 dans le forum VBA Access
    Réponses: 1
    Dernier message: 15/06/2007, 09h40

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