Bonjour à tous,
je dispose d'un rapport Jasper au format jrxml. Celui-ci contient la requête à executer en base.
J'ai plusieurs solutions pour implementer ma solution :
passer par un controlleur, executer moi même la requête et envoyer le résultat dans le model pour rediriger dans une vue qui m'affichera le rapport. Mais je ne veux pas utiliser cette solution à cause de choix techniques dont je ne ferais pas le détail içi.
J'ai donc trouvé la solution de récupérer une connection du pool, de générer le rapport et de récuperer un objet de type JasperPrint.
Ensuite je voudrais que le controlleur me redirige vers une vue que j'ai crée et qui hérite de : JasperReportsMultiFormatView pour envoyer dans l'objet response le rapport généré.
Alors pour le moment cela fonctionne plus ou moins bien, mon rapport se génére, je redirige vers la vue et le rapport s'affiche en HTML comme je l'ai demandé. Le problème est qu'au niveau de la génération, il n'arrive pas à afficher des images ... pourtant je n'ai pas d'images dans mon rapport.
Voici le code que j'utilise :
Au niveau du controlleur :
Le fichier views.properties (qui définit ma vue)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection); model.put("jasperPrint", jasperPrint); JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(new ArrayList()); model.put("ds",ds); return new ModelAndView("patientDashboard", model);
Enfin le code de la vue :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2patientDashboard.class=com.all4it.forstudy.web.view.JasperReportView patientDashboard.url=/WEB-INF/reports/PatientDashboard.jrxml
Le code du fichier jrxml (j'ai retiré la declaration de la requète en base)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 JasperPrint jasperPrint = (JasperPrint)model.get("jasperPrint"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out); exporter.exportReport();
Le problème principal est qu'au niveau de la génération, apparemment le navigateur n'arrive pas à afficher d'images pourtant je n'en ai pas dans mon rapport.
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 <?xml version="1.0" encoding="UTF-8"?> <!-- Created using an evaluation version of JasperAssistant (http://www.jasperassistant.com) --> <!DOCTYPE jasperReport PUBLIC "-//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"> <jasperReport name="Unnamed" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="30" bottomMargin="30"> <property name="com.jasperassistant.designer.Grid" value="false"/> <property name="com.jasperassistant.designer.SnapToGrid" value="false"/> <property name="com.jasperassistant.designer.GridWidth" value="12"/> <property name="com.jasperassistant.designer.GridHeight" value="12"/> <property name="com.jasperassistant.designer.VGuides.Column Header" value="28"/> <property name="com.jasperassistant.designer.VGuides.Detail" value="28"/> <property name="com.jasperassistant.designer.DataSource" value="oracle.jdbc.driver.OracleDriv"/> <field name="CTNSER" class="java.math.BigDecimal"/> <field name="CTSER" class="java.math.BigDecimal"/> <field name="SITEID" class="java.lang.String"/> <field name="USUBJID" class="java.lang.String"/> <title> <band height="39"> <textField> <reportElement x="159" y="0" width="240" height="25"/> <textElement textAlignment="Center"> <font fontName="Arial" size="18" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["Dashboard Patient Report"]]></textFieldExpression> </textField> </band> </title> <columnHeader> <band height="35"> <elementGroup> <textField> <reportElement mode="Opaque" x="146" y="9" width="80" height="20" backcolor="#FFFFAA"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="Garamond" size="12" isBold="true" pdfFontName="Helvetica"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["SITEID"]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="6" y="9" width="128" height="20" backcolor="#FFFFAA"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="Garamond" size="12" isBold="true" pdfFontName="Helvetica"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["USUBJID"]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="246" y="9" width="79" height="20" backcolor="#FFFFAA"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="Garamond" size="12" isBold="true" pdfFontName="Helvetica"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["CTSER"]]></textFieldExpression> </textField> <textField> <reportElement mode="Opaque" x="351" y="9" width="80" height="20" backcolor="#FFFFAA"/> <textElement textAlignment="Center" verticalAlignment="Middle"> <font fontName="Garamond" size="12" isBold="true" pdfFontName="Helvetica"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA["CTNSER"]]></textFieldExpression> </textField> </elementGroup> </band> </columnHeader> <detail> <band height="31"> <elementGroup> <textField> <reportElement x="153" y="9" width="72" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{SITEID}]]></textFieldExpression> </textField> <textField> <reportElement x="16" y="9" width="118" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{USUBJID}]]></textFieldExpression> </textField> </elementGroup> <textField> <reportElement x="247" y="9" width="80" height="20"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{CTSER}]]></textFieldExpression> </textField> <textField> <reportElement x="350" y="9" width="80" height="20"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.math.BigDecimal"><![CDATA[$F{CTNSER}]]></textFieldExpression> </textField> </band> </detail> </jasperReport>
Le 2ème problème que j'ai (j'ai contourné l'erreur mais je ne trouve pas cela élégant) est que pour la redirection du controlleur vers la vue, il me faut passer une datasource même vide pour eviter une erreur de jasper me disant qu'il ne trouve pas de datasource dans le model pour le rapport.
Pour le moment je met une datasource vide et ca passe.
Donc je cherche une solution pour avoir un affichage correct de mon rapport.
Dans un 2ème temps peut être une meilleure solution d'implémentation de mon rapport.
Si vous avez des questions pour plus de clartée, n'hésitez pas.
Merci
Partager