Tvorba informačních systémů 1/49 Tvorba informačních systémů Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Tvorba informačních systémů, 2008/2009
Tvorba informačních systémů 2/49 Úvod Obsah Úvod, Model-View-Controller, Model Struts2, Struktura aplikace, Lokalizace, validace. Ukázky.
Tvorba informačních systémů 3/49 Úvod Co je to aplikační rámec? Sada spolupracujících tříd a rozhraní určených pro řešení specifického problému. Třídy a komponenty představují abstrakce určitých pojmů. Aplikační rámec definuje, jak se tyto abstrakce podílejí na řešení problémů. Komponenty aplikačního rámce jsou opakovaně použitelné.
Tvorba informačních systémů 4/49 Úvod Aplikační rámec, poznámky 1/2 Přestože to tak na první pohled často nevypadá, využití aplikačního rámce nám má ušetřit práci. Neměli bychom ovšem zapomenout na to, že uživatele zajímá pouze užitná hodnota díla (funkčnost, uživatelské rozhraní). Neměli bychom tedy nikdy říci: Tento prvek se nemůže v aplikaci objevit protože náš aplikační rámec to nepodporuje. Aplikační rámce nám často nabízejí určité řešení (např. GridView v ASP.NET pro zobrazení množiny záznamů), nicméně musíme být schopni implementovat úpravy, které maximálně vyhovují našim potřebám.
Tvorba informačních systémů 5/49 Úvod Aplikační rámec, poznámky 2/2 Technologie nejsou cílem, ale prostředkem. Pro uživatele není zajímavé zda je použit WebSphere od IBM nebo Struts2-Spring-Hibernate. Zajímá jej ovšem, že díky režii zvoleného rámce pro přístup do databáze, trvají transakce 10 déle. Technologie by se nikdy neměla stát brzdou projektu, což se stává především při jejím nezvládnutí. Kvalitní informační systém může být jen velmi stěží napsán lidmi, kteří nemají žádnou zkušenost s vývojem informačních systémů a navíc nemají žádné zkušenosti s danou technologií. => Praxe nad zlato.
Tvorba informačních systémů 6/49 Návrhový vzor MVC Architektura JSP Model 1
Tvorba informačních systémů 7/49 Návrhový vzor MVC Architektura JSP Model 2
Tvorba informačních systémů 8/49 Návrhový vzor MVC Architektura JSP Model 2 Klient zasílá požadavek řídícímu servletu bez zapojení JSP stránky. Po zpracování požadavku je řízení přesměrováno na JSP stránku. Důvod/výhody: možnost centralizace některých činností: autentizace, sledování činností (logging), podpora národních verzí (i18n).
Tvorba informačních systémů 9/49 Návrhový vzor MVC Návrhový vzor MVC 1/3 Oddělení aplikační logiky, prezentace a zpracování požadavku. Komponenty model reprezentace stavu zájmové domény aplikace, view prezentace modelu, controller řízení toku a stavu požadavku. Proti obecnému návrhovému vzoru komplikovanější šíření událostí.
Tvorba informačních systémů 10/49 Návrhový vzor MVC Návrhový vzor MVC 2/3 c Jouni Lappalainen, Mikko Rajanen
Tvorba informačních systémů 11/49 Návrhový vzor MVC Návrhový vzor MVC 3/3 c Jouni Lappalainen, Mikko Rajanen
Tvorba informačních systémů 12/49 Aplikační rámce a J2EE Aplikační rámce a J2EE Struts 1.x a 2.x http://struts.apache.org/1.x/ http://struts.apache.org/2.x/ Java Server Faces http://java.sun.com/j2ee/javaserverfaces/ Spring Framework http://www.springsource.org/ Expresso http://www.jcorporate.com/ Velocity http://velocity.apache.org/
Tvorba informačních systémů 13/49 Aplikační rámce a J2EE Prvky webové aplikace, J2EE třídy reprezentující model, servlety, stránky JSP, standardní knihovny tříd, dokumenty HTML, klientské applety, styly a skripty, multimediální soubory (obrázky, zvuk, video,...), textové dokumenty,...
Tvorba informačních systémů 14/49 Aplikační rámce a J2EE Struktura webové aplikace Kontext aplikace kořenový adresář např. http://www.cs.vsb.cz/katis/ Privátní adresáře (nedostupné přes web) WEB-INF konfigurace, WEB-INF/classes kód aplikace, WEB-INF/lib pomocné knihovny. Není vhodné (bezpečné) umožnit uživateli přímo přistoupit k JSP stránkám, často je tedy umist ujeme do adresáře WEB-INF/jsp a přistupujeme k nim pomocí akcí.
Tvorba informačních systémů 15/49 Architektura Struts2 Aplikační rámec Struts2 Návrhový vzor Model-View-Controller. Architektura JSP Model 2. Jedná se o množinu tříd (a uživatelských značek), které jsou rozděleny do balíčků. http://struts.apache.org/2.x/
Tvorba informačních systémů 16/49 Architektura Struts2 Struktura webové aplikace
Tvorba informačních systémů 17/49 Architektura Struts2 WEB-INF/web.xml Soubor WEB-INF/web.xml je platný pro J2EE: nastavení doby platnosti session, nastavení implicitní stránky, výběr a parametry řídícího servletu, mapování řídícího servletu.
Tvorba informačních systémů 18/49 Architektura Struts2 WEB-INF/web.xml 1 <?xml version= " 1.0 " encoding= "UTF 8"?> 2 <web app.... > 3 <session c o n f i g ><session timeout >30< / session timeout > 4 < / session c o n f i g > 5 < display name>struts2app< / display name> 6 < f i l t e r > 7 < f i l t e r name> s t r u t s 2 < / f i l t e r name> 8 <! < f i l t e r class>org. apache. s t r u t s 2. d i s p a t c h e r. F i l t e r D i s p a t c h e r 9 < / f i l t e r class> > 10 < f i l t e r class> 11 org. apache. s t r u t s 2. d i s p a t c h e r. ng. f i l t e r. StrutsPrepareAndExecuteFilter 12 < / f i l t e r class> 13 < / f i l t e r > 14 15 < f i l t e r mapping> 16 < f i l t e r name> s t r u t s 2 < / f i l t e r name> 17 < u r l p a t t e r n > / < / u r l p a t t e r n > 18 < / f i l t e r mapping> 19 < / web app> Popis: 6-13: Výběr třídy reprezentující kontroler.
Tvorba informačních systémů 19/49 Architektura Struts2 WEB-INF/classes/struts.xml Soubor WEB-INF/struts.xml je platný pro Struts2. Slouží především pro nastavení akcí: definujeme jaká akční třída zpracovává uživatelský požadavek a na jakou JSP stránku je poté přesměrováno řízení. Kontroler se stará o provedení příslušné uživatelské akce: V akční třídě je využit model aplikace. JSP stránka (view) zobrazí stav modelu a obsahuje definice požadavků, které budou předány kontroleru. kontroler se stará...
Tvorba informačních systémů 20/49 Struts2, Lokalizace Lokalizace, úvod Zařazení kontroleru do architektury umožňuje centralizaci některých činností, např.: lokalizace, přihlašování a role, logování, validace položek formulářů. Pokud chceme ve Struts2 použít různá národní prostředí, musíme do adresáře s akčními třídami přidat: soubor package.properties pro implicitní jazyk, pro každý jazyk soubor: package.properties_<language code>[_<country code>]
Tvorba informačních systémů 21/49 Struts2, Lokalizace Lokalizační soubory package.properties_en welcomemessage = Struts is up and running... password = Password login = User Name... package.properties_cs_cz welcomemessage= Struts běží... password = Heslo login = Uživatelské jméno...
Tvorba informačních systémů 22/49 Struts2, Lokalizace Využití lokalizace V akční třídě můžeme použít: String str = gettext("welcomemessage"); V JSP stránce můžeme použít: <s:property value="gettext( password )"/> <s:text name="login"/>
Tvorba informačních systémů 23/49 Struts2, Lokalizace Volba jazykového prostředí Jazyk je možné zvolit dvěma způsoby: Nastavením jazyka prohlížeče - pro uživatele to může být matoucí. Nabídnutím linku, který akci předává parametr request_locale s hodnotou <language code>[_<country code>]
Tvorba informačních systémů 24/49 Struts2, Příklad HelloWorld WEB-INF/classes/struts.xml 1 <!DOCTYPE s t r u t s PUBLIC 2 " //Apache Software Foundation / / DTD S t r u t s C o n f i g u r a t i o n 2. 0 / /EN" 3 " h t t p : / / s t r u t s. apache. org / dtds / s t r u t s 2.0. dtd " > 4 < s t r u t s > 5... 6 <package name= " Struts2App " extends= " s t r u t s d e f a u l t " > 7 <default action r e f name= " HelloWorld " / > 8 < a c t i o n name= " HelloWorld " class=" a c t i o n. HelloWorldAction " > 9 < r e s u l t > /WEB INF / j s p / HelloWorld. j s p < / r e s u l t > 10 < / a c t i o n > 11... 12 < / package> 13 < / s t r u t s > Význam: 7-10: Zvolením akce HelloWorld (např. zadáním http://localhost:8166/struts2app/helloworld) bude řízení přesměrováno na akční třídu action.helloworldaction, poté bude řízení přesměrováno na /WEB-INF/jsp/HelloWorld.jsp
Tvorba informačních systémů 25/49 Struts2, Příklad HelloWorld action.helloworldaction Controler vytvoří instanci akční třídy a předá ji řízení (implicitně zavolá metodu execute()). Pokud chceme zobrazit v JSP stránce hodnotu proměnné (např. výsledek operace modelu), pak akční třída musí dodržet konvenci JavaBean, tj. ke každému atributu type name musí existovat metody type getname() a void setname(type value). Metoda execute může vrátit následující hodnotu: SUCCESS úspěšné vykonání akce, INPUT neúspěšné vykonání akce, vstupy jsou vyžadovány znovu. Dle návratové hodnoty je řízení předáno příslušné JSP stránce (definováno ve struts.xml, např. <result name="input".../>).
Tvorba informačních systémů 26/49 Struts2, Příklad HelloWorld action.helloworldaction 1 package a c t i o n ; 2 import com. opensymphony. xwork2. ActionSupport ; 3 4 p u b l i c class HelloWorldAction extends ActionSupport { 5 p r i v a t e S t r i n g message ; 6 7 p u b l i c S t r i n g execute ( ) throws Exception { 8 setmessage ( gettext ( " welcomemessage " ) ) ; 9 r e t u r n SUCCESS; 10 } 11 12 p u b l i c void setmessage ( S t r i n g message ) { t h i s. message = message ; } 13 p u b l i c S t r i n g getmessage ( ) { r e t u r n message ; } 14 } Popis 8-11: Uživatelská akce, v tomto případě se nastaví klíč lokalizovaného řetězce do proměnné message.
Tvorba informačních systémů 27/49 Struts2, Příklad HelloWorld WEB-INF/jsp/HelloWorld.jsp 1/2 1 <%@ page language= " java " contenttype= " t e x t / html ; charset= u t f 8" %> 2 <%@ t a g l i b p r e f i x = " s " u r i = " / s t r u t s tags " %> 3 4 <html> 5 <head> 6 < t i t l e >< s : t e x t name= " welcomemessage " / >< / t i t l e > 7 < l i n k r e l = " s t y l e s h e e t " type= " t e x t / css " h r e f = " s t y l e. css " > 8 < / head> 9 <body> 10 11 <h2>< s : p r o p e r t y value= " message " / >< / h2> 12 13 < s : p r o p e r t y value= " gettext ( password ) " / ><br / > 14 < s : t e x t name= " l o g i n " / > Popis: 11: Vypsána hodnota atributu instance akční třídy (JavaBean). 6,13,14: Různý způsob výpisu lokalizovaných řetězců.
Tvorba informačních systémů 28/49 Struts2, Příklad HelloWorld WEB-INF/jsp/HelloWorld.jsp 2/2 1 <h3>languages< / h3> 2 < u l > 3 < l i > 4 < s : u r l i d = " u r l " a c t i o n = " HelloWorld " > 5 <s:param name= " r e q u e s t _ l o c a l e " >en< / s:param> 6 < / s : u r l > 7 <s:a h r e f = "%{ u r l } " >English< / s:a> 8 < / l i > 9 < l i > 10 < s : u r l i d = " u r l " a c t i o n = " HelloWorld " > 11 <s:param name= " r e q u e s t _ l o c a l e " >cs_cz< / s:param> 12 < / s : u r l > 13 <s:a h r e f = "%{ u r l } " >Čš e t i n a < / s:a> 14 < / l i > 15 < / u l > 16 < / body>< / html> Popis: 4-7,10-13: Formátování url pro předání request_locale parametru výběr národního prostředí.
Tvorba informačních systémů 29/49 Struts2, Příklad HelloWorld Příklad, HelloWorld
Tvorba informačních systémů 30/49 Struts2, Validace položek formuláře Validace položek formuláře Klasifikace: Validace na straně klienta - poskytuje uživateli větší komfort. Validace na straně serveru. Validační pravidla zapisujeme od souboru: <Action class name>-validation.xml Validace na straně klienta se zapíná nastavením atributu validate=true elementu form. Některá validační pravidla ovšem nejsou stejná pro validaci na straně clienta i serveru.
Tvorba informačních systémů 31/49 Příklad, StudentNew WEB-INF/jsp/StudentNew.jsp 1 <%@ page language= " java " contenttype= " t e x t / html ; charset= u t f 8" %> 2 <%@ t a g l i b p r e f i x = " s " u r i = " / s t r u t s tags " %> 3 <html><head> 4 < t i t l e >Simple S t r u t s 2 App< / t i t l e > 5 < l i n k r e l = " s t y l e s h e e t " type= " t e x t / css " h r e f = " s t y l e. css " > 6 < / head><body> 7 8 <b>< s : t e x t name= " r e s u l t " / > : < / b> < s : p r o p e r t y value= " r e s u l t " / > 9 10 <s:form a c t i o n = " StudentNew " > 11 < s : t e x t f i e l d name= " l o g i n " size=" 5 " key= " l o g i n " / > 12 < s : t e x t f i e l d name= " fname " size=" 20 " key= " fname " / > 13 < s:submit name= " submit " key= " submit " / > 14 < / s:form> 15 < / body>< / html> Popis: 10-14: Definice formuláře jehož položky budou validovány a předány akční třídě. Atribut key slouží k vypsáni lokalizovaného popisu položky formuláře.
Tvorba informačních systémů 32/49 Příklad, StudentNew WEB-INF/classes/struts.xml 1 <!DOCTYPE s t r u t s PUBLIC 2 " //Apache Software Foundation / / DTD S t r u t s C o n f i g u r a t i o n 2. 0 / /EN" 3 " h t t p : / / s t r u t s. apache. org / dtds / s t r u t s 2.0. dtd " > 4 < s t r u t s > 5... 6 <package name= " Struts2App " extends= " s t r u t s d e f a u l t " > 7... 8 < a c t i o n name= " StudentNew_ " class=" a c t i o n. StudentNew " method= " { 1 } " > 9 < r e s u l t name= " i n p u t " > /WEB INF / j s p / StudentNew. j s p < / r e s u l t > 10 < r e s u l t > /WEB INF / j s p / StudentNew. j s p < / r e s u l t > 11 < / a c t i o n > 12... Popis: 8-11: JSP stránky jsou uloženy ve skrytém adresáři WEB-INF/jsp, po zadání požadavku StudentNew_input se zobrazí prázdný formulář, po zadání StudentNew, formulář projde validací a je zavolána metoda execute akční třídy StudentNew.
Tvorba informačních systémů 33/49 1 <!DOCTYPE v a l i d a t o r s PUBLIC 2 " //OpenSymphony Group / / XWork V a l i d a t o r 1. 0. 2 / /EN" 3 " h t t p : / /www. opensymphony. com / xwork / xwork v a l i d a t o r 1.0.2. dtd " > 4 < v a l i d a t o r s > 5 < f i e l d name= " l o g i n " > 6 < f i e l d v a l i d a t o r type= " r e q u i r e d s t r i n g " > 7 <message key= " s t r i n g R e q u i r e d " / > 8 < / f i e l d v a l i d a t o r > 9 < f i e l d v a l i d a t o r type= " regex " > 10 <param name= " expression " > [ a z ] { 3 } [ 0 9 ] { 2 } < / param> 11 <message>login must have the f o l l o w i n g f o r m a t : cccnn< / message> 12 < / f i e l d v a l i d a t o r > 13 < / f i e l d > Popis: 5-13: Validační pravidla pro hodnotu atributu login. 6-8: Hodnota je požadována. Hodnota key reprezentuje lokalizovaný řetězec. 9-12: Definice regulárního výrazu, který musí položka splnit. Pokud hodnota nesplňuje tento výraz, je na JSP stránce vypsána zpráva message. Příklad, StudentNew src/action/studentnew-validation.xml 1/2
Tvorba informačních systémů 34/49 Příklad, StudentNew src/action/studentnew-validation.xml 2/2 1 < f i e l d name= " fname " > 2 < f i e l d v a l i d a t o r type= " r e q u i r e d s t r i n g " > 3 <message key= " s t r i n g R e q u i r e d " / > 4 < / f i e l d v a l i d a t o r > 5 < / f i e l d > 6 < / v a l i d a t o r s > Popis: 1-5: Validační pravidla pro hodnotu atributu fname. 2-4: Hodnota je požadována. Hodnota key reprezentuje lokalizovaný řetězec.
Tvorba informačních systémů 35/49 Příklad, StudentNew src/action/studentnew 1/2 1 package a c t i o n ; 2 3 import com. opensymphony. xwork2. ActionSupport ; 4 5 public class StudentNew extends ActionSupport 6 { 7 private S t r i n g l o g i n ; 8 private S t r i n g fname ; 9 10 private S t r i n g r e s u l t ; 11 12 public S t r i n g execute ( ) throws Exception { 13 / / A task f o r a model 14 return SUCCESS; 15 } Popis 12-15: Uživatelská akce, v tomto případě se pouze vrátí SUCCESS. Zde bude později využit model.
Tvorba informačních systémů 36/49 Příklad, StudentNew src/action/studentnew 2/2 1 public S t r i n g getlogin ( ) { return l o g i n ; } 2 public void setlogin ( S t r i n g l o g i n ) { this. l o g i n = l o g i n ; } 3 4 public S t r i n g getfname ( ) { return fname ; } 5 public void setfname ( S t r i n g fname ) { this. fname = fname ; } 6 7 public void setresult ( i n t r e s u l t ) { this. r e s u l t = r e s u l t ; } 8 public i n t getresult ( ) { return r e s u l t ; } 9 } Popis: Aby akční třídě byly předány hodnoty formuláře, musí třída obsahovat stejné atributy jako formulář a splňovat konvenci JavaBean. Akční třída tedy musí být komponentou JavaBean jak z pohledu vstupu formuláře z JSP stránky, tak z pohledu výstupu do JSP stránky.
Tvorba informačních systémů 37/49 Příklad, StudentNew Shrnutí 1 Zvolení JSP stránky, např. http://localhost:8166/struts2app/studentnew_input: uživateli je předán soubor WEB-INF/jsp/StudentNew.jsp. 2 Po vyplnění formuláře a odeslání na server (požadavek StudentNew) kontroler spustí validaci pravidly ze souboru StudentNew-validation.xml. 3 Pokud jsou položky validní, kontroler předá řízení akční třídě StudentNew: je zavolána metoda execute, ve které je nastaven případný výsledek. 4 Kontroler předá řízení WEB-INF/src/StudentNew.jsp, kde je výsledek vypsán. Poznámka: Model není v této chvíli použit.
Tvorba informačních systémů 38/49 Příklad, StudentNew Shrnutí User StudentNew_input Controler struts.xml Localization StudentNew.input() StudentNew.jsp StudentNew Controler struts.xml Localization Validation StudentNew-validation.xml StudentNew.execute() StudentNew.jsp
Tvorba informačních systémů 39/49 Příklad, StudentNew Ukázka
Tvorba informačních systémů 40/49 Validace Validace celočíselných položek 1 < f i e l d name= " number1 " > 2 < f i e l d v a l i d a t o r type= " r e q u i r e d s t r i n g " > 3 <message key= " s t r i n g R e q u i r e d " / > 4 < / f i e l d v a l i d a t o r > 5 < f i e l d v a l i d a t o r type= " regex " > 6 <param name= " expression " >[0 9] < / param> 7 <message key= " i n t f i e l d F o r m a t " / > 8 < / f i e l d v a l i d a t o r > 9 < / f i e l d > Popis: 2-4: Položka je požadována. 5-8: Validace regulárním výrazem, v případě chyby je vypsán lokalizovaný řetězec intfieldformat.
Tvorba informačních systémů 41/49 Validace Validace emailové adresy 1 < f i e l d name= " email " > 2 < f i e l d v a l i d a t o r type= " r e q u i r e d s t r i n g " > 3 <message key= " s t r i n g R e q u i r e d " / > 4 < / f i e l d v a l i d a t o r > 5 < f i e l d v a l i d a t o r type= " email " > 6 <message key= " f i e l d F o r m a t " / > 7 < / f i e l d v a l i d a t o r > 8 < / f i e l d > Popis: 2-4: Položka je požadována. 5-8: Validace emailové adresy, v případě chyby je vypsán lokalizovaný řetězec fieldformat.
Tvorba informačních systémů 42/49 Validace Validace datumu 1 < f i e l d name= " b i r t h d a t e " > 2 < f i e l d v a l i d a t o r type= " r e q u i r e d s t r i n g " > 3 <message key= " s t r i n g R e q u i r e d " / > 4 < / f i e l d v a l i d a t o r > 5 < f i e l d v a l i d a t o r type= " regex " > 6 <param name= " expression " > 7 [0 3][0 9]/[0 1][0 9]/[1 2][0 9]{3} 8 < / param> 9 <message key= " d a t e f i e l d F o r m a t " / > 10 < / f i e l d v a l i d a t o r > 11 < / f i e l d > Popis: 2-4: Položka je požadována. 5-10: Validace regulárním výrazem, v případě chyby je vypsán lokalizovaný řetězec datefieldformat.
Tvorba informačních systémů 43/49 Ukázkový příklad Další možnosti formuláře, ukázka
Tvorba informačních systémů 44/49 Ukázkový příklad Další možnosti formuláře, JSP 1 <s:form a c t i o n = " StudentNew_input " > 2 < s : t e x t f i e l d name= " l o g i n " size=" 5 " key= " l o g i n " r e q u ired=" t r u e " 3 j a v a s c r i p t T o o l t i p = " t r u e " t o o l t i p = " cccnn " / > 4 < s : t e x t f i e l d name= " fname " size=" 20 " key= " fname " required=" t r u e " / > 5 < s : t e x t f i e l d name= " number1 " size=" 5 " key= " number1 " required=" t r u e " / > 6 < s : t e x t f i e l d name= " number2 " size=" 5 " key= " number2 " required=" t r u e " / > 7 < s : t e x t f i e l d name= " email " size=" 20 " key= " email " required=" t r u e " / > 8 < s : t e x t f i e l d name= " b i r t h d a t e " size=" 20 " key= " b i r t h d a t e " 9 r e q u i r e d = " t r u e " 10 j a v a s c r i p t T o o l t i p = " t r u e " t o o l t i p = " dd /mm/ yyyy " / > 11 < s:submit name= " submit " key= " submit " / > 12 < / s:form> Popis: Nastavení povinného atributu, tooltipu položky apod.
Tvorba informačních systémů 45/49 Ukázkový příklad Národní prostředí package.properties_cs_cz welcomemessage= Struts běží... stringrequired = ${gettext(fieldname)} je povinná položka fieldformat = ${gettext(fieldname)} není korektní intfieldformat = ${gettext(fieldname)} není celé číslo datefieldformat = ${gettext(fieldname)} není korektní, korektní tvar: dd/mm/rrrr password = Heslo login = Uživatelské jméno fname = Jméno lname = Příjmení number1 = První číslo number2 = Druhé číslo email = Email birthdate = Datum narození result = Výsledek submit = Zaslat Missing.message = V rekonstrukci, pracujeme na tom.
Tvorba informačních systémů 46/49 Ukázkový příklad Nastavení vzhledu Soubor style.css: 1 body { background c o l o r : #d5d5d5 ; font f a m i l y : A r i a l ; c o l o r : b l a c k ; } 2 span. errormessage { font f a m i l y : A r i a l ; c o l o r : red ; t e x t a l i g n : c e n t e r ; 3 margin: 1mm }
Tvorba informačních systémů 47/49 Závěr Vývoj webové aplikace V aplikačním serveru, např. Tomcat, GlassFish apod. Překládáme pomocí ant v adresáři obsahující soubor build.xml. V libovolném IDE podporujícím ladění J2EE aplikací, např. Netbeans. Výsledkem je war soubor, který může být (po odladění) vložen do aplikačního serveru. Byt chování IDE není vždy dokonalé (např. opožděný výpis log souboru aplikačního serveru, občasné ztrácení tříd apod.), možnost ladění je významným důvodem pro jejich použití.
Tvorba informačních systémů 48/49 Závěr Co chybí? reprezentace modelu, přístup k databázi, přihlášení a role, rozvržení vhledu aplikace (tiles), nastavení témat UI.
Tvorba informačních systémů 49/49 Závěr Reference http://struts.apache.org/2.x/ http://struts.apache.org/2.x/docs/ core-developers-guide.html http://struts.apache.org/2.x/docs/ validation.html Ukázková aplikace: http://www.cs.vsb.cz/kratky/ courses/2008-09/tis/download/struts2app.zip