Over a million developers have joined DZone.

DynamicReports and JasperReports With JSF, Servlet and CDI

Eight steps is all it takes to integrate JasperReports and DynamicReports with Java EE servlet and CDI.

· Java Zone

Check out this 8-step guide to see how you can increase your productivity by skipping slow application redeploys and by implementing application profiling, as you code! Brought to you in partnership with ZeroTurnaround.

In this example, I will show how to integrate DynamicReports and JasperReports with Servlet and CDI.

Tools:

  • TIBCO Jaspersoft Studio-6.0.4.final.
  • Eclipse  Luna Service Release 2 (4.4.2).
  • WildFly 8.x application server.

This is a screenshot from the project hierarchy on Eclipse.

Project Hierarchy


1- The pom.xml file contains the required dependencies for the Servlets + JSF + CDI + DynamicReports.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <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- Creating a simple JRXML template using the TIBCO Jaspersoft Studio containing an image that will pass its path dynamically as a parameter from the DynamicReportsManagedBean to the DynamicReports later on.

<?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- Creating an Item class that will be the model object containing the data that be binded to the JRXML template fields. Also, I created an InvoiceDetails class that will have the data that will be binded to the JRXML template parameters.

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- The DynamicReportsManagedBean will be responsible to prepare the parameters map and the JRBeanCollectionDataSource containing List<Item> that will be binded to the JRXML fields.

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- The CDI enables us to inject an instance of the DynamicReportsManagedBean  to the DynamicReportsServlet. The servlet will handle the response output stream which will present the created output stream from the DynamicReports of the template.

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- I prefer the old school in adding the servlet to the web.xml.

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

 <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- The index.xhtml contains an <iframe> that points to the servlet.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:h="http://java.sun.com/jsf/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%"
   src="http://localhost:8080/DynamicReportsWithJSFServletsAndCDI" />
 </h:form>
</h:body>

</html>

8- The final output by running the example.

Result

You can find the complete example on my Github from this link:
https://github.com/belalgalal/Blogging/tree/master/DynamicReportsWithJSFServletsAndCDI

The Java Zone is brought to you in partnership with ZeroTurnaround. Check out this 8-step guide to see how you can increase your productivity by skipping slow application redeploys and by implementing application profiling, as you code!

Topics:
jsf ,servlet ,cdi ,java ee ,reporting

Published at DZone with permission of Belal Galal. See the original article here.

Opinions expressed by DZone contributors are their own.

The best of DZone straight to your inbox.

SEE AN EXAMPLE
Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.
Subscribe

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}