Hlavní navigace

Apache Struts 1.1: úvod

6. 5. 2003
Doba čtení: 8 minut

Sdílet

Nadace Apache Software Foundation chrlí jeden povedený projekt za druhým. Z jejich dílny jsou například slavný JSP/Servlet kontejner Tomcat, sestavovací program Ant, XML parser Xalan či testovací systém Cactus. Před jistou dobou ASF vzala pod svá křídla nadějný projekt Struts - rozhraní pro efektivní tvorbu webových aplikací v JSP.

Struts funguje již několik let a spadá do seskupení Jakarta, ve které ASF soustřeďuje zhruba 20 projektů týkající se Javy. Když jsem chtěl vyzkoušet novou verzi programu Borland JBuilder 8.0 Enterprise, zjistil jsem, že je rozhraní Struts plně podporováno. Struts se mi zalíbil a v následujícím povídání bych se chtěl s vámi podělit o své postřehy a zkušenosti.

Systém Struts není jediným webovým rozhraním na Jakartě. Paralelně se vyvíjejí i další, komplexnější produkty, jako je Velocity, Cocoon nebo Turbine. Jsou to většinou již pokročilá rozhraní (resp. aplikační servery), která sjednocují celou tvorbu svou cestou, podobně jako projekt Zope (viz můj článek Aplikační server Zope). Struts se snaží být co nejjednodušší a nechává většinu věcí na programátorovi. Pokud tedy chcete vystavět webovou aplikaci od píky, je Struts ideálním řešením.

Význam anglického slova strut se dá chápat jako rozpěra vložená do konstrukce kvůli zabránění tlaku. Aplikace napsaná ve Struts frameworku musí implementovat také rozpěry. Skládá se totiž minimálně ze tří částí – modelové (model), prezentační (view) a logické (controller). Prezentační tvoří JSP stránky se speciálními Struts značkami, případně servlety, logickou část tvoří tzv. akční (Action) třídy a modely jsou komponenty JavaBeans. Všechny části dohromady spojí konfigurační soubor struts-config.xml, který dále přidává některé drobnosti navíc, jako je připojení do databáze s JDBC2 connection poolingem a podobně. Odtud zkratka MVC (Model-View-Controller). Nutno poznamenat, že MVC tu bylo dlouho před projektem Struts.

K úspěšnému provozování Struts stačí nainstalovaný JSP kontejner, například Jakarta-Tomcat verze 4.1 (viz mé články Java na Linuxu) a samotné Jakarta-Struts verze 1.1. Instalace Struts je snadná. Po vytvoření kostry nové aplikace (například pomocí Antu) prostě nakopírujte struts.jardo adresáře WEB-INF/lib vaší aplikace (možná budete potřebovat i ostatní knihovny JAR – nakopírujte je tedy všechny) a dále soubory *.TLD do adresáře WEB-INF. Nakonec ještě najděte v distribuci ukázkové konfigurační soubory web.xml a struts-config.xml a nakopírujte je tamtéž. Nejjednodušší je rozbalit soubor struts-blank.war z distribuce Struts do prázdného adresáře.

Pro účely testování bych vřele doporučil relační databázi HypersonicSQL. Ta je napsaná v Javě, má podporu SQL-92, transakcí, cizích klíčů a celá včetně grafického rozhraní, JDBC ovladače a vestavěného webového serveru má necelých 400kb. Instalace probíhá stejně jako u Struts. Nakopírujte hsqldb.jar do adresáře WEB-INF/lib. HypersonicSQL je sice malý zázrak, ale nenasazujeme jej do ostrého provozu z důvodů výkonu (všechny tabulky nahrává do paměti, žádné optimalizace a podobně). Pro sestavování aplikace použijte Ant (viz série skvělých článků ANT – nebojte se mravence) nakonfigurovaný tak, aby při každé změně kódu automaticky informoval Tomcat, že má restartovat aplikaci (musíte použít externí task dodávaný s Tomcatem). Použít můžete také některé IDE, kterých je pro Javu přehršel. Doporučuji Eclipses pluginy SysteoTomcat a EasyStruts nebo také špičkové prostředí IntelliJ IDEA, které ovšem není zdarma.

