Hlásenie BIRT s Spring Boot

1. Úvod

V tomto výučbe začneme integrovať BIRT (Business Intelligence and Reporting Tools) s Spring Boot MVC, aby sme poskytovali statické a dynamické správy vo formáte HTML a PDF.

2. Čo je BIRT?

BIRT je motor s otvoreným zdrojom na vytváranie vizualizácií údajov ktoré je možné integrovať do webových aplikácií Java.

Je to softvérový projekt najvyššej úrovne v rámci Eclipse Foundation a využíva príspevky spoločností IBM a Innovent Solutions. Program Actuate začal a sponzoroval na konci roka 2004.

Rámec umožňuje vytvárať správy integrované so širokou škálou zdrojov údajov.

3. Závislosti Maven

BIRT má dve hlavné komponenty: vizuálny návrhár zostáv na vytváranie súborov návrhov zostavy a runtime komponent za tlmočenie a vykreslenie týchto dizajnov.

V našej ukážkovej webovej aplikácii použijeme oboje nad Spring Boot.

3.1. Závislosti rámca BIRT

Pretože sme si už zvykli myslieť na správu závislostí, prvou voľbou bude hľadať BIRT v Maven Central.

Avšak najnovšia oficiálna verzia základnej knižnice, ktorá je k dispozícii, je 4.6 z roku 2016, zatiaľ čo na stránke sťahovania Eclipse nájdeme odkazy na najmenej dve novšie verzie (súčasný je 4,8).

Ak sa rozhodneme pre oficiálne zostavenie, najjednoduchší spôsob, ako spustiť kód, je stiahnuť si balík BIRT Report Engine, čo je kompletná webová aplikácia, ktorá je tiež užitočná na učenie. Potom musíme skopírovať lib zložku do nášho projektu (veľkosť asi 68 MB) a povedzte IDE, aby do nej zahrnula všetky tégliky.

Je samozrejmé, že pomocou tohto prístupu budeme môcť kompilovať iba cez IDE, pretože Maven nenájde tieto poháre, pokiaľ ich nenakonfigurujeme a nenainštalujeme ručne (viac ako 100 súborov!) v našom miestnom úložisku.

Našťastie Spoločnosť Innovent Solutions sa rozhodla vziať veci do svojich rúk a na Maven Central zverejnila svoje vlastné zostavy najnovších závislostí BIRT, čo je skvelé, pretože pre nás spravuje všetky potrebné závislosti.

Po prečítaní komentárov na online fórach nie je jasné, či sú tieto artefakty pripravené na výrobu, ale spoločnosť Innovent Solutions od začiatku pracovala na projekte vedľa tímu Eclipse, takže sa na ne náš projekt spolieha.

Zahrnutie BIRT je teraz veľmi jednoduché:

 com.innoventsolutions.birt.runtime org.eclipse.birt.runtime_4.8.0-20180626 4.8.0 

3.2. Závislosti jarného zavedenia

Teraz, keď je BIRT importovaný do nášho projektu, stačí do nášho súboru pom pridať štandardné závislosti Spring Boot.

Je tu však jedna nástraha, pretože nádoba BIRT obsahuje vlastnú implementáciu Slf4J, s ktorým sa nehrá pekne Logback a pri štarte hodí výnimku z konfliktu.

Pretože ho nemôžeme vybrať z nádoby, aby sme tento problém vyriešili, musíme vylúčiť Logback:

 org.springframework.boot spring-boot-starter-loging ch.qos.logback logback-classic 

Teraz sme konečne pripravení začať!

4. Správy BIRT

V rámci BIRT správa je dlhý konfiguračný súbor XML, identifikované príponou rptdesign.

Hovorí motoru, čo a kde má čerpať, od štýlu nadpisu až po požadované vlastnosti na pripojenie k zdroju údajov.

Pre základný dynamický prehľad musíme nakonfigurovať tri veci:

  1. zdroj údajov (v našom príklade používame lokálny súbor CSV, ale ľahko by to mohla byť databázová tabuľka)
  2. prvky, ktoré chceme zobraziť (grafy, tabuľky atď.)
  3. návrh stránky

Správa je štruktúrovaná ako stránka HTML s hlavičkou, textom, pätou, skriptmi a štýlmi.

Rámec poskytuje rozsiahlu sadu komponentov, z ktorých si môžete vybrať ihneď po vybalení, vrátane integrácie do bežných zdrojov údajov, rozložení, grafov a tabuliek. A môžeme ju rozšíriť a pridať vlastnú!

Súbor správy možno vygenerovať dvoma spôsobmi: vizuálnym alebo programovým.

5. Návrhár Eclipse Report

Na uľahčenie vytvárania prehľadov tím Eclipse vytvoril nástroj na návrh správy doplnok pre svoje populárne IDE.

