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 :

utiliser JasperReports avec JSF


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut utiliser JasperReports avec JSF
    Salut tout le monde. Je n'arrive pas à afficher un PDF dans le browser. Est-ce que quelqu'un a un exemple concret, svp?
    J'ai essayé d'appliquer la technique suivante (reprise dans le tutoriel de JasperReports):
    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
    public class ReportGenerator {
    
        public void generateReport(ActionEvent event)
    	    throws ClassNotFoundException, SQLException, IOException,
    	    JRException {
    	
    	Connection connection;
    	FacesContext context = FacesContext.getCurrentInstance();
    	HttpServletResponse response = (HttpServletResponse) context
    		.getExternalContext().getResponse();
    	InputStream reportStream = context.getExternalContext()
    		.getResourceAsStream("/src/reports/mysqlReport.jasper");
    
    	ServletOutputStream servletOutputStream = response.getOutputStream();
    	Class.forName("com.mysql.jdbc.Driver");
    	connection = DriverManager
    		.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=pwd");
    	JasperRunManager.runReportToPdfStream(reportStream,
    		servletOutputStream, new HashMap<String, String>(), connection);
    	connection.close();
    	response.setContentType("application/pdf");
    	servletOutputStream.flush();
    	servletOutputStream.close();
        }
    }
    Ma page jsp:
    
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1234567891011
     
    <f:view>
    	<h:outputText value="Click on the link below to generate the
    report." />
    	<h:form>
    		<h:commandLink action="generate_report"
    			actionListener="#{reportGenerator.generateReport}">
    			<h:outputText value="Generate Report" />
    		</h:commandLink>
    	</h:form>
    </f:view>
    Mais là ils utilisent MyFaces et avec jsf de SUN_RI cea ne fonctionne pas
    Ca donne l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    GRAVE: Received 'java.lang.NullPointerException' when invoking action listener '#{reportGenerator.generateReport}' for component 'j_id_jsp_320462548_3'
    22-nov.-2007 12:35:42 javax.faces.event.MethodExpressionActionListener processAction
    GRAVE: java.lang.NullPointerException
    	at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2264)
    	at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2277)
    	at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2748)
    ....
    et à la fin 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
     
    22-nov.-2007 12:35:42 com.sun.faces.lifecycle.LifecycleImpl phase
    ATTENTION: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@4e2f0a) threw exception
    javax.faces.FacesException: org.apache.jasper.JasperException: An exception occurred processing JSP page /generate.jsp at line 12
     
    9: <title>Report Generation</title>
    10: </head>
    11: <body>
    12: <f:view>
    13: 	<h:outputText value="Click on the link below to generate the
    14: report." />
    15: 	<h:form>
     
     
    Stacktrace:
    	at com.sun.faces.context.ExternalContextImpl.dispatch(ExternalContextImpl.java:413)
    	at com.sun.faces.application.ViewHandlerImpl.executePageToBuildView(ViewHandlerImpl.java:442)
    	at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:115)
    	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
    	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    ...
    Merci pour l'aide.

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2004
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 335
    Par défaut
    fais un logging sur la valeur de reportStream apres cette commande:

    InputStream reportStream = context.getExternalContext()
    .getResourceAsStream("/src/reports/mysqlReport.jasper");

  3. #3
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    Voici ce que cela a donné:
    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
     
    23-nov.-2007 12:09:18 org.apache.catalina.startup.Catalina start
    INFO: Server startup in 1402 ms
    23-nov.-2007 12:09:37 javax.faces.event.MethodExpressionActionListener processAction
    GRAVE: Received 'java.lang.NullPointerException' when invoking action listener '#{reportGenerator.generateReport}' for component 'j_id_jsp_320462548_3'
    23-nov.-2007 12:09:37 javax.faces.event.MethodExpressionActionListener processAction
    GRAVE: java.lang.NullPointerException
    	at beans.ReportGenerator.generateReport(ReportGenerator.java:35)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
    	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
    	at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
    	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:88)
    	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:77)
    	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:746)
    	at javax.faces.component.UICommand.broadcast(UICommand.java:368)
    	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
    	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
    	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
    	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Thread.java:619)

  4. #4
    Membre expérimenté
    Inscrit en
    Mai 2004
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 335
    Par défaut
    ce que je voulais dire c'est que tu test si reportStream est null ou non;
    car tu as ici un cull pointer exception.
    et InputStream reportStream = context.getExternalContext()
    .getResourceAsStream("/src/reports/mysqlReport.jasper");
    apres cette commande s'il ne localize pas ton fichier jasper
    cette commande
    JasperRunManager.runReportToPdfStream(reportStream,
    servletOutputStream, new HashMap<String, String>(), connection);
    peut genere un null pointer exception.

  5. #5
    Membre éclairé Avatar de Javix
    Inscrit en
    Juin 2007
    Messages
    531
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 531
    Par défaut
    Forcement, j'ai corrigé le path vers le fichier:
    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
     
    public void generateReport(ActionEvent event)
    	    throws ClassNotFoundException, SQLException, IOException,
    	    JRException {
     
    	Connection connection;
    	FacesContext context = FacesContext.getCurrentInstance();
    	HttpServletResponse response = (HttpServletResponse) context
    		.getExternalContext().getResponse();
    	InputStream reportStream = context.getExternalContext()
    		.getResourceAsStream("/reports/mysqlReport.jasper");
    	if (reportStream != null) {
    	    System.out.println("Jasper file:" + reportStream.toString());
    	    ServletOutputStream servletOutputStream = response
    		    .getOutputStream();
    	    Class.forName("com.mysql.jdbc.Driver");
    	    connection = DriverManager
    		    .getConnection("jdbc:mysql://localhost:3306/test?user=root&password=pwd);
    	    JasperRunManager.runReportToPdfStream(reportStream,
    		    servletOutputStream, new HashMap<String, String>(),
    		    connection);
    	    connection.close();
    	    response.setContentType("application/pdf");
    	    servletOutputStream.flush();
    	    servletOutputStream.close();
    	} else {
    	    System.err.println("Report stream is null!");
    	}
        }
    Mais cette fois j'ai une autre chose:
    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
     
    INFO: Server startup in 1385 ms
    Jasper file:java.io.ByteArrayInputStream@1c7865b
    23-nov.-2007 14:43:26 com.sun.faces.lifecycle.LifecycleImpl phase
    ATTENTION: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@166c114) threw 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:302)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
    	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.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.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Thread.java:619)
    Quand je clique sur le link pour générer un fichier PDF, le browser (interne d'Eclipse) me propose de sauvegarder ma page "generate.jsp" j'espérai d'avoir un fichier PDF ouvert dans le browser, non ?

  6. #6
    Membre expérimenté
    Inscrit en
    Mai 2004
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 335
    Par défaut
    enleve le servletOutputStream.close() et ressaye

Discussions similaires

  1. Réponses: 6
    Dernier message: 16/05/2012, 11h48
  2. Utilisation spring avec jsf
    Par rushtakn dans le forum JSF
    Réponses: 9
    Dernier message: 16/06/2009, 09h30
  3. Debutant : Question sur jasperReport avec jsf
    Par kam81 dans le forum JSF
    Réponses: 2
    Dernier message: 08/11/2008, 19h53
  4. Utiliser RichFaces avec JSF 1.2
    Par Dimitri_87 dans le forum JSF
    Réponses: 3
    Dernier message: 02/04/2008, 17h07
  5. utilisation de base de donnée avec JSF
    Par kedare dans le forum JSF
    Réponses: 1
    Dernier message: 16/05/2006, 17h03

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