В этом примере я покажу, как интегрировать DynamicReport и JasperReports с сервлетом и CDI.
Инструменты:
- TIBCO Jaspersoft Studio-6.0.4. Финал.
- Eclipse Luna Service Release 2 (4.4.2).
- Сервер приложений WildFly 8.x.
Это скриншот из иерархии проектов в Eclipse.
- Файл pom.xml содержит необходимые зависимости для сервлетов + JSF + CDI + DynamicReports.
01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"<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> - Создание простого шаблона JRXML с использованием TIBCO Jaspersoft Studio, содержащего изображение, которое будет динамически передавать его путь в качестве параметра из DynamicReportsManagedBean в DynamicReports позже.
001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
<?xmlversion="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 --><jasperReportxmlns="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"><propertyname="com.jaspersoft.studio.data.defaultdataadapter"value="One Empty Record"/><stylename="Title"forecolor="#FFFFFF"fontName="Times New Roman"fontSize="50"isBold="false"pdfFontName="Times-Bold"/><stylename="SubTitle"forecolor="#CCCCCC"fontName="Times New Roman"fontSize="18"isBold="false"pdfFontName="Times-Roman"/><stylename="Column header"forecolor="#666666"fontName="Times New Roman"fontSize="14"isBold="true"/><stylename="Detail"mode="Transparent"fontName="Times New Roman"/><stylename="Row"mode="Transparent"fontName="Times New Roman"pdfFontName="Times-Roman"><conditionalStyle><conditionExpression><![CDATA[$V{REPORT_COUNT}%2 == 0]]></conditionExpression><stylemode="Opaque"backcolor="#EEEFF0"/></conditionalStyle></style><stylename="Table"><box><penlineWidth="1.0"lineColor="#000000"/><topPenlineWidth="1.0"lineColor="#000000"/><leftPenlineWidth="1.0"lineColor="#000000"/><bottomPenlineWidth="1.0"lineColor="#000000"/><rightPenlineWidth="1.0"lineColor="#000000"/></box></style><stylename="Table_TH"mode="Opaque"backcolor="#FFFFFF"><box><penlineWidth="0.5"lineColor="#000000"/><topPenlineWidth="0.5"lineColor="#000000"/><leftPenlineWidth="0.5"lineColor="#000000"/><bottomPenlineWidth="0.5"lineColor="#000000"/><rightPenlineWidth="0.5"lineColor="#000000"/></box></style><stylename="Table_CH"mode="Opaque"backcolor="#CACED0"><box><penlineWidth="0.5"lineColor="#000000"/><topPenlineWidth="0.5"lineColor="#000000"/><leftPenlineWidth="0.5"lineColor="#000000"/><bottomPenlineWidth="0.5"lineColor="#000000"/><rightPenlineWidth="0.5"lineColor="#000000"/></box></style><stylename="Table_TD"mode="Opaque"backcolor="#FFFFFF"><box><penlineWidth="0.5"lineColor="#000000"/><topPenlineWidth="0.5"lineColor="#000000"/><leftPenlineWidth="0.5"lineColor="#000000"/><bottomPenlineWidth="0.5"lineColor="#000000"/><rightPenlineWidth="0.5"lineColor="#000000"/></box><conditionalStyle><conditionExpression><![CDATA[$V{REPORT_COUNT}%2 == 0]]></conditionExpression><stylebackcolor="#D8D8D8"/></conditionalStyle></style><subDatasetname="tableDataset"uuid="f13e6d36-5148-4ecc-bbe3-3035def80980"><queryString><![CDATA[]]></queryString></subDataset><parametername="invoiceNo"class="java.lang.String"/><parametername="billingCompanyName"class="java.lang.String"/><parametername="billingCompanyAddress"class="java.lang.String"/><parametername="billingCompanyFirstState"class="java.lang.String"/><parametername="billingCompanySecondState"class="java.lang.String"/><parametername="shippingName"class="java.lang.String"/><parametername="shippingAddress"class="java.lang.String"/><parametername="shippingFirstState"class="java.lang.String"/><parametername="shippingSecondState"class="java.lang.String"/><parametername="IMAGE_PATH"class="java.lang.String"/><queryStringlanguage="SQL"><![CDATA[]]></queryString><fieldname="itemNo"class="java.lang.String"/><fieldname="description"class="java.lang.String"/><fieldname="unitCost"class="java.lang.Double"/><fieldname="quantity"class="java.lang.Integer"/><groupname="Gruppo1"><groupExpression><![CDATA[(int)($V{REPORT_COUNT}/15)]]></groupExpression><groupHeader><band/></groupHeader><groupFooter><band><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></band></groupFooter></group><title><bandheight="196"splitType="Stretch"><staticText><reportElementx="0"y="90"width="84"height="25"uuid="57aed2b1-4f4e-40a3-a6ad-54dae8dd4c5a"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textElement><fontsize="16"isBold="true"/></textElement><text><![CDATA[Bill to:]]></text></staticText><line><reportElementx="0"y="80"width="556"height="1"uuid="806ce5df-1219-4876-ae0c-ca7405b1f246"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement></line><staticText><reportElementx="400"y="90"width="84"height="25"uuid="139ebe8d-25b0-411e-986c-270015400874"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textElement><fontsize="16"isBold="true"/></textElement><text><![CDATA[Ship to:]]></text></staticText><staticText><reportElementx="415"y="10"width="50"height="20"uuid="0f86baff-6386-4f3f-b3fe-2388707babe8"/><boxrightPadding="4"/><textElementtextAlignment="Right"/><text><![CDATA[Date:]]></text></staticText><textFieldpattern="EEEEE dd MMMMM yyyy"><reportElementx="465"y="10"width="84"height="20"uuid="bb10dbe1-0a4f-4722-9953-c163b63cf979"/><textFieldExpression><![CDATA[new java.util.Date()]]></textFieldExpression></textField><imagehAlign="Center"><reportElementx="0"y="0"width="65"height="60"uuid="94883631-a913-43e2-b182-ab8d77d0181e"/><imageExpression><![CDATA[$P{IMAGE_PATH} + "/invoice_logo.png"]]></imageExpression></image><textFieldpattern="EEEEE dd MMMMM yyyy"><reportElementx="465"y="30"width="84"height="20"uuid="3836ce65-eca3-4cad-a6de-b1818def0a2b"/><textFieldExpression><![CDATA[$P{invoiceNo}]]></textFieldExpression></textField><staticText><reportElementx="415"y="30"width="50"height="20"uuid="0b3f9342-da78-4cfa-9fc5-2301c4749678"/><boxrightPadding="4"/><textElementtextAlignment="Right"/><text><![CDATA[Invoice #]]></text></staticText><staticText><reportElementx="95"y="0"width="210"height="25"uuid="e622555d-198b-4ccd-a4a1-c59c53304058"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textElement><fontsize="19"isBold="true"/></textElement><text><![CDATA[I think, I sink!]]></text></staticText><staticText><reportElementx="95"y="55"width="205"height="15"uuid="b8cc42fd-b569-497d-834d-7e854040ad18"/><text><![CDATA[+20 10 000 0000]]></text></staticText><staticText><reportElementx="95"y="25"width="205"height="15"uuid="c226e44d-3bb5-4145-b0b3-903bf1d79fde"/><text><![CDATA[Sesame street]]></text></staticText><staticText><reportElementx="95"y="40"width="205"height="15"uuid="b96f7183-44f8-43ad-ba60-43d8fbf50b6e"/><text><![CDATA[Sesame city]]></text></staticText><textField><reportElementx="0"y="115"width="150"height="15"uuid="7e9e0af2-08d1-4997-b3e1-971e74b1c8ad"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{billingCompanyName}]]></textFieldExpression></textField><textField><reportElementx="0"y="130"width="150"height="15"uuid="a0eaddab-ed2f-46fc-b9fc-d0d9747c6df3"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{billingCompanyAddress}]]></textFieldExpression></textField><textField><reportElementx="0"y="145"width="150"height="15"uuid="f9371f1e-125e-408d-a0f0-aa0ea5adc171"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{billingCompanyFirstState}]]></textFieldExpression></textField><textField><reportElementx="0"y="160"width="150"height="15"uuid="c14d7758-80e6-45d7-8526-797330e515d3"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{billingCompanySecondState}]]></textFieldExpression></textField><textField><reportElementx="400"y="160"width="140"height="15"uuid="a9baefea-45b3-4826-a81e-3572507eea6d"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{shippingSecondState}]]></textFieldExpression></textField><textField><reportElementx="400"y="145"width="140"height="15"uuid="338e1f40-9a03-4b77-aedc-568b1907628b"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{shippingFirstState}]]></textFieldExpression></textField><textField><reportElementx="400"y="130"width="140"height="15"uuid="54e6473f-44ef-4839-8f87-29e65af72561"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{shippingAddress}]]></textFieldExpression></textField><textField><reportElementx="400"y="115"width="140"height="15"uuid="1f093c2e-2d6f-403e-9c11-160dbaf82e6f"><propertyname="local_mesure_unitheight"value="pixel"/><propertyname="com.jaspersoft.studio.unit.height"value="px"/></reportElement><textFieldExpression><![CDATA[$P{shippingName}]]></textFieldExpression></textField></band></title><columnHeader><bandheight="24"><staticText><reportElementx="366"y="4"width="80"height="20"uuid="be792358-dade-4931-965d-fe4d4958b71c"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Quantity]]></text></staticText><rectangle><reportElementmode="Opaque"x="10"y="2"width="531"height="20"backcolor="#C0D4EC"uuid="ce42b0b0-0d12-48c1-8020-576969255150"/><graphicElement><penlineColor="#666666"/></graphicElement></rectangle><staticText><reportElementx="430"y="3"width="111"height="18"uuid="95b85246-2e67-42d0-9e41-987314cddba0"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Price $]]></text></staticText><staticText><reportElementx="261"y="3"width="80"height="20"uuid="40050754-f800-4283-a0ed-64894f5652a2"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Unit Cost $]]></text></staticText><staticText><reportElementx="10"y="3"width="50"height="20"uuid="299467fd-8d2b-48b0-af5b-769cc9d9bb37"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Item]]></text></staticText><staticText><reportElementx="71"y="2"width="179"height="20"uuid="9818ad45-9dc2-4e62-821c-953f3801de84"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Description]]></text></staticText><staticText><reportElementx="347"y="3"width="80"height="20"uuid="f10ae7d8-7499-404a-a1ab-a2ce63b22b3b"/><textElementtextAlignment="Center"><fontsize="12"isBold="false"/></textElement><text><![CDATA[Quantity]]></text></staticText></band></columnHeader><detail><bandheight="29"><textField><reportElementx="11"y="5"width="54"height="20"uuid="0cd6aa63-bd20-45fb-8543-51931badd2fc"/><textElementtextAlignment="Left"/><textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression></textField><textField><reportElementx="70"y="5"width="180"height="20"uuid="1be950c3-370a-43fa-9510-2ee8db740774"/><textElementtextAlignment="Left"/><textFieldExpression><![CDATA[$F{description}]]></textFieldExpression></textField><textField><reportElementx="261"y="5"width="80"height="20"uuid="3637c327-f832-4e7c-bb82-4cf41e607ca6"/><textElementtextAlignment="Left"/><textFieldExpression><![CDATA[$F{unitCost}]]></textFieldExpression></textField><textField><reportElementx="347"y="5"width="80"height="20"uuid="e9bfe6dc-7101-4d22-90a7-4766122c4e8a"/><textElementtextAlignment="Left"/><textFieldExpression><![CDATA[$F{quantity}]]></textFieldExpression></textField><textField><reportElementx="430"y="5"width="118"height="20"uuid="77c9d024-651d-4207-9f32-8637cd4dd449"/><textElementtextAlignment="Left"/><textFieldExpression><![CDATA[$F{unitCost} * $F{quantity}]]></textFieldExpression></textField></band></detail><lastPageFooter><bandheight="177"><staticText><reportElementpositionType="Float"x="-1"y="30"width="261"height="101"uuid="1a0d7088-5af7-4865-8be1-41ec5f51fb36"/><box><topPenlineWidth="1.1"lineStyle="Dashed"/><leftPenlineWidth="1.1"lineStyle="Dashed"/><bottomPenlineWidth="1.1"lineStyle="Dashed"/><rightPenlineWidth="1.1"lineStyle="Dashed"/></box><text><![CDATA[Your notes here]]></text></staticText><staticText><reportElementpositionType="Float"mode="Opaque"x="0"y="147"width="556"height="30"backcolor="#E6E8E9"uuid="36aa233d-4305-48e6-974a-1bbf89bb3c8f"/><textElementtextAlignment="Center"verticalAlignment="Middle"><fontfontName="Serif"size="9"isItalic="true"/></textElement><text><![CDATA[THANKYOU FOR YOUR BUSINESS]]></text></staticText></band></lastPageFooter></jasperReport> - Создание класса Item, который будет объектом модели, содержащим данные, которые будут связаны с полями шаблона JRXML. Также я создал класс InvoiceDetails, в котором будут данные, которые будут связаны с параметрами шаблона JRXML.
010203040506070809101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
packagecom.ithinkisink.model;/**** @author Belal**/publicclassItem {privateString itemNo;privateString description;privatedoubleunitCost;privateintquantity;publicItem(String itemNo, String description,doubleunitCost,intquantity) {super();this.itemNo = itemNo;this.description = description;this.unitCost = unitCost;this.quantity = quantity;}publicString getItemNo() {returnitemNo;}publicvoidsetItemNo(String itemNo) {this.itemNo = itemNo;}publicString getDescription() {returndescription;}publicvoidsetDescription(String description) {this.description = description;}publicdoublegetUnitCost() {returnunitCost;}publicvoidsetUnitCost(doubleunitCost) {this.unitCost = unitCost;}publicintgetQuantity() {returnquantity;}publicvoidsetQuantity(intquantity) {this.quantity = quantity;}} - DynamicReportsManagedBean будет отвечать за подготовку карты параметров и источника JRBeanCollectionDataSource, содержащего List <Item>, который будет связан с полями JRXML.
001002003004005006007008009010011012013014015016017018019020021022023024025026027028029030031032033034035036037038039040041042043044045046047048049050051052053054055056057058059060061062063064065066067068069070071072073074075076077078079080081082083084085086087088089090091092093094095096097098099100101
packagecom.ithinkisink.managedbean;importstaticnet.sf.dynamicreports.report.builder.DynamicReports.report;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.List;importjava.util.Map;importjavax.annotation.PostConstruct;importjavax.enterprise.context.SessionScoped;importjavax.inject.Named;importjavax.servlet.ServletContext;importnet.sf.dynamicreports.report.exception.DRException;importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource;importcom.ithinkisink.model.InvoiceDetails;importcom.ithinkisink.model.Item;/**** @author Belal**/@Named@SessionScopedpublicclassDynamicReportsManagedBeanimplementsSerializable {privatestaticfinallongserialVersionUID = -1;privateString invoiceName;privateJRBeanCollectionDataSource beanCollectionDataSource;privateMap<String, Object> parameters;@PostConstructpublicvoidinit() {invoiceName="Invoice.jrxml";List<Item> itemList =newArrayList<>(Arrays.asList(newItem("01","Item 01 description",1.1,1),newItem("02","Item 02 description",2.2,2),newItem("03","Item 03 description",3.3,3)));beanCollectionDataSource =newJRBeanCollectionDataSource(itemList);parameters = (newInvoiceDetails("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*/publicOutputStream 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();}returnoutputStream;}// setters and getterspublicString getInvoiceName() {returninvoiceName;}publicvoidsetInvoiceName(String invoiceName) {this.invoiceName = invoiceName;}publicJRBeanCollectionDataSource getBeanCollectionDataSource() {returnbeanCollectionDataSource;}publicvoidsetBeanCollectionDataSource(JRBeanCollectionDataSource beanCollectionDataSource) {this.beanCollectionDataSource = beanCollectionDataSource;}publicvoidsetParameters(Map<String, Object> parameters) {this.parameters = parameters;}publicMap<String, Object> getParameters() {returnparameters;}} - CDI позволяет нам внедрить экземпляр DynamicReportsManagedBean в DynamicReportsServlet. Сервлет будет обрабатывать поток вывода ответа, который будет представлять созданный поток вывода из DynamicReports шаблона.
01020304050607080910111213141516171819202122232425262728293031323334353637383940414243444546474849
packagecom.ithinkisink.servlet;importjava.io.IOException;importjava.io.OutputStream;importjavax.inject.Inject;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.ithinkisink.managedbean.DynamicReportsManagedBean;/**** @author Belal**/publicclassDynamicReportsServletextendsHttpServlet {privatestaticfinallongserialVersionUID = 1L;@InjectprivateDynamicReportsManagedBean dynamicReportsManagedBean;@OverrideprotectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {resp.setContentType("application/pdf");OutputStream out = resp.getOutputStream();out = dynamicReportsManagedBean.getOS(getServletContext(), out);out.close();}@OverrideprotectedvoiddoPost(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {super.doPost(req, resp);this.doGet(req, resp);}publicvoidsetDynamicReportsManagedBean(DynamicReportsManagedBean dynamicReportsManagedBean) {this.dynamicReportsManagedBean = dynamicReportsManagedBean;}publicDynamicReportsManagedBean getDynamicReportsManagedBean() {returndynamicReportsManagedBean;}} - Я предпочитаю старую школу при добавлении сервлета в web.xml.
01020304050607080910111213141516171819202122
<?xmlversion="1.0"encoding="UTF-8"?>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> - Index.xhtml содержит <iframe>, который указывает на сервлет.
01020304050607080910111213141516
<!DOCTYPEhtml><h:head><title>DynamicReports with Servlets, JSF and CDI</title></h:head><h:body><h:form><iframename="receipt"height="600"id="theIFrame"width="100%"</h:form></h:body></html> - Окончательный вывод, запустив пример.
- Вы можете найти полный пример на моем Github по этой ссылке: https://github.com/belalgalal/Blogging/tree/master/DynamicReportsWithJSFServletsAndCDI
| Ссылка: | DynamicReports и JasperReports с JSF, Servlet и CDI от нашего партнера JCG Белала Галала в « Я думаю, я потону»! блог. |