Přistupme teď ke konfiguraci Tomcatu. Stačí přidat následující záznam do conf/server.xml:

Tabulka č. 421
<Context path="/intranet"
 docBase="/home/lzap/projects/intranet"
 debug="1"
 reloadable="true">
 <Logger
  className="org.apache.catalina.logger.FileLogger"
  prefix="intranet_log."
  suffix=".txt"
  timestamp="true"/>
</Context>
Konfigurace serveru Tomcat

Samozřejmě, že uvedené cesty musíte upravit dle své konfigurace. Důležitá je zde informace reloadable. Kocourovi tím říkáte, že si má dávat pozor a případné změny v JSP stránkách nebo .class souborech aktualizovat. Tak nebudete muset restartovat Tomcat po každé změně zdrojového kódu (někdy se tomu ale nevyhnete a právě tady pomůže plugin SysteoTomcat, který toto minimalizuje na jedno kliknutí v IDE). Je vhodné také aktivovat logování, v tomto případě do souboru. Tím globální konfigurace Kocoura končí. Všechno ostatní již ovlivníme lokálně pomocí web.xml. Vytvořme jednoduchou JSP stránku ala HelloWorld a spusťme Tomcat. Měl by stránku zkompilovat a spustit. Pokud ne, budete se s tím muset nějak poprat.

Jak jsem již naznačil, prezentační část tvoří právě JSP stránky. Ve Struts frameworku je dovoleno dělat v JSP cokoliv. Můžete tedy používat knihovny tagů (např. JSTL), využívat skriptování jazyku Java či připojovat na stránky Aplety pomocí standardních JSP značek. My však budeme JSP stránky používat právě jako prezentační část celé Struts mašinérie. Jedna ze služeb, kterou Struts nabízí, je lokalizace. Ta se používá při předávání chybových zpráv, takže je nutné ji znát. První, na co programátor obvykle hledí, jsou právě chybové zprávy. Vytvoříte soubor (.properties), který bude obsahovat klíče (např. „error.login.no­suchuser“) a hodnoty (např. „uživatel nenalezen“). Pokud jej uložíte do cz.vašefirma.váš­balík, budete mít možnost mezi jazyky přepínat. Nic nového pod sluncem. Ukážeme si na příkladu. Vytvořme následující JSP stránku:

Tabulka č. 422
<html>
<head>
 <title><bean:message key="app.title"/></title>
</head>
<body>
 <h1><bean:message key="app.menu.main"/></h1>
</body>
</html>
První Struts JSP stránka (index.jsp)

A nyní příslušný lokalizační soubor, který uložíme do WEB-INF/classes/cz/fir­ma/MainResources­.properties(res­p. do adresáře src, ale pak musíte zajistit automatické nakopírování do WEB-INF pomocí IDE nebo Antu plus případné překódování do UNICODE, což Ant umí díky tasku native2ascii):

Tabulka č. 423
# Toto je komentář
app.title=Název mojí úplně první Struts aplikace
app.menu.main=Hlavní menu
Soubor lokalizace (MainResources­.properties)

Do struts-config.xml musíme ještě přidat značku message-resources s parametrem „cz.firma.Main­Resources“. Po restartu Kocoura (je nutný, změnil se konfigurační soubor) by se měly zobrazit příslušné nadpisy. Pro více jazyků vytvořte soubory se jménem stylu MainResources_cs­.properties. Lze dokonce měnit nastavení jazyka za běhu, takže si uživatel může vybrat oblíbený jazyk nebo mu můžete předkládat ten, který preferuje jeho prohlížeč. Fantazii se meze nekladou.

