Hlavní navigace

Apache Struts 1.1: rychlokurz psaní aplikací

13. 5. 2003
Doba čtení: 5 minut

Sdílet

Framework Struts z dílny Apache Software Foundation je značně obsáhlý. Udělat v něm jednoduchou aplikaci typu kniha návštěv není až tak přímočaré. Následující článek bude takový rychlokurz psaní aplikací ve Struts.

Minule jsme si něco řekli o presentaci pomocí JSP stránek. Dnes konečně hodíme oko na vlastní programování. Budeme se totiž zabývat dvěma zbývajícími vrstvami – controller a model.

Srdcem celé aplikace je ActionServlettřída (resp. servlet). Patří do vrstvy controller. Jeho úkolem je vytvářet instance akčních tříd (action classes) a rozdělovat jim práci. Každý HTTP dotaz tedy musí projít přes ActionServlet. Pro většinu aplikací stačí základní implementace přímo z knihovny Struts. Pokud byste však chtěli mít ActionServlet vlastní (chtěli byste např. sledovat uživatele), nic vám nebrání využít dědičnosti a snadnou modifikací souboru web.xml nastavit aplikaci tak, aby jej používala.

Jelikož je pochopení ActionServletu (AS) důležité, budeme se mu nyní věnovat. Při prvním dotazu se AS nejprve inicializuje, protože se jedná o obyčejný HttpServlet. Nejprve načte konfiguraci ze souboru struts-config.xml a ihned poté všechny lokalizační soubory. Následně nastaví svůj stav z konfiguračního souboru (obecné informace o sobě a mapování ActionServletů), zaktivuje všechny plug-iny (např. validator – o tom později) a nakonec aktivuje všechna databázová připojení, definovaná v konfiguračním souboru.

Pokud budete chtít přece jenom zasahovat do chodu AS, nemusíte hned vytvářet potomka. Do Struts 1.1 byla přidána pomocná třída RequestProcessor, která umožňuje jednoduše reagovat na některé události. Můžete tak nastavovat například locale nebo komunikovat s klientem na nízké úrovni.

Jestliže je AS srdcem, pak akční třídy jsou plícemi celé aplikace ve Struts. Právě pomocí nich provádíte vlastní „akci“ (v angl. business logic). Příkladem takové akce může být změna v nákupním koši e-obchodu. Akční třída bude (podle předaných parametrů) realizovat operace s JavaBeans objekty, ukládat data do relační databáze a vracet výsledky. Takovými akcemi by mohlo být například přidání zboží, odebrání produktu a zaplacení.

Akci implementujme tak, že vytvoříme potomka třídy Action a překryjeme metodu execute (ve verzi 1.0 to byla metoda perform, ta se ale nyní nedoporučuje používat). Metoda execute dostane k dispozici informace o stavu aplikace, chybový objekt pro hlášení chybových stavů, JavaBean objekt představující formulář (pokud na stránce nějaký byl) a samozřejmě servletové objekty request a response. Typická akce tedy načte hodnoty z formulářového JavaBeanu a provede příslušné kroky.

Co je skvělé, je to, že formulářové JavaBeans (tzv. FormBeans) jsou vytvářeny a mapovány automaticky. Jakmile vytvoříte formulář, musíte vytvořit i FormBean a uvést ho v konfiguračním souboru. Prozatím FormBean musíte napsat ručně, ovšem vývojáři slibují, že dají brzy k dispozici utilitu, které předáte HTML s formulářem a ona FormBean vytvoří automaticky. Zdá se to pracné, v konečném výsledku ale bude veškerá práce s formuláři hrozně jednoduchá – budete prostě jen zjišťovat atributy objektu JavaBean. Řetězec načtete snadno, rozevírací seznam dostanete v podobě kolekce a třeba soubor budete číst pomocí třídy InputStream tak snadno, jako byste ho otevírali na lokálním disku.

Posledním střípkem ve skládance je volání akčních tříd. Musíte vytvořit mapování akcí (action-mapping). Stejně jako pro databázová připojení, FormBeans či lokalizační konstanty to provedete v konfiguračním souboru struts-config.xml. Například akční třídu ModifyCartAction „namapujete“ na URL /store/cart/mo­dify.do. Je zvykem akce pojmenovat s koncovkou .do, aby AS mohl jednoduše rozpoznat, že se jedná o akci. Jinak byste to totiž museli dělat ručně, tj. pro všechny akce vytvořit záznamy ve web.xml, což by bylo nepříjemné.

Podívejme se na příklad. Vytvořme akční třídu AddPersonAction a formulář PersonForm. Na stránce add_person.jsp nechť je HTML formulář pro přidání člověka (například). Po stisku tlačítka Přidej bude zavolána adresa /add_person.do, která bude namapována na akční tříídu AddPersonAction. Ještě než akci AS vyvolá, převede data z formuláře do podoby PersonForm (díky mapování form-mapping). Programátor si v akční třídě pohodlně vyzvedne data, provede například zápis do databáze a přesměřuje uživatele na jinou stránku.

Tabulka č. 427
<?xml version=„1.0“ encoding=„UTF-8“?>
<struts-config>



  <form-beans>
      <form-bean
          name=„PersonForm“
          type=„cz.firma­.PersonForm“/>
  </form-beans>

 

  <!-- priponu .do prida AS automaticky -->
  <action-mappings>
      <action
          path=„/add_person“
         

name=„PersonForm“
          type=„cz.firma­.AddPersonActi­on“
          input=„/add_per­son.jsp“>
          <forward name=„Success“ 

            path=„/index.jsp“ />
      </action>
  </action-mappings>



</struts-config>

 
Ukázka konfigurace Struts  (struts-config.xml)

Bohužel se zde nemůžeme zabývat přílišnými detaily. Třída PersonForm je obyčejnou třídou JavaBean. Co políčko na HTML formuláři, to vlastnost objektu JavaBean. Akční třídu si jistě dovedete také snadno představit. Je to potomek třídy Action implementující metodu execute. Vrací URL, na kterou má AS klienta přesměřovat. Podle výsledku operace se tedy akční třída rozhodne, co vrátit. S výhodou se zde využívá tzv. forward-mapování, kterým se ale nebudeme zaobírat. V podstatě jde o to, vrátit instanci třídy ActionForward, kterou ovšem můžete získat přímo z konfiguračního souboru. Ačkoliv je tento způsob při vytváření vašich prvních akcí trošku matoucí, po čase si na to zvyknete a přidávání záznamů do konfiguračního souboru se stane rutinní záležitostí. Naopak jistě oceníte zlepšení produktivity práce v oblasti vytváření akčních tříd. Struts samozřejmě obsahuje mnoho dalších témat. Takové stránkování výsledků, delegování akcí, vracení výsledků formou tabulek či zpracovávání výjimek, to jsou témata, která přesahují rámec článku. Struts je dobře dokumentován a tyto věci si případní zájemci již vyhledají sami. Chtěl jsem jen ukázat základní myšlenku systému Struts.

Ačkoliv mám s webovým programováním zkušenosti, ze začátku jsem hodně tápal. Nebyl jsem totiž zvyklý na takový způsob práce. Štvalo mě neustálé restartování JSP kontejneru kvůli častým změnám v konfiguračních souborech. Brzy jsem ale zjistil, že s narůstající složitostí projektu se vše vrátí i s úroky v podobě přehlednosti a škálovatelnosti.

root_podpora

Jsme v polovině seriálu! Příště si něco přečtete o skvělém plug-inu Validator a nakonec se zmíním o plug-inu Tiles a napovím vám, jak nejlépe Struts aplikace ladit.

jakarta.apache­.org/struts

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