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ů kódu navíc. Řešení stojí na objektech typu Element z frameworku Ujorm ...
Ujorm je odlehčený Java framework, který umožňuje čtení informací z (nejen) databáze pomocí typově bezpečných objektových dotazů. Framework pracuje s objekty typu key-value.
2021-04-04
HTML report v jazyce Java na pár řádků
2021-03-08
Jednoduché webové stránky s AJAX
Framework Ujorm obsahuje od verze 1.91 nový webový modul ujo-web se třídou Element, která slouží pro sestavení HTML stránky pomocí objektového modelu. Za výhodu takového řešení považuji:
- odolnost vůči překlepům v HTML kódu,
- bezpečný zápis dat včetně speciálních znaků
- vnitřní elementy výsledného HTML kódu se automaticky odsazují mezerami
- vybrané vlastnosti výsledné stránky lze ovlivnit konfigurací, týká se to třeba výběru znaků pro odsazování vnořených elementů, zalamování řádků, národního prostředí, kódové stránky a také možnosti registrace vlastního formatteru datových objektů,
- zápis Java lze přiblížit strukturovanému HTML kódu - pomocí bloků try-catch,
- minimalistické řešení bez dalších závislostí,
- za výhodu považuji také možnost jednoduchého připojení dalších služeb – s veškerým komfortem prostředků jazyka Java
Je dobré vědět, že objekty typu Element posílají svá data rovnou do Writeru a tak je jeho paměťová náročnost minimální (ve výchozí konfiguraci). Pro ilustraci přikládám ukázku kódu jednoduchého formuláře v těle běžného Java servletu:
Od veze 2.13 je podporován AJAX pomocí Javascriptu Vanilla ES6. Popis referenční implementace vyšel dnes na blogu portálu Root.cz .
2019-11-20
Ujorm 1.93 podporuje Stream
Nová verze Ujorm 1.93 umožňuje procházení výsledků SELECT pomocí objektu typu Stream. Jeho použití podporují všechny implementace rozhraní LoopingIterator včetně třídy RowIterator z modulu ujo-tools.
Podporu tedy lze využít nejen v modulu ORM, ale také při práci s JDBC, vzorové použití přikládám:
PreparedStatement ps = dbConnection.prepareStatement("SELECT * FROM myTable");
new RowIterator(ps).toStream().forEach((RsConsumer)(resultSet) -> {
int value = resultSet.getInt(1);
});
Nějaké další informace lze najít v jUnit testech. Pokud výslovně nepotřebujete pracovat s objektem typu Stream, tak už v předchozích verzích knihovny bylo možné sestavit výraz: PreparedStatement ps = dbConnection.prepareStatement("SELECT * FROM myTable");
new RowIterator(ps).forEach((RsConsumer)(resultSet) -> {
int value = resultSet.getInt(1);
});
Pro Maven projekty přidáte závislost XML výrazem: <dependency>
<groupId>org.ujorm</groupId>
<artifactId>ujo-tools</artifactId>
<version>1.93</version>
</dependency>
2019-03-31
Příběh frameworku Ujorm
Na blogu Root.cz vyšel tento týden článek, který se pokouší najít odpověď na otázky týkající se produktivity vývoje s frameworkem Ujorm a zmiňuje také historické důvody jeho vzniku.
Podle měření webu Root.cz - čtenáři dnes dopoledne překročili 10 tisíc zobrazení toho článku, děkuji všem za kultivovanou diskuzi.
Odkaz na text článku přikládám:
https://blog.root.cz/ponec/pribeh-frameworku-ujorm/
Podle měření webu Root.cz - čtenáři dnes dopoledne překročili 10 tisíc zobrazení toho článku, děkuji všem za kultivovanou diskuzi.
Odkaz na text článku přikládám:
https://blog.root.cz/ponec/pribeh-frameworku-ujorm/
2018-11-18
Ujorm verze 1.88
Je k dispozici nová verze Ujorm 1.88, změny se týkají především modulu ujo-tools, který nabízí nástroje pro formátování textových zpráv, nadstavbu JDBC k sestavení SQL dotazů umožňujících získání instance typu ResultSet a podporu tvorby DOM modelu pro generování HTML stránek. Motivační články jsem se rozhodl umístit na stránky serveru Root.cz, odkazy přikládám:
Všechny zdrojové kódy projektu Ujorm mají licenci Apache License, Version 2.0 a jsou k dispozici v repozitáři serveru GitHub.
- Jak pracovat efektivně s relační databází pomocí JDBC jazyka Java?
- Jak psát webové stránky v jazyce Java bez HTML šablon?
Všechny zdrojové kódy projektu Ujorm mají licenci Apache License, Version 2.0 a jsou k dispozici v repozitáři serveru GitHub.
2018-03-18
Ujorm verze 1.82
Je k dispozici nová verze Ujorm 1.82 hlavní změny v ORM modulu:
Podrobnější seznam v angličtině je tady.
- Při provádění UPDATE lze do metody vložit původní verzi objektu pro ověření, zda-li ty modifikované hodnoty nebyly změněny v databázi nějaký konkrurenčním klientem
- Třída Criterion implementuje metody equals() and hashCode(), které jsou požadovany například v objektu HashSet
- SQL dialekty pro databáze PostrgreSQL a H2 využívají operátor ILIKE
- Třídy pro formátování textu MsgFormatter a MessageService podporují datový typ Supplier, který umožnuje do parametru poslat algoritmus, který se vyhodnotí až době zpracování.
- Třída CustomMap umí akceptovat uživatelskou definici metod equals() a hashCode() pro všechny vložené klíčové objekty.
- Pro zobrazování tabulek v Apache Wicket frameworku lze vyžít optimalizovaný dataprovider který implementuje třída OrmDataProviderCached
Podrobnější seznam v angličtině je tady.
2017-11-10
Ujorm verze 1.75
Je k dispozici nová verze Ujorm 1.75 hlavní změny jsou v ORM modulu:
Podrobnější seznam v angličtině je tady.
- Oprava uzavírání JDBC zdroje v některých případech
- Nová třída PackageDbConfig umožňuje načtení entit databázového modelu z balíčku a tak není třeba je explicitně zapisovat, jako dosud
- Doplněná kotrola na unikátní jméno databáze v rámci schematu
Podrobnější seznam v angličtině je tady.
2017-10-25
Nástroje pro kontrolu platnosti parametrů v Java
Pro kontrolu platnosti parametrů se využívají validační třídy z někerý Java frameworků, rád bych připomněl (z mého pohledu) ty nejvýznamnější:
- Validate z projektu Apache Commons
- Preconditions z projektu Google Common
- Assert z projektu Spring Framework
- Objects z Java 8 (metoda requireNonNull(), doplněno 2019-09-12)
"{}" (na rozdíl od validátorů používajích zpravidla výraz "%s"). Této rozdílnosti se nezbavíme ani použitím třídy Logger ze standardní Java knihovny, protože jeho šablona očekává číslovaný seznam parametrů podle vzoru "{0} {1}". Také se mi nelíbí nejednotné vyhazování výjimek, protože první dvě implementace (výše zmíněné) vyhazují při porušení pravidla not-null odlišnou výjimku (typu NullPointerException). Přesto, že uvedené výhrady nejsou zásadní, po zvážení jsem přistoupil ke vlastní implementaci validátoru s plným vědomím rizika, že to nezpůsobí revoluci ve světě IT :-). Jako vzor pro inspiraci jsem použil třídu Assert ze Spring frameworku, líbilo se mi, jak autoři obešli zápor v názvu metody pro testování parametru typu not-empty. Nový validátor využívají (podle očekávání) ostatní moduly frameworku Ujorm, třída zodpovědná za sestavování zpráv se využívá také pro interní proxy loggger.Popis třídy Assert z frameworku Ujorm
Vlastnosti nové implementace:- podporuje parametry v šabloně (na rozdíl od svého vzoru)
- pozice parametrů se označuje párem složených závorek
"{}", formátování hodnot parametrů není podporováno šablonou - do zprávy se zapisují i parametry, které nemají vlastní značku v šabloně a jsou pak odděleny čárkou
- parametry typu Throwable, které nemají vlastní značku v šabloně vypisují stacktrace
- jsou podporované také argumenty typu Supplier (od verze 1.82+)
- podmínku platnosti parametru lze popsat Lambda výrazem
- při porušení platnosti se vyhazuje výhradně výjimka IllegalArgumentException
Integer value = 20;
Assert.isTrue(value < 10, "Wrong number {}!", value); // "Wrong number 20!"
Assert.isTrue(value < 10, "Wrong", value); // "Wrong, 20"
Assert.isTrue(value < 10, value); // "20"
Assert.isTrue(value < 10); // null
value = null;
Assert.isTrue(value, (x)-> x<10, "Wrong number {}!", value); // "Wrong number null!"
Supplier<Object> s = () -> value;
Assert.isTrue(value < 10, "Wrong number {}!", s); // "Wrong number null!"
Všimněte si, že parametry postrádající svoji značku v šabloně se zapsaly na konec zprávy (například framework LogBack je zahazuje). Pokud je skutečný počet parametrů šablony naopak menší, nevyužité značky se zobrazí beze změny. Metody sice neřeší formátování parametrů, ale v případě nouze je možné parametry pro logování obalit vlastní třídou s překrytou metodou toString(), která to formátování řešit může. Pokud má parametr hodnotu null, tak nedochází k volání Lambda výrazu a není třeba to ošetřovat v kódu. Vzorové použití dalších metod uvádím pro zjednodušení bez kometářů, všechna tvrzení jsou pravdivá: Assert.isTrue(true);
Assert.isTrue(30, (x)-> x>20);
Assert.notNull("ABC");
Assert.hasLength("ABC");
Assert.hasLength(new char[]{'A', 'B', 'C'});
Assert.hasLength(new StringBuilder().append("ABC"));
Assert.hasLength(Arrays.asList("A", "B", "C"));
Assert.isFalse(false);
Assert.isFalse(30, (x)-> x<20);
Assert.isNull (null);
Assert.isEmpty("");
Assert.isEmpty(new char[0]);
Assert.isEmpty(new StringBuilder());
Assert.isEmpty((List) null);
Performance testy vychází poměrně příznivě, pro zájemce přikládám odkaz na jUnit testy třídy Assert, případně na testy třídy MsgFormatter, která je zodpovědná za sestavování chybových zpráv. Pokud vás tento článek zaujal, knihovnu můžete připojit snadno pomocí Mavenu, velikost JAR je pouze 10 KB, modul přitom nemá žádné další závislosti. <dependency>
<groupId>org.ujorm</groupId>
<artifactId>ujo-tools</artifactId>
<version>1.82</version>
</dependency>
2017-10-06
Sestavování textových zpráv pomocí šablon nejen v Ujorm
Ujorm verze 1.74 obsahuje nový, samostatný modul, který nabízí třídy pro sestavování textových zpráv pomocí šablony a parametrů. Pro srovnání přikládám vzorové použití standardní Java knihovny. Všechny třídy se liší především způsobem zápisu parametrů v šabloně. Použité ukázky kódu jsem zkopíroval z jUnit testů projektu Ujorm.
Třída MsgFormatter
MetodaMsgFormatter.format() z knihovny Ujorm je určena pro rychlé použití šablony, která označuje vkládané parametry dvojicí složených uvozovek "{}", pořadí parametrů vkládaných do šablony je dáno pořadím v metodě. Vzorová ukázka použití je tady: assertEquals("TEST" , MsgFormatter.format("TE{}T", "S"));
assertEquals("TE, S, T", MsgFormatter.format("TE", "S", "T"));
assertEquals("TES{}" , MsgFormatter.format("TE{}{}", "S"));
Výhodou je absence výjimek způsobených chybným počtem parametrů, protože přebytečné parametry se zapisují na konec zprávy oddělené čárkou s mezerou a ty chybějící se pouze nenahradí za značku. Pokud má výsledná zpráva obsahovat sekvenci "{}", je nutné ji vložit do šablony jako parametr. Třída nepodporuje formátování hodnot parametrů, v případě takové potřeby použijte raději následující třídu ze stejné knihovny.Třída MessageService
Tato třída je také z knihovny Ujorm. Parametry metodyMessageService.format() v šabloně se označují výrazem typu "${PRICE}", kde PRICE je název parametru, který může být volitelně doplněný formátem podle vzoru "${PRICE,%.2f}". Popis formátu je shdoný je shodný s metodou String.format(). Parametry šablony se předávají v objektu typu Map<String, Object>, ukázka použití následuje: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On ${DAY,%tF}, we spent ${PRICE,%.2f} EUR.";
MessageService instance = new MessageService();
Map<String,Object> params = instance.map
( "DAY", LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30)
, "PRICE", new BigDecimal("254"));
String result = new MessageService().format(template, params);
assertEquals(expected, result);
Další ukázky použití najdete v jUnit testu. Pro srovnání uvádím dále ještě dvě metody ze standardní Java knihovny.Třída String
Statická metodaString.format() vytváří interně instanci třídy Formatter. Pozice parametrů se označují výrazem začínajícím znakem procenta (například "%s") a volitelné formátování hodnoty parametru. Příklad použití: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On %tF, we spent %.2f EUR.";
LocalDateTime day = LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30);
String result = String.format(ENGLISH, template, day, new BigDecimal("254"));
assertEquals(expected, result);
Pokud je parametrů méně, než značek, metoda vyhazuje výjimku MissingFormatArgumentException, pokud je jich naopak více, tak jsou ignrorovány.Třída MessageFormat
Poslední metodaMessageFormat.format() je také statická metoda ze standardní Java knihovny a také podporuje formátování parametrů. Místo určené pro vkládání pametrů se označuje výrazy číslovanými od nuly podle vzoru "{0}, "{1}" a konkrétní parametry se vkládájí pomocí pole. Příklad použití: String expected = "On 2017-01-15, we spent 254.00 EUR.";
String template = "On {0,date,yyyy-MM-dd}, we spent {1,number,#.00} EUR.";
Date day = Date.from(LocalDateTime.of(2017, Month.JANUARY, 15, 12, 30)
.atZone(ZoneId.systemDefault()).toInstant());
Object[] params = { day, new BigDecimal("254")};
String result = new MessageFormat(template, ENGLISH).format(params);
assertEquals(expected, result);
Výchozí Locale se bere z operačního systému, argument typu java.time.LocalDateTime není bohužel podporovaný a vyhazuje výjimku IllegalArgumentException.Performance
Přikládám přibližnou výkonnost jednotlivých tříd, tolerance naměřených hodnot může být až 10%. Pro každý formatter proběhlo 5_000_000 iterací ve kterých se do jednoduché šablony (bez formátování) dosadily tři krátké argumenty.
Třída Čas [ms] Výkon(větší je lepší)MsgFormatter 1158 100.00% MessageService 2268 51.06% String 12243 9.46% MessageFormat 5023 23.05%
Další podrobnosti o testu najdete tady, Na závěr přikládám popis Maven závislosti:
<dependency>
<groupId>org.ujorm</groupId>
<artifactId>ujo-tools</artifactId>
<version>1.74</version>
</dependency>
Přihlásit se k odběru:
Příspěvky (Atom)

