Pokud nejste zrovna fanoušky textových šablon při tvorbě HTML stránek a hledáte jednoduché řešení bez dlouhých textových řetězců, tak je tento článek určen právě vám.
V tomto článku si ukážeme sestavení webové stránky pomocí API jediné třídy s potomkem, nepočítám přitom třídu obsluhujícího servletu, ani standardní třídy Java 8. V ukázce jsem si pomohl ještě několika málo třídami, které pro správnou funkci sice nejsou nezbytné, ale zpřehledňují ukázkový kód (nejen) pro potřebu tohoto výkladu.
Řešení je založené na modelování stromové struktury DOM, která nakonec vykreslí finální dokument ve formátu HTML. Instance doménové třídy popisuje jeden element stromu. Na první pohled možná nevypadá takový nápad zrovna lákavě, ale modelování DOM má své výhody: především získáte všechny vymoženosti OOP, které usnadňují stavbu grafických komponent – včetně dědičnosti a agregace. Hlavní třída řešení se jmenuje (překvapivě) XmlElement a jeho potomek reprezentující kořen HTML stránky HtmlElement. Pojďme se podívat na jednoduchou ukázku Java kódu, která zobrazuje zprávu ”Hello, World”:
final HtmlElement html = new HtmlElement(“Demo”, StandardCharsets.UTF_8); html.addCssLink("welcomeForm.css"); html.addElementToBody(Html.H1)
.addText("Hello, World!"); ApplService.addFooter(html.getBody(), this, SHOW_LINE);
html.toResponse(httpServletResponse, true);
Generovanou HTML stránku jsem ručně přeformátoval pro lepší čitelnost a použité URL jsem zkrátil:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Demo</title>
<link href="welcomeForm.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<h1>Hello, World!</h1>
<div class="footer"> See a
<a href="https://github.com/pponec/ujorm/.../HelloServlet.java#L45"
target="_blank">HelloServlet</a> source class of the Ujorm framework.
</div>
</body>
</html>
První řádek Java kódu vytvoří kořenový element s nezbytnou hlavičkou a tělem. Následuje reference na CSS a zápis požadované zprávy do těla dokumentu ve formě nadpisu. Vložení patičky je společné všem demo stránkám, je tedy výhodné zabalit jeho tvorbu do společné servisní metody. Poslední řádek ukázky kódu vykreslí model do objektu typu HttpServletResponse. Konstanty interface Html jsou nepovinné a lze je nahradit libovolným objektem typu CharSequence. Autor třídy neplánuje udržovat úplný výčet platných HTML elementů a tak zmíněný interface není součástí použité knihovny, výchozí implementaci však lze získat z ukázkového projektu.
Více příkladů (včetně tvorby jednoduchého formuláře) najdete bez dalších komentářů tady. Stojí za připomenutí, že v metodách tvořících webovou stránku nenajdete prakticky žádné fragmenty HTML kódu.
Pro zajímavost doplňuji, že živá ukázka běží v kontejneru Tomcat na Linux Ubuntu. Třídu XmlElement získáte použitím závislosti na Maven artefakt ujo-tools. Aktuálně je k dispozici verze 1.88 s velikostí 38kB.
<dependency> <groupId>org.ujorm</groupId> <artifactId>ujo-tools</artifactId> <version>1.88</version> </dependency>
Pokud preferujete nějakou obecnější a zubem času lépe prověřenou knihovnu pro stavbu DOM modelu, můžete zkusit Dom4j framework, který nabízí navíc parsování XML dokumentů, podporu XPATH, jmenný prostor v API a některé další výhody. Chybí tam však podpora obecných datových typů v API a proto nelze zařadit (nemá smysl) vlastní konvertor pro specifické formátování dat do textového výstupu. Princip stavby HTML stránky je podobný výše uvedeným příkladům, ukázku tvorby HTML formuláře pro srovnání najdete tady.
Díky za odkaz, přikládám jen první dojem: j2html má pěknou dokumentaci, na můj vkus však nabízí zbytečně komplikované API, naopak postrádám společnou třídu, která by sloužila ke konverzi datových objektů to textu a tak je nutné data převádět na text individuálně před každým zápisem do modelu.
Než se o tohle pokoušet v Javě, tak radši použít kotlinovské DSL, které bez ztráty statického typování mnohem lépe odpovídá výslednému HTML stromu:
https://github.com/Kotlin/kotlinx.html
Kotlin sice běží na JVM, jde však o jiný programovací jazyk, což může být problém při prosazování v týmu Java vývojářů.
Kotlin je možná na vzestupu, ale k vrcholu popularity má zatím daleko: https://goo.gl/We3F9V
Přiznám se, že vždy když tu vidím článek týkající se ujormu, tak si kladu otázku, proč to autor vlastně dělá. Zpravidla bývají k dispozici 2-3 jiné zavedené open source projekty, který řeší daný problém. Ano, mívají své chyby, ale psát si ORM framework, nebo html generátor "na sebe" mi přijde jako hrozná škoda času - nepochopte mě špatně, mám k podobné práci velkou úctu, ale ta ne-odpověď na proč mě prostě pokaždé zarazí.
Nepochybuji o tom, že realizace každého nového projektu nese riziko, že to neosloví očekávaný počet uživatelů, přesto si myslím, že řada nápadů projektu Ujorm byla (a možná stále je) unikátní a těší mě, že si ten projekt našel své spokojené uživatele. Svoji motivaci bych přirovnal k luštění křížovek ve volném čase, údržba tohoto projektu však zabírá dnes už jen minimum času.
Postřehy ze světa open-source.
Přečteno 31 237×
Přečteno 20 903×
Přečteno 17 162×
Přečteno 14 615×
Přečteno 14 377×