Byla by to ale smůla, kdyby prezentační část Strutsu nabízela jen tohle. Můžete využít celé škály připravených tagů, konkrétně bean-tags (značky pro snadnější manipulaci s JavaBeans), HTML-tags, logic-tags a template-tags. Také obsahuje různé pomocné značky (jako je např. bean:message či beans:parameter). V template-tags naleznete tři pomocné značky pro jednoduché vytváření šablon, ale jelikož presentační část dělají většinou web designéři, kteří na to mají své nástroje (např. Macromedia Dreamweaver, který plně podporuje Struts tagy včetně HTML tagů), nenalezne toto jednoduché šablonování asi příliš široké využití. Jako zajímavost bych uvedl knihovnu Titles, která se ve verzi 1.1 již prodrala do hlavní binární distribuce Strutsu. Na základě těchto tří šablonových značek, svých vlastních, formátu XML a RSS nabízí tato knihovna velice propracovaný systém šablon, který je vhodný zejména pro různé portály či webziny. Nutno poznamenat, že Struts lze bez problémů využít i s jiným šablonovým systémem. Posledním typem značek jsou logic-tags, které obsahují zhruba dvě desítky kousků pro vytváření tabulek a pro snadné renderování HTML stránek (podmíněné řízení toku, iterování přes kolekce a JavaBeansy, forwardování apod.). Podívejme se na malou ukázku:

Tabulka č. 424
<%
  {
    java.util.ArrayList list = 
      new java.util.ArrayList();
    list.add("Jenda");
    list.add("Dva");
    list.add("Tře");
    list.add("Štyre");
    pageContext.setAttribute("list",
      list, PageContext.PAGE_SCOPE);
  }
%>

<jsp:useBean id=„list“ scope=„page“ class=„java.u­til.ArrayList“/>

<ol><logic:iterate id=„item“ name=„list“ indexId=„index“>

<li><em><bean:write name=„item“/></em>
[<bean:write name=„index“/>]</li>

</logic:itera­te></ol>

Ukázka logických značek (logic.jsp)

Největší bombou jsou ovšem HTML tagy (značky). Pokud chcete vytvořit formulář, který bude provádět nějakou akci, nepoužijete standardní HTML značky FORM a INPUT, nýbrž speciální Struts značky, které se jmenují podobně a na kýžené HTML tagy se při zobrazení stránky také promění (vyrendrují). Díky tomu, že to jsou tagy na straně serveru, můžeme si je napojit na JavaBeans a Action objekty (o nich později). Velmi podobný návrh používá Microsoft se svým ASP.NET, kde si dragdropnete např. webové tlačítko na HTML stránku a Visual Studio na toto místo umístí speciální značku ASP, která se na HTML tlačítko vyrendruje až při vlastním http dotazu. Programátor má pak možnost si události tohoto objektu navázat a obsloužit.

Všechny tyto a podobné návrhy považuji za revoluční. No považte, není pěkné umístit na stránku rozevírací seznam (combo) jednoduchým a přímočarým tagem a poté jej naplnit programově? Nemusíte se zdržovat se psaním různých „SELECTED“ atributů, kde se dělají často překlepy. Ve Struts to dotáhli ještě dál. Například právě combo pomocí jediného atributu zkrátka propojíte s odpovídající metodou (resp. vlastností) třídy JavaBean (která vrací kolekci) a je vymalováno! Žádný kód uvnitř HTML stránky a přece se combo naplní. Třeba i z databáze nebo z RSS zdroje. Takhle si představují webové programování!

root_podpora

Díky oddělené logice máte možnost používat stejné komponenty i v desktopovém programu nebo v mobilu (MIDP). Protože se jedná o objekty JavaBeans, které fungují všude, můžete je využít jak pro stavbu webového rozhraní, tak v IDE při tvorbě desktopového programu. JavaBeans jsou obyčejné třídy dodržující určitý úzus, není třeba se jich bát nebo v nich hledat cosi tajuplného. Tím ale výčet všech výhod nekončí. Objekty JavaBeans můžete použít jako vizuální komponenty a pomocí tažení na formulář zefektivnit vývoj nebo je převést na objekty typu Enterprise JavaBeans a získat tak obrovskou škálovatelnost a potenciál, který nabízí Java2EE.

Příště se pustíme střemhlav do vytváření formulářů, dolování dat z databáze a jejich presentace. Webová Java se na serverech již zahnízdila a má obrovský náskok oproti konkurenční architektuře ASP.NET. Bude určitě zajímavé sledovat další vývoj.

Byl pro vás článek přínosný?