Shopping. JDBC, Datasource, Jasper Report. Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 12. Bedők Dávid v0.

Hasonló dokumentumok
Adatbázisok webalkalmazásokban

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

JavaServer Pages (JSP) (folytatás)

Adatbázis alapú rendszerek gyakorlat Adatbázis alapú alkalmazásfejlesztés Java, C# környezetben


Hello, EJB! Egy egyszerű példa

JEE tutorial. Zsíros Levente, 2012

A WEB programozása - JSP1 dr.gál Tibor őszi félév

MVC Java EE Java EE Kliensek JavaBeanek Java EE komponensek Web-alkalmazások Fejlesztői környezet. Java Web technológiák

JDBC - adatbáziskezelés

Segédanyag: Java alkalmazások gyakorlat

Hello World Servlet. Készítsünk egy szervletet, amellyel összeadhatunk két számot, és meghívásakor üdvözlőszöveget ír a konzolra.

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Stateless Session Bean

BookStore #gradle. Enterprise Application, Git, EJB, EAP/EAS, Logging, PostgreSQL/MySQL, JPA, Integration testing

abkezel.java import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.sql.*; public class abkezel extends JFrame {

SZÁMÍTÓGÉPES ADATBÁZIS-KEZELÉS. A MySQL adatbáziskezelő PHP folytatás JDBC, ODBC

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

MDAC - Microsoft Data Access Components

Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem

Programozási nyelvek Java

Adatbázis-kezelés ODBC driverrel

Enterprise JavaBeans. Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem. Az Enterprise JavaBeans

Segédanyag: Java alkalmazások gyakorlat

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

JAVA PROGRAMOZÁS 8.ELŐADÁS

OO PDO. Tehát PDO használatával, könnyen átállhatunk egy másik adatbáziskezelőre, anélkül hogy a kódot teljes egészében újraírnánk.

Vizuális programozás gyakorlat

B I T M A N B I v: T M A N

Junior Java Képzés. Tematika

MySQL kontra MongoDB programozás. SQL és NoSQL megközelítés egy konkrét példán keresztül

Kivételkezelés, naplózás. Exception handling, logging

Excel ODBC-ADO API. Tevékenységpontok: - DBMS telepítés. - ODBC driver telepítése. - DSN létrehozatala. -Excel-ben ADO bevonása

Szervlet-JSP együttműködés

Összetett JIRA adatbázis lekérdezések

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

Adatbázis használata PHP-ből

Enterprise JavaBeans 1.4 platform (EJB 2.0)

Szerializáció. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Szerializáció / 22

Kilencedik témakör: Lazarus-Firebird. Készítette: Dr. Kotsis Domokos

Bevezető. Servlet alapgondolatok

BookStore #maven. Enterprise Application, Git, EJB, EAP/EAS, Logging, PostgreSQL/MySQL, JPA, Integration testing

C# versus Java. Óbudai Egyetem, Java Standard Edition Mérnök Informatikus szak, BSc Labor 3. Bedők Dávid v0.4

C#, OOP. Osztályok tervezése C#-ban

ANDROID ALKALMAZÁSFEJLESZTÉS

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

Java Database Connectivity (JDBC)

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

Biztonság java web alkalmazásokban

Java és web programozás

JAVA webes alkalmazások

Programozási nyelvek Java

Adatbázis kezelés Delphiben. SQL lekérdezések

Java I. A Java programozási nyelv

A Java EE 5 plattform

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

OOP és UML Áttekintés

Abstract osztályok és interface-ek. 7-dik gyakorlat

Mobil Informatikai Rendszerek

Osztályok. 4. gyakorlat

Adatbázis Rendszerek II. 1. SQL programozási felületek 39/1B IT MAN

Java. Perzisztencia. ANTAL Margit. Java Persistence API. Object Relational Mapping. Perzisztencia. Entity components. ANTAL Margit.

Programozási technológia

Kliens oldali SQL-API

Bánsághi Anna

Szoftvertechnológia alapjai Java előadások

Magazine () Java Authentication and Authorization Service. Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 7.

Programozási nyelvek Java

Témák. JDBC Adatbázisok JDBC használatának lépései Tranzakciók Adatbázis tervezés EK diagram

BookStore #maven. Enterprise Application, Git, EJB, EAP/EAS, Logging, PostgreSQL/MySQL, JPA, Integration testing

Adatbázis rendszerek II. Adatbázis elérése C# kliens programból ADO.NET API-n keresztül

Java és web programozás

JNDI - alapok. Java Naming and Directory Interface

WCF, Entity Framework, ASP.NET, WPF 1. WCF service-t (adatbázissal Entity Framework) 2. ASP.NET kliens 3. WPF kliens

Adatbáziskezelés php-ben MySQL adatbáziskezelı rendszert használva

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

IBM WebSphere Adapters 7. változat 5. alváltozat. IBM WebSphere Adapter for Oracle E-Business Suite felhasználói kézikönyv 7. változat 5.

Mobil Informatikai Rendszerek

Access adatbázis elérése OLE DB-n keresztül

Magazine. Java Authentication and Authorization Services. Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 11

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

Java és web programozás

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP: Java 8.Gy: Abstract osztályok, interfészek

Web-fejlesztés NGM_IN002_1

Kompozit alkalmazások fejlesztése. IBM WebSphere Portal Server

Se S r e ial a iza z t a ion o n (in n Ja J v a a v ) a Szerializáció

Objektumorientált programozás C# nyelven

JDBC Adatbáziskapcsolat objektumok SQL parancsok küldése Kötegelt módosítások ResultSet Tranzakciók

DiskStore #maven. Remote EJB, JNDI, Dependency management, Service client, Context root, InitialContext, MyBatis 3

Oracle Containers for Java - j2ee alkalmazás szerver funkciók. Molnár Balázs Oracle Hungary

Lottery. WebLogic JMS, Jersey, JMX, JNDI. Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 8. Bedők Dávid v0.

Java Server Pages - JSP. Web Technológiák. Java Server Pages - JSP. JSP lapok életciklusa

Perzisztencia. ANTAL Margit. Sapientia - EMTE. ANTAL Margit Java technológiák 11. előadás Perzisztencia

Adatbázis rendszerek 7. előadás State of the art

Átírás:

Shopping JDBC, Datasource, Jasper Report Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 12 Bedők Dávid 2016.03.26. v0.2

Feladat Készítsünk el egy bevásárló listákat (számlákat) nyilvántartó alkalmazást, mely a tranzakciókat listázó webes felületből, és azok részleteit tartalmazó dinamikus PDF riportokból álljon. A persistence réteg ezúttal nélkülözze mind a JPA-t, mind egyéb JDBC library-ra épülő framework használatát (pl. MyBattis), natív JDBC lekérdezésekkel dolgozzunk, miközben természetesen a DataSource-ot a JBoss alkalmazás szerverben konfiguráljuk. Készítsünk el egy standalone Java alkalmazást is, mely véletlenszerű tranzakciók létrehozását legyen hívatott megoldani, szintén mindenféle JDBC-re épülő framework használata nélkül. 2

Ismeretszerzés A feladat során megismerkedünk a Java adatbáziskezelés alapvető építőkövével, a JDBC API használatával, mind standalone mind enterprise környezetben. A PDF riportok előállítását pedig a Jasper Report Library API-ját fogjuk megismerni, és az ireport alkalmazás használatába is betekintünk. 3

Projekt GIT \oejee\jboss\shopping Adatbázis: database\create-schema.sql Táblák: productcatalog product (FK: product_productcatalog_id) transaction item (FK: item_transaction_id, FK: item_product_id) 4

Stuktúra shopping (root project) sh-weblayer [WAR] webmodule sh-report [JAR] ejbmodule sh-loader (standalone) A zöld projektek részei az [EAR] deploymentnek. 5

Loader standalone alkalmazás A szokásos Java plugin gradle script elemeken kívül elsősorban a megfelelő JDBC driver-t kell elhelyeznünk a classpath-on. sh-loader/build.gradle dependencies { compile group: ' org.postgresql', name: ' postgresql', version: '9.4.1208. jre7' Csatlakozni és natív lekérdezéseket végrehajtani egy RDBMS adatbázison (melyhez van JDBC driver), nagyon egyszerű. A Java SE egyértelmű API-t biztosít mindehhez. Készítsünk el egy wrapper osztályt, mely kényelmesebbé teszi a csatlakozást és a lekérdezéseket (class DataService). 6

Csatlakozás public class DataService implements AutoCloseable { private static final String HOST = "localhost"; private static final int PORT = 5432; private final Connection connection; DataService.java A Class.forName(..) hívásra ma már nincs szükség, régebben ez inicializálta a JDBC driver-t, ma már a classloader ezt automatikusan megteszi. public DataService(String database, String user, String password) throws ClassNotFoundException, SQLException { Class.forName("org.postgresql.Driver"); this.connection = DriverManager.getConnection(this.buildJDBCUrl(database), user, password); this.connection.setautocommit(true); A kékkel jelzett adatok szükségesek a csatlakozáshoz, illetve a JDBC URI előállításához. private String buildjdbcurl(string database) { return "jdbc:postgresql://" + HOST + ":" + PORT + "/" + database; @Override public void close() { try { this.connection.close(); catch (SQLException e) { e.printstacktrace(); Az AutoCloseable interface megvalósításával hatékonyabbá tehetjük a kódunkat, hiszen kisebb lesz az esélye annak, hogy elfelejtjük lezárni a megnyitott kapcsolatot (Java 7). 7

Működés Ahhoz, hogy új tranzakciókat hozzunk létre, szükség lesz minden tranzakció esetén 1 transaction rekord, és néhány item rekord létrehozására. A tranzakció elemei már katalógusban lévő termékekre (product) hivatkoznak, ezek előzetes betöltése szükséges, majd ezek közül a betöltő alkalmazás véletlenül fog választani, hogy épp melyik kerül fel az aktuális számlára. A betöltött termékeket egy ProductCatalog példányban fogjuk tárolni, melyben egy listányi Product fog helyet kapni. Bár a JDBC nem type-safe, az alkalmazásunk sem lesz az, viszont a nem type-safe viselkedést kizárólag a beolvasás során szenvedjük el. 8

Termék modellje public class Product { private long id; private String name; private ProductCategory category; private double price; Product.java public Product(long id, String name, ProductCategory category, double price) { this.id = id; this.name = name; this.category = category; this.price = price; // getters/setters/tostring()... A ProductCatalog osztály egy List<Product>-ot kezel, melyet az add(long id, String name, ProductCategory category, double price) metódus segítségével tudunk bővíteni. public enum ProductCategory { BAKERY("bakery"), COLD_CUTS("cold cuts"), DAIRY_PRODUCTS("dairy products"), BAKING("baking"), HOUSEHOLD("household"); private final String label; private ProductCategory(String label) { this.label = label; public static ProductCategory fromlabel(string label) { ProductCategory.java Adatbázisban a label -nek megfelelő értékek találhatóak meg. Ezek beolvasás során a fromlabel() metódus segítségével tudnak majd az enum egy-egy értéke lenni. 9

Termékek betöltése public ProductCatalog loadproductcatalog() throws SQLException { final ProductCatalog catalog = new ProductCatalog(); Statement statement = null; ResultSet rs = null; try { statement = this.connection.createstatement(); DataService.java final String query = "SELECT product_id, product_name, productcategory_name, product_price FROM product INNER JOIN productcategory ON ( productcategory_id = product_productcategory_id )"; rs = statement.executequery(query); while (rs.next()) { final long id = rs.getlong("product_id"); final String name = rs.getstring("product_name"); final String categoryname = rs.getstring("productcategory_name"); final double price = rs.getdouble("product_price"); final ProductCategory category = ProductCategory.fromLabel(categoryName); catalog.add(id, name, category, price); catch (final SQLException e) { e.printstacktrace(); finally { if (rs!= null) { rs.close(); if (statement!= null) { statement.close(); return catalog; 10

Véletlen adatok generálása Az új tranzakció adatait pszeudo véletlen számok álal vezérelve fogjuk létrehozni. Ennek érdekében a projekt tartalmaz egy ContentGenerator osztály, mely képes az alábbi műveletekre: Date generatedate() - véletlen dátum int generatequantity() - véletlen mennyiség int generatenumberofitems() - véletlen darabszám String generatesentence() - véletlen mondat E segítségével már csupán egy item illetve egy transaction rekord beszúrását megvalósító metódust kell elkészíteni a DataService osztályba. 11

Tranzakció elem beszúrása public void additem(long transactionid, ProductCatalog catalog) throws SQLException { final String insertitem = "INSERT INTO item ( item_transaction_id, item_product_id, item_quantity ) VALUES (?,?,?)" ; PreparedStatement statement = this.connection.preparestatement(insertitem); statement.setlong(1, transactionid); statement.setlong(2, catalog.getrandomproduct().getid()); statement.setint(3, this.generator.generatequantity()); System.out.println(statement.toString()); DataService.java statement.executeupdate(); A tranzakció létrehozása után tudjuk ezt a metódust tetszőleges számban meghívni (annak érdekében, hogy a tranzakcióhoz bekössük a tételeket). 12

Tranzakció beszúrása public long addtransaction(final ProductCatalog catalog) throws SQLException { long transactionid = -1; final String inserttransaction = "INSERT INTO transaction ( transaction_date, transaction_comment ) VALUES (?,?)"; PreparedStatement statement = this.connection.preparestatement(inserttransaction, Statement.RETURN_GENERATED_KEYS); statement.setdate(1, this.generator.generatedate()); statement.setstring(2, this.generator.generatesentence()); System.out.println(statement.toString()); statement.executeupdate(); try (ResultSet generatedkeys = statement.getgeneratedkeys()) { if (generatedkeys.next()) { transactionid = generatedkeys.getlong(1); final int numberofitems = this.generator.generatenumberofitems(); DataService.java A RETURN_GENERATED_KEYS paraméter végett lesz lehetőségünk az insert során létrejött új ID-k utólagos lekérdezésére. for (int i = 0; i < numberofitems; i++) { this.additem(transactionid, catalog); return transactionid; Új elemek beszúrása. 13

Jasper Reports http://community.jaspersoft.com/ Library (verzió: 6.2.1): http://community.jaspersoft.com/project/jasperreports-library ireport (verzió: 5.6.0, tovább nem fejlesztik): http://community.jaspersoft.com/project/ireport-designer Jaspersoft Studio (verzió: 6.2.1): http://community.jaspersoft.com/project/jaspersoft-studio A riportokat előre egy e célra létrehozott alkalmazásban készítjük el. A riport része a natív lekérdezés, a paraméterek, és kinézet, grafikonok és egyéb allekérdezések, stb. Igen összetett riportok előállíthatóak e módon. Regisztrációt követően lehet letölteni A fenti komponensek ingyenesek Az ireport a régi riport készítő alkalmazás, mely kizárólag Java JRE 7-el működik, míg a Jaspersoft Studio az új termék (valójában egy Eclipse) erre a célra. Az ireport és a Jaspersoft Studio *.jrxml (forrás xml) állományok előállítására használható. Ennek lefordított változata a *.jasper állomány, melyet szintén lehet runtime használni (de runtime a *.jrxml-t le lehet fordítani *.jasper-re, így mi ezt az utat választjuk) (Megjegyzés: a *.jrxml verziókezelhető, lévén xml dokumentum, míg a jasper bináris). Ha dinamikus riportokra van szükség, a http://www.dynamicreports.org/ oldalt érdemes meglátogatni, mely egy kiegészítő Library a Jasper Reports-hoz 14

Riport létrehozása Főbb lépések: Adatbázis kapcsolat beállítása Riport nyelvének beállítása Java-ra (több lehetőség is van, pl. JavaScript, Groovy) Riport paramétereinek felvétele Riport lekérdezésének előállítása (a paraméterek itt használhatóak) Riport kinézetének, mezőinek felvitele Grafikonok, allekérdezések, subriportok elkészítése, stb. 15

Tranzakció részletek riport SELECT product_name, product_price, productcategory_name, item_quantity, ( product_price * item_quantity) AS total_price FROM item INNER JOIN product ON ( product_id = item_product_id ) INNER JOIN productcategory ON ( product_productcategory_id = productcategory_id ) WHERE ( 1 = 1 ) AND ( item_transaction_id = $P{TRANSACTION_ID ) A TRANSACTION_ID egy java.lang.long típusú paraméter. Mivel Java-ból fogjuk kezelni, Java típusok használhatóak (akár saját is). 16

JBoss - DataSource standalone.xml <datasource jndi-name=" java:jboss/datasources/shoppingds" pool-name=" ShoppingDSPool" enabled="true" use-java-context="true"> <connection-url> jdbc:postgresql://localhost:5432/shoppingdb</connectionurl> <driver> postgresql</driver> <security> <user-name> shopping_user</user-name> <password> 123topSECret321</password> </security> <validation> <check-valid-connection-sql>select 1</check-valid-connection-sql> <validate-on-match>true</validate-on-match> <background-validation>false</background-validation> </validation> <statement> <share-prepared-statements>false</share-prepared-statements> </statement> </datasource> 17

EJB számára erőforrás csatolása A DataSource is egyféle erőforrás (Resource) sh-report/src/main/resources/meta-inf/ejb-jar.xml <ejb-jar...> <enterprise-beans> <session> <ejb-name> ShoppingReport</ejb-name> <resource-ref> <res-ref-name> shopping-ds</res-ref-name> <res-type> javax.sql.datasource</res-type> </resource-ref> </session> </enterprise-beans> </ejb-jar> <jboss:ejb-jar...> <enterprise-beans> <session> <ejb-name> ShoppingReport</ejb-name> <resource-ref> <res-ref-name> shopping-ds</res-ref-name> <jndi-name> java:jboss/datasources/shoppingds</jndi-name> </resource-ref> </session> </enterprise-beans> </jboss:ejb-jar> Hivatkozunk az EJB nevére mindkét leíróban (ShoppingReport). A Java EE leíróban megadjuk az erőforrás típusát. sh-report/src/main/resources/meta-inf/jboss-ejb3.xml A JBoss specifikus leíróban hivatkozunk a JBossban konfigurált DataSource JNDI nevére. 18

ShoppingReport SLSB package hu.qwaevisz.shopping.report.service; ShoppingReportImpl.java import javax.sql.datasource; @Stateless(name = " ShoppingReport", mappedname = "ejb/shoppingreport") public class ShoppingReportImpl implements ShoppingReport { @Resource(name = " shopping-ds") private DataSource datasource;... A datasource birtokában már könnyen végrehajthatunk lekérdezéseket: Connection connection = this.datasource.getconnection(); Statement statement = connection.createstatement(); ResultSet rs = statement.executequery( "SELECT transaction_id FROM transaction"); while (rs.next()) {... 19

Tranzakciók listája - Query SELECT transaction_id, transaction_date, transaction_comment, ( SELECT COUNT(1) FROM item WHERE item_transaction_id = transaction_id ) AS number_of_items, ( SELECT SUM(item_quantity * product_price) FROM item Ez a lekérdezés bekerül a Java kódba. Számított mezőként lekérjük a tranzakcióhoz tartozó elemek darabszámát és teljes árát. INNER JOIN product ON ( product_id = item_product_id ) WHERE item_transaction_id = transaction_id ) AS total_price FROM transaction Az ilyen natív query-k a forráskódban gyakorlatilag időzített bombák. Nagyon nehéz őket egy komplex alkalmazás során karbantartni (válozik a schema, változnak az elnevezési szabályok, stb.). Minden hiba csak futás időben derül ki. Ilyen alkalmazások profi acceptance tesztek nélkül nagyon veszélyesek. 20

Tranzakciók listája EJB service @Override public List<Transaction> gettransactions() throws ReportException { Connection connection = null; Statement statement = null; ResultSet rs = null; try { final List<Transaction> transactions = new ArrayList<>(); connection = this.datasource.getconnection(); statement = connection.createstatement(); final String query = "..."; rs = statement.executequery(query); while (rs.next()) { final int id = rs.getint("transaction_id"); final Date date = rs.getdate("transaction_date"); final String comment = rs.getstring("transaction_comment"); final int numberofitems = rs.getint("number_of_items"); final int totalprice = rs.getint("total_price"); ShoppingReportImpl.java Az tranzakciókat egy e célra létrehozott Transaction osztályba helyezzük el, melyet az sh-weblayer project egyik servlet-e lekér és megjelenik. Minden sorban megjelenik a Report? id=${transaction.id link, mely egy a riportot előállító servlet-re mutat. transactions.add(new Transaction(id, date, comment, numberofitems, totalprice)); return transactions; catch (final SQLException e) { throw new ReportException(e.getLocalizedMessage()); finally { try { if (rs!= null) { rs.close(); if (statement!= null) { statement.close(); if (connection!= null) { connection.close(); catch (final SQLException e) { throw new ReportException(e.getLocalizedMessage()); 21

Report Servlet PDF Content Type ReportServlet.java @WebServlet(" /Report") public class ReportServlet extends HttpServlet { private static final Logger LOGGER = Logger.getLogger(ListController. class); @EJB private ShoppingReport report; @Override public void doget(httpservletrequest request, HttpServletResponse response) throws IOException { byte[] data = null; final long id = Long.valueOf(request.getParameter("id")); try { data = this.report.gettransactiondetailsreport(id); catch (final ReportException e) { LOGGER.error(e, e); response.setheader( "Content-disposition", "inline; filename=\"transactiondetails.pdf\""); response.setcontenttype( "application/pdf"); response.getoutputstream().write(data); A PDF riport byte-tömbként jön vissza az EJB service-től. Természetesen a Jasper Reportban van mód a PDF riport állományba mentésére is a szerver oldalon, majd ezt egy linkként kitenni a weboldalra, de elegánsabb dinamikus letöltést e módon végrehajtani. 22

Jasper Reports + Gradle sh-report/build.gradle dependencies { compile group: ' com.lowagie', name: ' itext', version: itextversion compile group: ' org.olap4j', name: ' olap4j', version: olap4jversion compile group: ' net.sf.jasperreports', name: 'jasperreports', version: jasperversion shopping root: build.gradle allprojects { repositories { Az itext nem érhető el a MavenCentral repository-ban. mavencentral() maven { url "http://repository.pentaho.org/artifactory/repo" dependencies { deploy project('sh-report') deploy project(path: 'sh-weblayer', configuration: 'archives') earlib group: 'com.lowagie', name: 'itext', version: itextversion earlib group: 'org.olap4j', name: 'olap4j', version: olap4jversion Ha nem készítünk Jboss module-t a Jasper számára, akkor at EAR lib könyvtárába csomagoljuk be. earlib group: 'net.sf.jasperreports', name: 'jasperreports', version: jasperversion 23

Jasper ReportHelper public class ReportHelper { ReportHelper.java JRXML fileból runtime JASPER állományt (JasperReport példány) állít elő. A JRXML file-okat az src/main/resources alá helyezzük el. public JasperReport compile(string jrxmlfilename)throws FileNotFoundException,JRException { InputStream inputstream = this.getclass().getclassloader().getresourceasstream (jrxmlfilename); JasperDesign jasperdesign = JRXmlLoader.load(inputStream); return JasperCompileManager.compileReport(jasperDesign); A JasperReport példányt kitölti az átadott adatbázis kapcsolat és paraméterek segítségével. A riport ezzel már memóriában elkészül (JasperPrint példány). public JasperPrint fill(jasperreport jasperreport, Connection connection, Map<String, Object> params) throws JRException { return JasperFillManager.fillReport(jasperReport, params, connection); A JasperExportManager sokféle exportálási lehetőséget kínál, sokféle formátumban. Számunkra most a PDF byte stream a legjobb választás. public byte[] exporttopdf(jasperprint jasperprint) throws JRException { return JasperExportManager.exportReportToPdf(jasperPrint); 24

Transaction Details EJB service ShoppingReportImpl.java @Override public byte[] gettransactiondetailsreport( long transactionid) throws ReportException { Transaction transaction = this.gettransaction(transactionid); try { ReportHelper reporthelper = new ReportHelper(); Connection connection = this.datasource.getconnection(); JasperReport report = reporthelper.compile( "reports/transaction-details. A paraméterek közül a jrxml"); TRANSACTION_ID a Map<String, Object> params = new HashMap<>(); lekérdezésben is szerepel. params.put("transaction_id", transaction.getid()); params.put("transaction_date", transaction.getdate()); params.put("transaction_comment", transaction.getcomment()); JasperPrint print = reporthelper.fill(report, connection, params); return reporthelper.exporttopdf(print); catch (SQLException FileNotFoundException JRException e) { LOGGER.error(e, e); throw new ReportException(e.getLocalizedMessage()); 25