Hlavní navigace

HTML report v jazyce Java na pár řádků

16. 4. 2021 22:27 (aktualizováno) Pavel Ponec

Dnes vám představím jednoduchý tabulkový HTML report vytvořený pomocí pouhých třinácti řádků zdrojového kódu zapsaných do jediného příkazu jazyka Java. Předpokládejme přitom, že služba pro získání dat už existuje. Pokud budeme chtít uživatelům nabídnout také jednoduché (sekvenční) filtrování obsahu tabulky s řazením sloupců, implementace vezme ještě pár řádků navíc. Pro případnou optimalizaci filtrování však bude třeba sáhnout hlouběji do backendu. Webová komponenta si bere data z objektu typu Stream a tak maximální objem prezentovaných dat je limitován pouze možnostmi webového prohlížeče. Pro datový zdroj jsem použil volně dostupný seznam hotelů ve formátu CSV a snad nebude vadit, že některé informace už nejsou aktuální. Podívejme se do těla metody doGet() starého dobrého Java servletu na těch třináct deklarovaných řádků. Model tabulky budeme sestavovat pomocí třídy ReportBuilder z frameworku Ujorm.

Každé volání metody add() přidá do tabulky jeden další sloupec. První argument této metody obsahuje kód pro získání obsahu buňky tabulky, druhý obsahuje název sloupce v hlavičce. Pokud budeme chtít sloupec filtrovat, uvedeme také konstantu reprezentující HTTP parametr webové stránky. Pro podporu řazení doplníme volání metody sortable(), jejíž (volitelný) parametr určuje směr řazení, ten však slouží jen pro grafickou prezentaci, o reálné řazení dat se stará metoda další. Kvůli licenčním podmínkám je třeba doplnit odkaz na původní datový projekt, který vložíme do patičky metodu setFooter(). Nadpis HTML stránky se generuje implicitně z textu uvedeného v konstruktoru builderu, pomocí metody setHeader() ho však můžeme nahradit implementací vlastní. Metoda build() zavolá nakonec metodu pro získání dat, její kód přikládám:

Pro ignorování velikosti znaků převedeme nejdříve hodnoty parametrů na velká písmena, ale implementace vhodného filtru je tady jen na nás. Pokud datový typ sloupec implementuje rozhraní Sortable, tak pro řazení můžeme využít komparátor poskytovaný objektem GridBuilder, v ostatních případech je třeba napsat implementaci vlastní. Nakonec omezíme počet řádků podle limitu. Při velkém objemu dat bude však vhodnější poslední dva řádky prohodit, aby se řazení zúčastnilo menší množství záznamů. Upozorňuji ještě, že všechny HTTP požadavky typu POST je třeba směrovat do metody sevletu doGet(). A to je snad vše podstatné, po spuštění projektu spatříme výsledek podobný následujícím obrázku:

Snímek obrazovky naznačuje, že tabulka se překresluje při změně textu filtru automaticky, stránka však funguje i na na prohlížečích bez podpory Javascriptu, jen hodnoty filtru bude třeba potvrzovat klávesou Enter. Chování AJAX lze potlačit také programově – pomocí metody setAjaxEnabled(false). Všechny parametry formuláře stránky lze přenastavit v parametrech URL, přitom objekt ReportBuilder si neukládá žádná data do Session.

Závěr

Je pravda, že třída ReportBuilder neřeší jen vykreslování tabulky, ale obsluhuje spíše celou stránku. Samotnou tabulku vykresluje třída GridBuilder a na tomto případě je vidět, jak lze takové komponenty skládat do celku. Celé řešení je postavené na objektech třídy Element, která byla zmíněna v minulém blogu.

Pro spuštění projektu je třeba JDK verze 8 a webový prohlížeč s podporu Javascript Vanilla ES6, použitý Javascript však nevyžaduje žádné knihovny. Celý projekt je volně dostupný na GitHub. Projekt se spouští ve Windows skriptem run.cmd (na Linuxu skriptem: run.sh), při prvním startu dojde ke stažení potřebných knihoven. Příště si ukážeme možnosti formátování buněk v této tabulce.

Užitečné odkazy:

Sdílet