Hlavní navigace

Jak psát webové stránky v jazyce Java bez HTML šablon?

25. 11. 2018 11:30 (aktualizováno) Pavel Ponec

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.

Internetové odkazy

  1. JavaDoc třídy XmlElement
  2. Blog frameworku Ujorm v češtině
  3. Domovská stránka Ujorm v angličtině
  4. Využijte GitHub pro konstruktivní návrhy
  5. Pro srovnání připomínám použití technologie JSP