Tento nástroj má jednoduché rozhranie drag & drop z Paleta vľavo, ktoré automaticky otvorí okno nastavenia pre nový komponent, ktorý pridáme na stránku. Všetky prispôsobenia dostupné pre každý komponent tiež zobrazíme kliknutím na tento odkaz na stránke a potom na ikonu Editor nehnuteľností tlačidlo (zvýraznené na obrázku nižšie).

Na vizualizáciu celej štruktúry stránky v stromovom zobrazení stačí kliknúť na ikonu Obrys tlačidlo.

The Prieskumník údajov Záložka obsahuje aj zdroje údajov definované pre náš prehľad:

Vzorovú správu zobrazenú na obrázku nájdete na ceste /reports/csv_data_report.rptdesign

Ďalšou výhodou vizuálneho dizajnéra je online dokumentácia, ktorá sa namiesto programového prístupu zameriava viac na tento nástroj.

Ak už Eclipse používame, stačí si nainštalovať doplnok BIRT Report Design, ktorý obsahuje preddefinovanú perspektívu a vizuálny editor.

Pre tých vývojárov, ktorí momentálne nepoužívajú Eclipse a nechce sa ti prepínať, je tu balíček Eclipse Report Designer, ktorá spočíva v prenosnej inštalácii Eclipse s predinštalovaným doplnkom BIRT.

Po dokončení súboru správy ho môžeme uložiť do nášho projektu a vrátiť sa ku kódovaniu v našom preferovanom prostredí.

6. Programový prístup

Môžeme tiež navrhnúť správu iba s použitím kódu, ale tento prístup je oveľa ťažší kvôli zlej dostupnej dokumentácii, takže buďte pripravení kopať do zdrojových kódov a online fór.

Za zváženie tiež stojí, že všetky zdĺhavé dizajnové detaily ako je veľkosť, dĺžka a pozícia mriežky s dizajnérom sa riešia oveľa ľahšie.

Na preukázanie tohto bodu je tu príklad toho, ako definovať jednoduchú statickú stránku s obrázkom a textom:

