Hlavní navigace

Apache Struts 1.1: rychlokurz psaní aplikací

Lukáš Zapletal 13. 5. 2003

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.

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

Našli jste v článku chybu?

20. 5. 2003 10:55

Pavel Kolesnikov (neregistrovaný)

Může to znít jako terminologicke rejpani, ale aby nedošlo k zásadnímu nepochopení:

Action třídy v žádném případě (kromě nejjednodušších pidiaplikací) nelze považovat za business logic.

Doporučuju psát Action třídy co nejmenší a nejjednodušší, typická taková akce by měla pouze to, že získá data z Form beany a pošle je skutečné aplikační logice, která nemá se Struts frameworkem nic společného (a která by mohla být stejně dobře použita s jiným frameworkem či třeba v lokální swingové aplikaci)…



20. 5. 2003 10:40

Pavel Kolesnikov (neregistrovaný)

Zmena pozadavku je zivot, a nici chyba...

Mozna by se dalo rici, ze to je chyba obchodnika, pokud se implementace pozadovanych zmen nevyplati dodavateli, ci naopak chyba zakaznika, pokud na to doplati tezko specifikovatelne "prilis".



Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

DigiZone.cz: ČRo rozšiřuje DAB do Berouna

ČRo rozšiřuje DAB do Berouna

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Vitalia.cz: Říká amoleta - a myslí palačinka

Říká amoleta - a myslí palačinka

DigiZone.cz: NG natáčí v Praze seriál o Einsteinovi

NG natáčí v Praze seriál o Einsteinovi

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Měšec.cz: Finančním poradcům hrozí vracení provizí

Finančním poradcům hrozí vracení provizí

Podnikatel.cz: Na poslední chvíli šokuje vyjímkami v EET

Na poslední chvíli šokuje vyjímkami v EET

Podnikatel.cz: Babiše přesvědčila 89letá podnikatelka?!

Babiše přesvědčila 89letá podnikatelka?!

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Lupa.cz: UX přestává pro firmy být magie

UX přestává pro firmy být magie

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Recenze Westworld: zavraždit a...

Recenze Westworld: zavraždit a...

Podnikatel.cz: Prodává přes internet. Kdy platí zdravotko?

Prodává přes internet. Kdy platí zdravotko?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život