Статьи

DynamicReports и JasperReports с JSF, сервлетом и CDI

В этом примере я покажу, как интегрировать DynamicReport и JasperReports с сервлетом и CDI.

Инструменты:

  • TIBCO Jaspersoft Studio-6.0.4. Финал.
  • Eclipse Luna Service Release 2 (4.4.2).
  • Сервер приложений WildFly 8.x.

Это скриншот из иерархии проектов в Eclipse.

2-DynamicReportsWithJSFServletsAndCDI

  1. Файл pom.xml содержит необходимые зависимости для сервлетов + JSF + CDI + DynamicReports.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    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
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.ithinkisink</groupId>
     <artifactId>DynamicReportsWithJSFServletsAndCDI</artifactId>
     <packaging>war</packaging>
     <version>0.0.1-SNAPSHOT</version>
     <name>DynamicReportsWithJSFServletsAndCDI Maven Webapp</name>
     
     <dependencies>
      <dependency>
       <groupId>javax.inject</groupId>
       <artifactId>javax.inject</artifactId>
       <version>1</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>javax.faces</groupId>
       <artifactId>jsf-api</artifactId>
       <version>2.1</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>javax.servlet</groupId>
       <artifactId>javax.servlet-api</artifactId>
       <version>3.1.0</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
       <groupId>javax.enterprise</groupId>
       <artifactId>cdi-api</artifactId>
       <version>1.0</version>
       <scope>provided</scope>
      </dependency>
      <dependency>
        <groupId>net.sourceforge.dynamicreports</groupId>
        <artifactId>dynamicreports-core</artifactId>
        <version>4.0.0</version>
      </dependency>
     </dependencies>
     <build>
      <finalName>DynamicReportsWithJSFServletsAndCDI</finalName>
      <plugins>
       <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
         <source>1.7</source>
         <target>1.7</target>
        </configuration>
       </plugin>
      </plugins>
     </build>
    </project>
  2. Создание простого шаблона JRXML с использованием TIBCO Jaspersoft Studio, содержащего изображение, которое будет динамически передавать его путь в качестве параметра из DynamicReportsManagedBean в DynamicReports позже.
    001
    002
    003
    004
    005
    006
    007
    008
    009
    010
    011
    012
    013
    014
    015
    016
    017
    018
    019
    020
    021
    022
    023
    024
    025
    026
    027
    028
    029
    030
    031
    032
    033
    034
    035
    036
    037
    038
    039
    040
    041
    042
    043
    044
    045
    046
    047
    048
    049
    050
    051
    052
    053
    054
    055
    056
    057
    058
    059
    060
    061
    062
    063
    064
    065
    066
    067
    068
    069
    070
    071
    072
    073
    074
    075
    076
    077
    078
    079
    080
    081
    082
    083
    084
    085
    086
    087
    088
    089
    090
    091
    092
    093
    094
    095
    096
    097
    098
    099
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- Created with Jaspersoft Studio version 6.0.4.final using JasperReports Library version 6.0.4  -->
    <!-- 2015-12-04T17:15:43 -->
    <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Invoice" pageWidth="595" pageHeight="842" columnWidth="535" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4eedbb89-b4f6-4469-9ab6-f642a1688cf7">
     <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
     <style name="Title" forecolor="#FFFFFF" fontName="Times New Roman" fontSize="50" isBold="false" pdfFontName="Times-Bold"/>
     <style name="SubTitle" forecolor="#CCCCCC" fontName="Times New Roman" fontSize="18" isBold="false" pdfFontName="Times-Roman"/>
     <style name="Column header" forecolor="#666666" fontName="Times New Roman" fontSize="14" isBold="true"/>
     <style name="Detail" mode="Transparent" fontName="Times New Roman"/>
     <style name="Row" mode="Transparent" fontName="Times New Roman" pdfFontName="Times-Roman">
      <conditionalStyle>
       <conditionExpression><![CDATA[$V{REPORT_COUNT}%2 == 0]]></conditionExpression>
       <style mode="Opaque" backcolor="#EEEFF0"/>
      </conditionalStyle>
     </style>
     <style name="Table">
      <box>
       <pen lineWidth="1.0" lineColor="#000000"/>
       <topPen lineWidth="1.0" lineColor="#000000"/>
       <leftPen lineWidth="1.0" lineColor="#000000"/>
       <bottomPen lineWidth="1.0" lineColor="#000000"/>
       <rightPen lineWidth="1.0" lineColor="#000000"/>
      </box>
     </style>
     <style name="Table_TH" mode="Opaque" backcolor="#FFFFFF">
      <box>
       <pen lineWidth="0.5" lineColor="#000000"/>
       <topPen lineWidth="0.5" lineColor="#000000"/>
       <leftPen lineWidth="0.5" lineColor="#000000"/>
       <bottomPen lineWidth="0.5" lineColor="#000000"/>
       <rightPen lineWidth="0.5" lineColor="#000000"/>
      </box>
     </style>
     <style name="Table_CH" mode="Opaque" backcolor="#CACED0">
      <box>
       <pen lineWidth="0.5" lineColor="#000000"/>
       <topPen lineWidth="0.5" lineColor="#000000"/>
       <leftPen lineWidth="0.5" lineColor="#000000"/>
       <bottomPen lineWidth="0.5" lineColor="#000000"/>
       <rightPen lineWidth="0.5" lineColor="#000000"/>
      </box>
     </style>
     <style name="Table_TD" mode="Opaque" backcolor="#FFFFFF">
      <box>
       <pen lineWidth="0.5" lineColor="#000000"/>
       <topPen lineWidth="0.5" lineColor="#000000"/>
       <leftPen lineWidth="0.5" lineColor="#000000"/>
       <bottomPen lineWidth="0.5" lineColor="#000000"/>
       <rightPen lineWidth="0.5" lineColor="#000000"/>
      </box>
      <conditionalStyle>
       <conditionExpression><![CDATA[$V{REPORT_COUNT}%2 == 0]]></conditionExpression>
       <style backcolor="#D8D8D8"/>
      </conditionalStyle>
     </style>
     <subDataset name="tableDataset" uuid="f13e6d36-5148-4ecc-bbe3-3035def80980">
      <queryString>
       <![CDATA[]]>
      </queryString>
     </subDataset>
     <parameter name="invoiceNo" class="java.lang.String"/>
     <parameter name="billingCompanyName" class="java.lang.String"/>
     <parameter name="billingCompanyAddress" class="java.lang.String"/>
     <parameter name="billingCompanyFirstState" class="java.lang.String"/>
     <parameter name="billingCompanySecondState" class="java.lang.String"/>
     <parameter name="shippingName" class="java.lang.String"/>
     <parameter name="shippingAddress" class="java.lang.String"/>
     <parameter name="shippingFirstState" class="java.lang.String"/>
     <parameter name="shippingSecondState" class="java.lang.String"/>
     <parameter name="IMAGE_PATH" class="java.lang.String"/>
     <queryString language="SQL">
      <![CDATA[]]>
     </queryString>
     <field name="itemNo" class="java.lang.String"/>
     <field name="description" class="java.lang.String"/>
     <field name="unitCost" class="java.lang.Double"/>
     <field name="quantity" class="java.lang.Integer"/>
     <group name="Gruppo1">
      <groupExpression><![CDATA[(int)($V{REPORT_COUNT}/15)]]></groupExpression>
      <groupHeader>
       <band/>
      </groupHeader>
      <groupFooter>
       <band>
        <property name="local_mesure_unitheight" value="pixel"/>
        <property name="com.jaspersoft.studio.unit.height" value="px"/>
       </band>
      </groupFooter>
     </group>
     <title>
      <band height="196" splitType="Stretch">
       <staticText>
        <reportElement x="0" y="90" width="84" height="25" uuid="57aed2b1-4f4e-40a3-a6ad-54dae8dd4c5a">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textElement>
         <font size="16" isBold="true"/>
        </textElement>
        <text><![CDATA[Bill to:]]></text>
       </staticText>
       <line>
        <reportElement x="0" y="80" width="556" height="1" uuid="806ce5df-1219-4876-ae0c-ca7405b1f246">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
       </line>
       <staticText>
        <reportElement x="400" y="90" width="84" height="25" uuid="139ebe8d-25b0-411e-986c-270015400874">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textElement>
         <font size="16" isBold="true"/>
        </textElement>
        <text><![CDATA[Ship to:]]></text>
       </staticText>
       <staticText>
        <reportElement x="415" y="10" width="50" height="20" uuid="0f86baff-6386-4f3f-b3fe-2388707babe8"/>
        <box rightPadding="4"/>
        <textElement textAlignment="Right"/>
        <text><![CDATA[Date:]]></text>
       </staticText>
       <textField pattern="EEEEE dd MMMMM yyyy">
        <reportElement x="465" y="10" width="84" height="20" uuid="bb10dbe1-0a4f-4722-9953-c163b63cf979"/>
        <textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression>
       </textField>
       <image hAlign="Center">
        <reportElement x="0" y="0" width="65" height="60" uuid="94883631-a913-43e2-b182-ab8d77d0181e"/>
        <imageExpression><![CDATA[$P{IMAGE_PATH} + "/invoice_logo.png"]]></imageExpression>
       </image>
       <textField pattern="EEEEE dd MMMMM yyyy">
        <reportElement x="465" y="30" width="84" height="20" uuid="3836ce65-eca3-4cad-a6de-b1818def0a2b"/>
        <textFieldExpression><![CDATA[$P{invoiceNo}]]></textFieldExpression>
       </textField>
       <staticText>
        <reportElement x="415" y="30" width="50" height="20" uuid="0b3f9342-da78-4cfa-9fc5-2301c4749678"/>
        <box rightPadding="4"/>
        <textElement textAlignment="Right"/>
        <text><![CDATA[Invoice #]]></text>
       </staticText>
       <staticText>
        <reportElement x="95" y="0" width="210" height="25" uuid="e622555d-198b-4ccd-a4a1-c59c53304058">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textElement>
         <font size="19" isBold="true"/>
        </textElement>
        <text><![CDATA[I think, I sink!]]></text>
       </staticText>
       <staticText>
        <reportElement x="95" y="55" width="205" height="15" uuid="b8cc42fd-b569-497d-834d-7e854040ad18"/>
        <text><![CDATA[+20 10 000 0000]]></text>
       </staticText>
       <staticText>
        <reportElement x="95" y="25" width="205" height="15" uuid="c226e44d-3bb5-4145-b0b3-903bf1d79fde"/>
        <text><![CDATA[Sesame street]]></text>
       </staticText>
       <staticText>
        <reportElement x="95" y="40" width="205" height="15" uuid="b96f7183-44f8-43ad-ba60-43d8fbf50b6e"/>
        <text><![CDATA[Sesame city]]></text>
       </staticText>
       <textField>
        <reportElement x="0" y="115" width="150" height="15" uuid="7e9e0af2-08d1-4997-b3e1-971e74b1c8ad">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{billingCompanyName}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="0" y="130" width="150" height="15" uuid="a0eaddab-ed2f-46fc-b9fc-d0d9747c6df3">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{billingCompanyAddress}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="0" y="145" width="150" height="15" uuid="f9371f1e-125e-408d-a0f0-aa0ea5adc171">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{billingCompanyFirstState}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="0" y="160" width="150" height="15" uuid="c14d7758-80e6-45d7-8526-797330e515d3">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{billingCompanySecondState}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="400" y="160" width="140" height="15" uuid="a9baefea-45b3-4826-a81e-3572507eea6d">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{shippingSecondState}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="400" y="145" width="140" height="15" uuid="338e1f40-9a03-4b77-aedc-568b1907628b">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{shippingFirstState}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="400" y="130" width="140" height="15" uuid="54e6473f-44ef-4839-8f87-29e65af72561">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{shippingAddress}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="400" y="115" width="140" height="15" uuid="1f093c2e-2d6f-403e-9c11-160dbaf82e6f">
         <property name="local_mesure_unitheight" value="pixel"/>
         <property name="com.jaspersoft.studio.unit.height" value="px"/>
        </reportElement>
        <textFieldExpression><![CDATA[$P{shippingName}]]></textFieldExpression>
       </textField>
      </band>
     </title>
     <columnHeader>
      <band height="24">
       <staticText>
        <reportElement x="366" y="4" width="80" height="20" uuid="be792358-dade-4931-965d-fe4d4958b71c"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Quantity]]></text>
       </staticText>
       <rectangle>
        <reportElement mode="Opaque" x="10" y="2" width="531" height="20" backcolor="#C0D4EC" uuid="ce42b0b0-0d12-48c1-8020-576969255150"/>
        <graphicElement>
         <pen lineColor="#666666"/>
        </graphicElement>
       </rectangle>
       <staticText>
        <reportElement x="430" y="3" width="111" height="18" uuid="95b85246-2e67-42d0-9e41-987314cddba0"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Price $]]></text>
       </staticText>
       <staticText>
        <reportElement x="261" y="3" width="80" height="20" uuid="40050754-f800-4283-a0ed-64894f5652a2"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Unit Cost $]]></text>
       </staticText>
       <staticText>
        <reportElement x="10" y="3" width="50" height="20" uuid="299467fd-8d2b-48b0-af5b-769cc9d9bb37"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Item]]></text>
       </staticText>
       <staticText>
        <reportElement x="71" y="2" width="179" height="20" uuid="9818ad45-9dc2-4e62-821c-953f3801de84"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Description]]></text>
       </staticText>
       <staticText>
        <reportElement x="347" y="3" width="80" height="20" uuid="f10ae7d8-7499-404a-a1ab-a2ce63b22b3b"/>
        <textElement textAlignment="Center">
         <font size="12" isBold="false"/>
        </textElement>
        <text><![CDATA[Quantity]]></text>
       </staticText>
      </band>
     </columnHeader>
     <detail>
      <band height="29">
       <textField>
        <reportElement x="11" y="5" width="54" height="20" uuid="0cd6aa63-bd20-45fb-8543-51931badd2fc"/>
        <textElement textAlignment="Left"/>
        <textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="70" y="5" width="180" height="20" uuid="1be950c3-370a-43fa-9510-2ee8db740774"/>
        <textElement textAlignment="Left"/>
        <textFieldExpression><![CDATA[$F{description}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="261" y="5" width="80" height="20" uuid="3637c327-f832-4e7c-bb82-4cf41e607ca6"/>
        <textElement textAlignment="Left"/>
        <textFieldExpression><![CDATA[$F{unitCost}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="347" y="5" width="80" height="20" uuid="e9bfe6dc-7101-4d22-90a7-4766122c4e8a"/>
        <textElement textAlignment="Left"/>
        <textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression>
       </textField>
       <textField>
        <reportElement x="430" y="5" width="118" height="20" uuid="77c9d024-651d-4207-9f32-8637cd4dd449"/>
        <textElement textAlignment="Left"/>
        <textFieldExpression><![CDATA[$F{unitCost} * $F{quantity}]]></textFieldExpression>
       </textField>
      </band>
     </detail>
     <lastPageFooter>
      <band height="177">
       <staticText>
        <reportElement positionType="Float" x="-1" y="30" width="261" height="101" uuid="1a0d7088-5af7-4865-8be1-41ec5f51fb36"/>
        <box>
         <topPen lineWidth="1.1" lineStyle="Dashed"/>
         <leftPen lineWidth="1.1" lineStyle="Dashed"/>
         <bottomPen lineWidth="1.1" lineStyle="Dashed"/>
         <rightPen lineWidth="1.1" lineStyle="Dashed"/>
        </box>
        <text><![CDATA[Your notes here]]></text>
       </staticText>
       <staticText>
        <reportElement positionType="Float" mode="Opaque" x="0" y="147" width="556" height="30" backcolor="#E6E8E9" uuid="36aa233d-4305-48e6-974a-1bbf89bb3c8f"/>
        <textElement textAlignment="Center" verticalAlignment="Middle">
         <font fontName="Serif" size="9" isItalic="true"/>
        </textElement>
        <text><![CDATA[THANKYOU FOR YOUR BUSINESS]]></text>
       </staticText>
      </band>
     </lastPageFooter>
    </jasperReport>
  3. Создание класса Item, который будет объектом модели, содержащим данные, которые будут связаны с полями шаблона JRXML. Также я создал класс InvoiceDetails, в котором будут данные, которые будут связаны с параметрами шаблона JRXML.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    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
    package com.ithinkisink.model;
     
    /**
     *
     * @author Belal
     *
     */
    public class Item {
     
     private String itemNo;
     private String description;
     private double unitCost;
     private int quantity;
      
     public Item(String itemNo, String description, double unitCost, int quantity) {
      super();
      this.itemNo = itemNo;
      this.description = description;
      this.unitCost = unitCost;
      this.quantity = quantity;
     }
     
     public String getItemNo() {
      return itemNo;
     }
     
     public void setItemNo(String itemNo) {
      this.itemNo = itemNo;
     }
     
     public String getDescription() {
      return description;
     }
     
     public void setDescription(String description) {
      this.description = description;
     }
     
     public double getUnitCost() {
      return unitCost;
     }
     
     public void setUnitCost(double unitCost) {
      this.unitCost = unitCost;
     }
     
     public int getQuantity() {
      return quantity;
     }
     
     public void setQuantity(int quantity) {
      this.quantity = quantity;
     }
    }
  4. DynamicReportsManagedBean будет отвечать за подготовку карты параметров и источника JRBeanCollectionDataSource, содержащего List <Item>, который будет связан с полями JRXML.
    001
    002
    003
    004
    005
    006
    007
    008
    009
    010
    011
    012
    013
    014
    015
    016
    017
    018
    019
    020
    021
    022
    023
    024
    025
    026
    027
    028
    029
    030
    031
    032
    033
    034
    035
    036
    037
    038
    039
    040
    041
    042
    043
    044
    045
    046
    047
    048
    049
    050
    051
    052
    053
    054
    055
    056
    057
    058
    059
    060
    061
    062
    063
    064
    065
    066
    067
    068
    069
    070
    071
    072
    073
    074
    075
    076
    077
    078
    079
    080
    081
    082
    083
    084
    085
    086
    087
    088
    089
    090
    091
    092
    093
    094
    095
    096
    097
    098
    099
    100
    101
    package com.ithinkisink.managedbean;
     
    import static net.sf.dynamicreports.report.builder.DynamicReports.report;
     
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Map;
     
    import javax.annotation.PostConstruct;
    import javax.enterprise.context.SessionScoped;
    import javax.inject.Named;
    import javax.servlet.ServletContext;
     
    import net.sf.dynamicreports.report.exception.DRException;
    import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
     
    import com.ithinkisink.model.InvoiceDetails;
    import com.ithinkisink.model.Item;
     
    /**
     *
     * @author Belal
     *
     */
    @Named
    @SessionScoped
    public class DynamicReportsManagedBean implements Serializable {
     
     private static final long serialVersionUID = -1;
     
     private String invoiceName;
     private JRBeanCollectionDataSource beanCollectionDataSource;
     private Map<String, Object> parameters;
     
     @PostConstruct
     public void init() {
      invoiceName="Invoice.jrxml";
       
      List<Item> itemList = new ArrayList<>(Arrays.asList(
        new Item("01", "Item 01 description", 1.1, 1),
        new Item("02", "Item 02 description", 2.2, 2),
        new Item("03", "Item 03 description", 3.3, 3)));
      beanCollectionDataSource = new JRBeanCollectionDataSource(itemList);
       
      parameters = (new InvoiceDetails("INV#01", "Billing Company", "Billing Company Add",
        "Billing Company State 1", "Billing Company State 2",
        "Shipping Name", "Shipping Address", "Shipping State 1", "Shipping State 2", 1000)).toMap();
     }
      
     /**
      * Preparing an output stream of the generated PDF invoice.
      *
      * @return
      */
     public OutputStream getOS(ServletContext context, OutputStream outputStream) {
     
      parameters.put("IMAGE_PATH", context.getRealPath("/jasper/invoices"));
     
      InputStream is = context.getResourceAsStream("/jasper/invoices/" + invoiceName);
     
      try {
       report().setTemplateDesign(is)
         .setDataSource(beanCollectionDataSource)
         .setParameters(parameters).toPdf(outputStream);
      } catch (DRException e) {
       e.printStackTrace();
      }
     
      return outputStream;
     }
     
     // setters and getters
     public String getInvoiceName() {
      return invoiceName;
     }
     
     public void setInvoiceName(String invoiceName) {
      this.invoiceName = invoiceName;
     }
     
     public JRBeanCollectionDataSource getBeanCollectionDataSource() {
      return beanCollectionDataSource;
     }
     
     public void setBeanCollectionDataSource(
       JRBeanCollectionDataSource beanCollectionDataSource) {
      this.beanCollectionDataSource = beanCollectionDataSource;
     }
     
     public void setParameters(Map<String, Object> parameters) {
      this.parameters = parameters;
     }
     
     public Map<String, Object> getParameters() {
      return parameters;
     }
    }
  5. CDI позволяет нам внедрить экземпляр DynamicReportsManagedBean в DynamicReportsServlet. Сервлет будет обрабатывать поток вывода ответа, который будет представлять созданный поток вывода из DynamicReports шаблона.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    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
    package com.ithinkisink.servlet;
     
    import java.io.IOException;
    import java.io.OutputStream;
     
    import javax.inject.Inject;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    import com.ithinkisink.managedbean.DynamicReportsManagedBean;
     
    /**
     *
     * @author Belal
     *
     */
    public class DynamicReportsServlet extends HttpServlet {
     private static final long serialVersionUID = 1L;
     
     @Inject
     private DynamicReportsManagedBean dynamicReportsManagedBean;
      
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, IOException {
      resp.setContentType("application/pdf");
      OutputStream out = resp.getOutputStream();
      out = dynamicReportsManagedBean.getOS(getServletContext(), out);
      out.close();
     }
      
     @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
       throws ServletException, IOException {
      super.doPost(req, resp);
      this.doGet(req, resp);
     }
      
     public void setDynamicReportsManagedBean(
       DynamicReportsManagedBean dynamicReportsManagedBean) {
      this.dynamicReportsManagedBean = dynamicReportsManagedBean;
     }
      
     public DynamicReportsManagedBean getDynamicReportsManagedBean() {
      return dynamicReportsManagedBean;
     }
    }
  6. Я предпочитаю старую школу при добавлении сервлета в web.xml.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
     
     <display-name>DynamicReportsWithJSFServletsAndCDI Maven Webapp</display-name>
     
     <servlet>
      <description></description>
      <display-name>DynamicReportsServlet</display-name>
      <servlet-name>DynamicReportsServlet</servlet-name>
      <servlet-class>com.ithinkisink.servlet.DynamicReportsServlet</servlet-class>
     </servlet>
     <servlet-mapping>
      <servlet-name>DynamicReportsServlet</servlet-name>
      <url-pattern>/*</url-pattern>
     </servlet-mapping>
      
     <welcome-file-list>
      <welcome-file>/index.xhtml</welcome-file>
     </welcome-file-list>
    </web-app>
  7. Index.xhtml содержит <iframe>, который указывает на сервлет.
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    <!DOCTYPE html>
     
    <h:head>
     <title>DynamicReports with Servlets, JSF and CDI</title>
    </h:head>
     
    <h:body>
     <h:form>
      <iframe name="receipt" height="600" id="theIFrame" width="100%"
     </h:form>
    </h:body>
     
    </html>
  8. Окончательный вывод, запустив пример.

    1-DynamicReportsWithJSFServletsAndCDI