DesignElementHandle element = factory.newSimpleMasterPage ("Predloha stránky"); design.getMasterPages (). add (prvok); GridHandle grid = factory.newGridItem (null, 2, 1); design.getBody (). add (mriežka); grid.setWidth ("100%"); RowHandle row0 = (RowHandle) grid.getRows (). Get (0); ImageHandle image = factory.newImage (null); CellHandle cell = (CellHandle) row0.getCells (). Get (0); cell.getContent (). add (obrázok); image.setURL ("\" // www.baeldung.com/wp-content/themes/baeldung/favicon/favicon-96x96.png \ ""); LabelHandle label = factory.newLabel (null); cell = (CellHandle) row0.getCells (). get (1); cell.getContent (). add (štítok); label.setText („Ahoj, svet Baeldung!“);

Tento kód vygeneruje jednoduchý (škaredý) prehľad:

Vzorovú správu zobrazenú na obrázku vyššie nájdete na tejto ceste: /reports/static_report.rptdesign.

Keď máme zakódované, ako má prehľad vyzerať a aké údaje by mal zobrazovať, môžeme vygenerovať súbor XML spustením našej ReportDesignApplication trieda.

7. Pripojenie zdroja údajov

Už sme spomenuli, že BIRT podporuje mnoho rôznych zdrojov údajov.

Pre náš ukážkový projekt sme použili jednoduchý súbor CSV s tromi položkami. Nachádza sa v správy priečinok a skladá sa z troch jednoduchých riadkov údajov a hlavičiek:

Študent, matematika, geografia, zákon o histórii, 10,3,8 Tom, 5,6,5 Anne, 7, 4,9

7.1. Konfigurácia zdroja údajov

Aby spoločnosť BIRT mohla použiť náš súbor (alebo akýkoľvek iný typ zdroja), musíme nakonfigurovať a Dátový zdroj.

Pre náš súbor sme vytvorili a Zdroj plochých súborov s návrhárom správ, všetko iba v niekoľkých krokoch:

  1. Otvorte dizajnérsku perspektívu a pozrite sa na obrys napravo.
  2. Kliknite pravým tlačidlom myši na ikonu Zdroje dát ikona.
  3. Vyberte požadovaný typ zdroja (v našom prípade plochý zdrojový súbor).
  4. Teraz môžeme zvoliť, či chcete načítať celý priečinok alebo iba jeden súbor. Použili sme druhú možnosť (ak je náš údajový súbor vo formáte CSV, chceme ako indikátor názvu stĺpca použiť prvý riadok).
  5. Vyskúšajte pripojenie a uistite sa, že je cesta správna.

Priložili sme niekoľko obrázkov, ktoré zobrazujú jednotlivé kroky:

7.2. Súbor údajov

Zdroj údajov je pripravený, ale stále musíme definovať ten náš Súbor údajov, čo sú skutočné údaje uvedené v našom prehľade:

  1. Otvorte dizajnérsku perspektívu a pozrite sa na obrys napravo.
  2. Kliknite pravým tlačidlom myši na ikonu Sady údajov ikona.
  3. Vyberte požadované Dátový zdroj a typ (v našom prípade existuje iba jeden typ).
  4. Ďalšia obrazovka závisí od typu zdroja údajov a súboru údajov, ktoré sme vybrali: v našom prípade sa nám zobrazí stránka, kde môžeme vybrať stĺpce, ktoré sa majú zahrnúť.
  5. Po dokončení nastavenia môžeme konfiguráciu kedykoľvek otvoriť dvojitým kliknutím na našu množinu údajov.
  6. V Výstupné stĺpce, môžeme nastaviť správny typ zobrazovaných údajov.
  7. Potom sa môžeme pozrieť na ukážku kliknutím na Zobraziť ukážku výsledkov.

Opäť niekoľko obrázkov na objasnenie týchto krokov:

7.3. Ďalšie typy zdrojov údajov

Ako bolo uvedené v kroku 4 dokumentu Súbor údajov konfigurácia, dostupné možnosti sa môžu meniť v závislosti od Dátový zdroj uvedené.

Pre náš súbor CSV dáva BIRT možnosti týkajúce sa toho, ktoré stĺpce sa majú zobraziť, dátového typu a či chceme načítať celý súbor. Na druhej strane, ak by sme mali zdroj údajov JDBC, možno budeme musieť napísať dotaz SQL alebo uloženú procedúru.

Z Sady údajov Ponuka, môžeme tiež spojiť dva alebo viac súborov údajov do nového súboru údajov.

8. Vykreslenie správy

Keď je súbor správy pripravený, musíme ho odovzdať motoru na vykreslenie. K tomu je potrebné implementovať niekoľko vecí.

8.1. Inicializácia motora

The ReportEngine trieda, ktorá interpretuje návrhové súbory a generuje konečný výsledok, je súčasťou runtime knižnice BIRT.

Na vykonávanie tejto práce využíva veľa pomocníkov a úloh, vďaka čomu je dosť náročná na zdroje:

Zdroj obrázku: Dokumentácia k Eclipse BIRT

S vytvorením inštancie modulu sú spojené značné náklady, hlavne kvôli nákladom na načítanie rozšírení. Preto mali by sme vytvoriť iba jeden ReportEngine inštanciu a použite ju na spustenie viacerých prehľadov.

Motor správ je vytvorený prostredníctvom továrne dodanej spoločnosťou Plošina. Pred vytvorením motora musíme naštartovať Plošina, ktorý načíta príslušné doplnky:

@PostConstruct protected void initialize () vyvolá BirtException {EngineConfig config = new EngineConfig (); config.getAppContext (). put ("jar", tento.kontext); Platform.startup (konfigurácia); IReportEngineFactory factory = (IReportEngineFactory) Platforma .createFactoryObject (IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY); birtEngine = factory.createReportEngine (config); imageFolder = System.getProperty ("user.dir") + File.separatorChar + reportsPath + imagesPath; loadReports (); }

Keď to už nepotrebujeme, môžeme ich zničiť:

@Override public void zničiť () {birtEngine.destroy (); Platform.shutdown (); }

8.2. Implementácia výstupného formátu

BIRT už podporuje viac výstupných formátov:HTML, PDF, PPT a ODT, vymenovať zopár.

Pre vzorový projekt sme implementovali dva z nich pomocou metód generovaťPDFReport a generovať HTMLReport.

Mierne sa líšia v závislosti od konkrétnych potrebných vlastností, ako sú napríklad výstupný formát a obslužné rutiny obrázkov.

V skutočnosti súbory PDF vkladajú obrázky spolu s textom, zatiaľ čo prehľady HTML ich musia generovať a / alebo prepojiť.

Teda funkcia vykresľovania PDF je celkom jednoduchá:

private void generatePDFReport (IReportRunnable report, HttpServletResponse response, HttpServletRequest request) {IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask (report); response.setContentType (birtEngine.getMIMEType ("pdf")); Možnosti IRenderOption = nový RenderOption (); PDFRenderOption pdfRenderOption = nový PDFRenderOption (možnosti); pdfRenderOption.setOutputFormat ("pdf"); runAndRenderTask.setRenderOption (pdfRenderOption); runAndRenderTask.getAppContext (). put (EngineConstants.APPCONTEXT_PDF_RENDER_CONTEXT, žiadosť); try {pdfRenderOption.setOutputStream (response.getOutputStream ()); runAndRenderTask.run (); } catch (Výnimka e) {hodiť novú RuntimeException (e.getMessage (), e); } nakoniec {runAndRenderTask.close (); }}

Zatiaľ čo funkcia vykresľovania HTML vyžaduje viac nastavení:

private void generateHTMLReport (IReportRunnable report, HttpServletResponse response, HttpServletRequest request) {IRunAndRenderTask runAndRenderTask = birtEngine.createRunAndRenderTask (report); response.setContentType (birtEngine.getMIMEType ("html")); Možnosti IRenderOption = nový RenderOption (); HTMLRenderOption htmlOptions = nový HTMLRenderOption (možnosti); htmlOptions.setOutputFormat ("html"); htmlOptions.setBaseImageURL ("/" + reportPath + imagesPath); htmlOptions.setImageDirectory (imageFolder); htmlOptions.setImageHandler (htmlImageHandler); runAndRenderTask.setRenderOption (htmlOptions); runAndRenderTask.getAppContext (). put (EngineConstants.APPCONTEXT_BIRT_VIEWER_HTTPSERVET_REQUEST, požiadavka); try {htmlOptions.setOutputStream (response.getOutputStream ()); runAndRenderTask.run (); } catch (Výnimka e) {hodiť novú RuntimeException (e.getMessage (), e); } nakoniec {runAndRenderTask.close (); }}

Najpozoruhodnejšie, nastavili sme HTMLServerImageHandler namiesto ponechania predvoleného obslužného programu. Tento malý rozdiel má veľký vplyv na vygenerované obr značka:

  • predvolený obslužný program spája odkazy obr tag do cesty k súborovému systému, blokovaný kvôli bezpečnosti mnohými prehľadávačmi
  • the HTMLServerImageHandler odkazy na URL servera

Vďaka setImageDirectory metódou určíme, kam motor vygenerovaný obrazový súbor uloží.

Štandardne obslužná rutina vygeneruje nový súbor na každú žiadosť, takže mohli by sme pridať vrstvu ukladania do pamäte cache alebo politiku odstraňovania.

8.3. Publikovanie obrázkov

V prípade správy HTML sú obrazové súbory externé, takže musia byť prístupné na ceste k serveru.

V kóde vyššie s setBaseImageURL metódou, povieme motoru, aká relatívna cesta by sa mala použiť v obr odkaz na značku, takže sa musíme ubezpečiť, že cesta je skutočne prístupná!

Z tohto dôvodu v našom ReportEngineApplication, nakonfigurovali sme Spring na zverejnenie snímky priečinok:

@SpringBootApplication @EnableWebMvc verejná trieda ReportEngineApplication implementuje WebMvcConfigurer {@Value ("$ {reports.relative.path}") súkromný reťazec reportsPath; @Value ("$ {images.relative.path}") private String imagesPath; ... @Override public void addResourceHandlers (register ResourceHandlerRegistry) {register .addResourceHandler (reportsPath + imagesPath + "/ **") .addResourceLocations ("file: ///" + System.getProperty ("user.dir") + " / "+ reportsPath + imagesPath); }}

Nech už si zvolíme ktorúkoľvek cestu, musíme sa uistiť, že sa rovnaká cesta používa tu aj v htmlMožnosti predchádzajúceho úryvku alebo náš prehľad nebude schopný zobraziť obrázky.

9. Zobrazenie správy

Posledným komponentom potrebným na prípravu našej aplikácie je a Kontrolór vrátiť vykreslený výsledok:

@RequestMapping (method = RequestMethod.GET, value = "/ report / {name}") @ResponseBody public void generateFullReport (odpoveď HttpServletResponse, požiadavka HttpServletRequest, @PathVariable ("názov") Názov reťazca, @RequestParam ("výstup") výstup) hodí EngineException, IOException {OutputType format = OutputType.from (output); reportService.generateMainReport (meno, formát, odpoveď, požiadavka); }

Vďaka výkon môžeme nechať používateľa zvoliť si požadovaný formát - HTML alebo PDF.

10. Testovanie správy

Aplikáciu môžeme spustiť spustením ReportEngineApplication trieda.

Počas spustenia BirtReportService trieda načíta všetky správy nájdené v / správy priečinok.

Ak chcete vidieť naše prehľady v akcii, stačí nasmerovať náš prehliadač na:

  • / report / csv_data_report? output = pdf
  • / report / csv_data_report? output = html
  • / report / static_report? output = pdf
  • / report / static_report? output = html

Tu je návod, ako csv_data_report prehľad vyzerá:

Ak chcete po zmene súboru s návrhom znovu načítať správu, ukážeme iba na náš prehliadač / nahlásiť / znovu načítať.

11. Záver

V tomto článku sme integrovali BIRT do Spring Boot, skúmalic úskalia a výzvy, ale aj jeho silu a flexibilitu.

Zdrojový kód článku je k dispozícii na GitHub.