Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Internetove technologie na platforme Java

2,179 views

Published on

Bakalarska prace pro FEL CVUT na tema Internetove technologie na platforme Java. Reserse na Spring 2, Hibernate 3, Test Driven Development, Web Development, Spring MVC, Spring Web Flow a nasledna implementace "ukazkove aplikace", webu www.chcispolubydlici.cz

  • Be the first to comment

Internetove technologie na platforme Java

  1. 1. ˇe Cesk´ vysok´ uˇen´ technick´ v Praze ecı e Fakulta elektrotechnick´ a ˇ CVUT FEL katedra poc´tac ˚ ˇı ˇu Bakal´ˇsk´ pr´ce ar a a Internetov´ technologie na platformˇ JAVA e e Miroslav Hr´z u Vedouc´ pr´ce: Ing. Andrej Zachar ıa Studijn´ program: Elektrotechnika a informatika strukturovan´ bakal´ˇsk´ ı e ar e Obor: Informatika a v´poˇetn´ technika ycı srpen 2007
  2. 2. ii
  3. 3. Podˇkov´n´ e aı Chtˇl bych podˇkovat firmˇ SimpleWay s.r.o., kde jsem mˇl tu moˇnost sezn´mit se s techno- e e e e z a logiemi, kter´ popisuji ve svoj´ bakal´ˇsk´ pr´ci. e ı ar e a iii
  4. 4. iv
  5. 5. Prohl´ˇen´ as ı Prohlaˇuji, ˇe jsem svou bakal´ˇskou pr´ci vypracoval samostatnˇ a pouˇil jsem pouze podklady s z ar a e z uveden´ v pˇiloˇen´m seznamu. e rze Nem´m z´vaˇn´ d˚vod proti uˇit´ tohoto ˇkoln´ d´ ve smyslu §60 Z´kona ˇ. 121/2000 Sb., a a zy u zı s ıho ıla a c o pr´vu autorsk´m, o pr´vech souvisej´ ıch s pr´vem autorsk´m a o zmˇnˇ nˇkter´ch z´kon˚ a e a ıc´ a y ee e y a u (autorsk´ z´kon). ya V Praze dne 21.8. 2007 ............................................................. v
  6. 6. vi
  7. 7. Abstract The goal of this bachalor thesis is to show possibilities of the Java platform for building web applications. Content of this paper is from on piece a recherche and from other piece an im- plementation. In the beginning I make the reader acquainted with technologies like Java EE, Spring framework and Hibernate ORM. In the next section I show the principles of Extreme programming and Test-Driven development. In the last section I apply knowledges of foregoing parts to the practical project, to the portal for seeking roommates. I show illuminating apply of Extreme programming in the real life. Abstrakt C´ılem t´to bakal´ˇsk´ pr´ce je uk´zat moˇnosti JAVA platformy pro tvorbu webov´ch aplikac´ e ar e a a z y ı. Obsah d´ je z ˇ´sti reˇerˇn´ z ˇ´sti implementaˇn´ V uvodu seznamuji ˇten´ˇe s techno- ıla ca s s ı, ca c ı. ´ c ar logiemi jako Java EE, Spring framework a Hibernate ORM. V dalˇ´ ˇ´sti ukazuji principy sı ca Extr´mn´ programov´n´ a Testem ˇ´ eho v´voje. V posledn´ ˇ´sti aplikuji teoretick´ zna- e ıho aı rızen´ y ı ca e losti z pˇedchoz´ textu na praktick´m projektu, port´lu pro hled´n´ spolubydl´ ıch. Ukazuji r ıho e a aı ıc´ n´zornou aplikaci Extr´mn´ programov´n´ v kaˇdodenn´ ˇivotˇ. a e ıho aı z ım z e vii
  8. 8. viii
  9. 9. Obsah Seznam obr´zk˚ au xiii ´ 1 Uvod 1 1.1 N´roky a technick´ obt´znost textu . . . . . . . . . . . . . . . . . . . . . . . . . a a ıˇ 1 1.2 Typografick´ uprava a ˇlenˇn´ textu . . . . . . . . . . . . . . . . . . . . . . . . a´ c eı 1 2 Reˇerˇe ss 3 2.1 Java EE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.1 V´ ıcevrstv´ architektura (N-tier architecture) a . . . . . . . . . . . . . . . 3 2.1.2 Koncept kontejneru . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.1.3 Aplikaˇn´ servery . . . . . . . . . . . . . . . . cı . . . . . . . . . . . . . . . 3 2.1.3.1 Servletov´ kontejnery . . . . . . . . e . . . . . . . . . . . . . . . 4 2.1.3.2 Java EE aplikaˇn´ servery . . . . . . cı . . . . . . . . . . . . . . . 4 2.1.4 V´bˇr technologi´ . . . . . . . . . . . . . . . . ye ı . . . . . . . . . . . . . . . 4 2.2 Spring framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.1 Aplikaˇn´ framework . . . . . . . . . . . . . . cı . . . . . . . . . . . . . . . 4 2.2.2 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2.3 Hlavn´ pˇednosti . . . . . . . . . . . . . . . . ır . . . . . . . . . . . . . . . 5 2.2.4 Moduly . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2.5 Inversion of Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2.5.1 Dependecy lookup . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.5.2 Dependecy injection . . . . . . . . . . . . . . . . . . . . . . . . 7 2.2.6 Rozhran´ BeanFactory a ApplicationContext ı . . . . . . . . . . . . . . . 8 2.2.6.1 BeanFactory . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 ˇ 2.2.6.2 Zivotnost beany . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2.6.3 Typov´ konverze . . . . . . . . . . . e . . . . . . . . . . . . . . . 11 2.2.6.4 Autowiring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.2.6.5 ApplicationContext . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.7 Spring Web MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.7.1 N´vrhov´ vzor MVC . . . . . . . . a y . . . . . . . . . . . . . . . 12 2.2.7.2 Rozdˇlen´ webov´ch framework˚ . . eı y u . . . . . . . . . . . . . . . 14 2.2.7.3 Architektura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.7.4 Dispacher servlet . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.2.7.5 Webov´ scopy . . . . . . . . . . . . e . . . . . . . . . . . . . . . 17 2.2.8 Spring Web Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2.8.1 Struktura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2.8.2 Stavy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.2.8.3 V´hody . . . . . . . . . . . . . . . . y . . . . . . . . . . . . . . . 19 2.2.8.4 Nev´hody . . . . . . . . . . . . . . . y . . . . . . . . . . . . . . . 19 2.2.8.5 Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.2.8.6 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.2.8.7 Konfigurace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3 Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3.1 ORM framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.3.2 JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.3.3 Mapov´n´ . . . . . . . . . . . . . . . . . . . . aı . . . . . . . . . . . . . . . 23 2.3.4 Anotace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.3.5 Pr´ce s objekty . . . . . . . . . . . . . . . . . a . . . . . . . . . . . . . . . 24 ix
  10. 10. 2.3.6 Dotazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.6.1 HQL API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.6.2 Criteria API . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3.7 Lazy, Eager loading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.3.8 Integrace se Springem . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.3.8.1 Deklarativn´ transakce . . . . . . . . . . . . . . . ı . . . . . . . . 26 2.4 Extr´mn´ programov´n´ . . . . . . . . . . . . . . . . . . . . . . . eı aı . . . . . . . . 27 2.4.1 Historie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.4.2 Role . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 2.4.3 Z´kladn´ postupy . . . . . . . . . . . . . . . . . . . . . . . a ı . . . . . . . . 28 2.4.3.1 Pl´novac´ hra . . . . . . . . . . . . . . . . . . . . a ı . . . . . . . . 28 2.4.3.2 Mal´ iterace . . . . . . . . . . . . . . . . . . . . e . . . . . . . . 28 2.4.3.3 Metafora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.4.3.4 Testov´n´ . . . . . . . . . . . . . . . . . . . . . . aı . . . . . . . . 29 2.4.3.5 Jednoduch´ n´vrh . . . . . . . . . . . . . . . . . ya . . . . . . . . 29 2.4.3.6 Refaktorov´n´ . . . . . . . . . . . . . . . . . . . aı . . . . . . . . 29 2.4.3.7 P´rov´ programov´n´ . . . . . . . . . . . . . . . ae aı . . . . . . . . 29 2.4.3.8 Kolektivn´ vlastnictv´ k´du . . . . . . . . . . . . ı ıo . . . . . . . . 29 2.4.3.9 40-ti hodinov´ pracovn´ t´den . . . . . . . . . . y ıy . . . . . . . . 29 2.4.3.10 Z´kazn´ na spr´vn´m m´ e (On-site customer) a ık ae ıstˇ . . . . . . . . 30 2.4.3.11 Standardn´ podoba k´du . . . . . . . . . . . . . ı o . . . . . . . . 30 2.4.3.12 Sjednocen´ pracovn´ prostˇed´ . . . . . . . . . . e ı rı . . . . . . . . 30 2.5 Testovac´ framework JUnit . . . . . . . . . . . . . . . . . . . . . ı . . . . . . . . 30 2.5.1 JUnit 3.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.5.1.1 Architektura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.5.1.2 Assert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2.5.1.3 Integrace s IDE . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.5.2 JUnit 4.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.5.2.1 Hlavn´ zmˇny oproti 3.x . . . . . . . . . . . . . . ı e . . . . . . . . 31 2.5.2.2 assertThat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 2.5.2.3 Pˇedpoklady a teorie . . . . . . . . . . . . . . . r . . . . . . . . 32 2.6 Testovac´ framework JMock . . . . . . . . . . . . . . . . . . . . . ı . . . . . . . . 32 2.6.1 Mockov´n´ Mock objekty . . . . . . . . . . . . . . . . . . a ı, . . . . . . . . 32 2.6.2 Architektura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.6.3 Pˇ´rıklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3 Implementace 35 3.1 Zad´n´ . . . . . . . . . . . . . . . . . aı . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2 Anal´za . . . . . . . . . . . . . . . . y . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.1 Co uˇ je naimplementov´no? z a . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.2 Pr˚zkum trhu . . . . . . . . . u . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.3 Prototypy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.3 Implementace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.3.1 Iterace 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.3.2 Iterace 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.3 Iterace 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.4 Iterace 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4 Zhodnocen´ ı 59 4.1 Shrnut´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ı 59 4.2 Moˇnosti rozˇ´ren´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . z sıˇ ı 59 x
  11. 11. 4.3 Osobn´ zkuˇenosti ı s .................................. 59 5 Obsah pˇiloˇen´ho CD rze 61 6 Literatura 63 7 Seznam pouˇit´ch zkratek zy 65 xi
  12. 12. xii
  13. 13. Seznam obr´zk˚ au 2.1 Kontext Java EE technologi´ zdroj: [6] . . . . . . . ı, .......... ... . . . 3 2.2 Spring framework, zdroj: [13] . . . . . . . . . . . . .......... ... . . . 5 2.3 Princip IoC, zdroj: [13] . . . . . . . . . . . . . . . . .......... ... . . . 6 2.4 N´vrhov´ vzor MVC, zdroj: [15] . . . . . . . . . . a y .......... ... . . . 13 2.5 MVC implementace JSP Model 2, zdroj: [1] . . . . .......... ... . . . 13 2.6 Architektura aplikace ve Spring MVC, zdroj: [20] . .......... ... . . . 14 2.7 Stavy objektu a pˇechody pomoc´ metod persistent r ı manageru, zdroj: [17] . . . 25 2.8 Pr˚bˇh v´voje v XP . . . . . . . . . . . . . . . . . ue y .......... ... . . . 28 3.1 Z´kladn´ UI prototyp . . . a ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2 Vkl´d´n´ nov´ho inzer´tu aaı e a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.3 Validace poloˇky . . . . . z . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.4 Nov´ inzer´t v´ lokalit . y a ıce . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.5 Hled´n´ v popt´vk´ch . . aı aa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 xiii
  14. 14. xiv
  15. 15. ´ KAPITOLA 1. UVOD 1 ´ 1 Uvod Internet se v dneˇn´ dobˇ stal nepostradatelnou z´leˇitost´ m˚ˇeme ho vyuˇ´ sı e az ı, uz zıvat r˚zn´mi zp˚soby a vydolovan´ch informac´ je v´ neˇ dost. Je to v dneˇn´ dobˇ, st´le, nejper- uy u y ı ıce z sı ea spektivnˇjˇ´ reklamn´ m´dium na svˇtˇ. Z´kazn´ u, pˇej´ ıch si m´ na internetu svoji prezentaci e sı ıe ee a ık˚ r ıc´ ıt st´le pˇib´v´. Nen´ proto od vˇci se sezn´mit s technologiemi pouˇit´mi pro v´voj internetov´ch a r ya ı e a zy y y aplikac´ı. Tato pr´ce pojedn´v´ o tvorbˇ rozs´hlejˇ´ aplikac´ na platformˇ JAVA. JAVA spolu a aa e a sıch ı e s technologiemi .NET a Ruby on rails vede ˇebˇ´cky statistik pouˇit´ch platforem [12] a z rıˇ zy pokud si zvol´ ıme vhodnou metodiku v´voje, aplikace n´m roste pod rukama velice rychle. y a 1.1 N´roky a technick´ obt´znost textu a a ıˇ Pr´ce by mˇla slouˇit jako studijn´ materi´l vˇem, kteˇ´ maj´ z´jem vyv´ internetov´ a e z ı as rı ıa ıjet e aplikace na platformˇ Java. Pˇedpokl´d´m proto patˇiˇnou znalost tohoto jazyka. Je dobˇe, po- e r aa rc r kud m´ ˇten´ˇ znalost v´voje webov´ch aplikac´ na jin´ platformˇ (napˇ´ a c ar y y ı e e rıklad s PHP). Na ˇkodu s nejsou zkuˇenosti s v´vojem pro Java EE, znalost tvorby JSP str´nek nebo JPA, plnˇ postaˇuje s y a e c absolvov´n´ pˇedmˇtu X36TJV - Technologie programov´n´ v jazyku Java, vyuˇovan´ho u n´s aı r e aı c e a na fakultˇ. e 1.2 Typografick´ uprava a ˇlenˇn´ textu a´ c eı Veˇker´ text je ps´n pomoc´ n´stroje L TEX, s pouˇit´ pˇipraven´ ˇablony, kterou sy a ıa z ım r es A poskytuje katedra. Text je ˇlenˇn hierarchicky do kapitol, sekc´ a podsekc´ Pro lepˇ´ ˇitelnost ce ı ı. sı c a orientaci v textu budu veˇker´ k´d ps´t takto, pokud budu v textu hovoˇit o rozhran´ s yo a r ıch, zapisuji je takto. Tˇ´ a metody zapisuji takto. Pr´ce je ps´na v ˇeˇtinˇ, aˇkoliv je IT odvˇtv´ rıdy a a cs e c eı charakteristick´ vˇemoˇn´mi anglick´mi term´ tam, kde to lze, jsem pouˇil jejich ˇesk´ ekvi- es zy y ıny, z cy valent s origin´ln´ znˇn´ v z´vork´ch. a ım e ım a a
  16. 16. ´ 2 KAPITOLA 1. UVOD
  17. 17. ˇˇ KAPITOLA 2. RESERSE 3 2 Reˇerˇe ss 2.1 Java EE Java Enterprice Edition je platforma urˇen´ pro v´voj byznys aplikac´ St´vaj´ ı spe- ca y ı. a ıc´ cifikace Java EE 5 definuje ˇadu technologi´ a API potˇebn´ch pro v´voj rozs´hl´ch syst´m˚. r ı r y y ay eu Dˇ´ se platforma oznaˇovala zkratkou J2EE, z marketingov´ch d˚vod˚, stejnˇ jako JRE 1.5 rıve c y u u e se oznaˇuje Java 5, se pˇejmenovala na Java EE. Aktu´lnˇ je cel´ JVM opensourceov´no a Javˇ c r ae e a e nic nestoj´ v cestˇ st´t se nejpouˇ´ ejˇ´ platformou od mobiln´ telefon˚ po velk´ byznys apli- ı ea zıvanˇ sı ıch u e kace. Kromˇ standardn´ API jsou k dispozici stovky opensourceov´ch knihoven, framework˚ e ıch y u a projekt˚. Nejdˇ´ se sezn´m´ se z´klady. u rıve a ıme a Obr´zek 2.1: Kontext Java EE technologi´ zdroj: [6] a ı, 2.1.1 V´ ıcevrstv´ architektura (N-tier architecture) a Architektura byznys aplikace v Java EE se typicky skl´d´ z ˇ´st´ jeˇ ukazuje obr´zek a a ca ı, z a 2.1. Vˇdy se jedn´ o model klient/server [2], resp. request/response, serverov´ ˇ´st se skl´d´ z a a ca aa z webov´ho kontejneru, doplnˇn´ho v pˇ´ e pouˇit´ specifikace EJB o EJB kontejner, d´le e ee rıpadˇ zı a jak´hokoliv perzistentn´ datov´ho uloˇiˇtˇ (pˇedstavme si napˇ´ e ıho e ´ zs e r rıklad klasickou relaˇn´ da- cı tab´zi) a nˇjak´ho klienta, v naˇem pˇ´ e webov´ho prohl´zeˇe. a ee s rıpadˇ e ıˇ c 2.1.2 Koncept kontejneru Kontejner je takov´ softwarov´ objekt, kter´ je alokov´n uvnitˇ dan´ho aplikaˇn´ y y y a r e c ıho serveru nebo aplikaˇn´ frameworku. c ıho • Zodpov´ a za pˇidˇlov´n´ zdroj˚ dan´m komponent´m. ıd´ r e aı u y a ˇ ıd´ z • R´ ı ˇivotn´ cyklus objekt˚. ı u Nˇkdy se pojmy jako framework a kontejner z´mˇrnˇ zamˇnuj´ napˇ. EJB a EJB kon- e aee eˇ ı, r tejner, Spring a Spring kontejner. 2.1.3 Aplikaˇn´ servery cı Aplikaˇn´ server je j´drem Java EE technologie. Podle poˇtu implementovan´ch speci- cı a c y fikac´ je m˚ˇeme rozdˇlit do dvou skupin ı uz e
  18. 18. ˇˇ 4 KAPITOLA 2. RESERSE 2.1.3.1 Servletov´ kontejnery e Implementuj´ pouze webov´ kontejner a technologie v nˇm dostupn´, viz 2.1. Jeho ı y e e nasazen´ je vhodn´ obecnˇ pro menˇ´ a stˇedn´ aplikace. C´ ı e e sı r ı ılem moj´ pr´ce je uk´zat, ˇe i bez ıa a z tˇˇkoton´ˇn´ kan´nu jm´nem EJB jsme schopni vytvoˇit robustn´ aplikaci pˇesnˇ podle naˇich ez az ıho o e r ı re s pˇedstav. Mezi z´stupce t´to kategorie patˇ´ r a e rı • Apache Tomcat - opensource projekt vydan´ pod Apache licenc´ nejbˇˇnˇjˇ´ a nejdo- y ı, ez e sı stupnˇjˇ´ v˚bec. e sı u • Jetty - opensource, webov´ server pro statick´ a dynamick´ obsah, optimalizace pro y y y v´kon. y 2.1.3.2 Java EE aplikaˇn´ servery cı Narozd´ od pˇedchoz´ kategorie, Java EE AS implementuj´ plnou specifikaci z Java EE ıl r ı ı stacku. • GlassFish (Sun Java AS) - opensource ˇeˇen´ od Sun Microsystems, referenˇn´ implemen- rs ı cı tace • JBoss AS - opensource • IBM Websphere AS - komerˇn´ vlastn´ implementace JVM c ı, ı • BEA WebLogic AS - komerˇn´ cı 2.1.4 V´bˇr technologi´ ye ı Pˇi v´bˇru aplikaˇn´ serveru mus´ r ye c ıho ıme zv´ˇit, co dan´ projekt opravdu potˇebuje, az y r jak´ pouˇ´ ame aplikaˇn´ framework, jak´ ORM n´stroj nebo jak´ dalˇ´ API jsou nezbytn´, y zıv´ cı y a e sı e popˇ´ e jak´ pouˇ´ ame IDE. V z´sadˇ bychom mˇli zvolit jednoho dodavatele ˇeˇen´ a ne- rıpadˇ e zıv´ ae e rs ı kombinovat dodavatele JVM, AS, frameworku a dalˇ´ API a knihoven nebo zvolit takovou sıch kombinaci, kter´ je odzkouˇen´ a bezprobl´mov´; napˇ´ a sa e a rıklad Sun JVM, Glassfish AS, JSF, EJB, Toplink Essentials a NetBeans IDE, vˇe pˇknˇ standardn´ nebo v naˇem pˇ´ e Sun JVM, s ee ı s rıpadˇ Apache Tomcat, Spring framework, Spring Web MVC a WebFlow, Hibernate a Eclipse IDE. 2.2 Spring framework 2.2.1 Aplikaˇn´ framework cı Aplikace se dnes netvoˇ´ cel´ od z´klad˚, sp´se se podobaj´ stavebnic´ Proˇ bychom rı e a u ıˇ ı ım. c mˇli znovu objevovat kolo, kdyˇ uˇ ho nˇkdo pˇed n´mi vymyslel a funguje dobˇe. Framework e zz e r a r je softwarov´ syst´m, kter´ n´m pom´h´ ˇeˇit nejˇastˇjˇ´ probl´my pˇi implementaci, mˇl y e ya aars c e sı e r e by zrychlovat a usnadˇovat vlastn´ v´voj, ˇ´ n ıy rıdit ˇivotn´ cyklus aplikace a pom´hat oddˇlit z ı a e n´ urovˇov´ k´d od vlastn´ aplikaˇn´ logiky dan´ho zad´n´ ızko´ n y o ı cı e a ı. 2.2.2 Historie Odlehˇen´ J2EE framework Spring vznikl p˚vodnˇ jako demo aplikace knihy Roda cy u e Johnsonna: Expert One-to-One: J2EE design and development z roku 2002, kter´ uk´zala v a a dobˇ EJB 2.0, ˇe lze v J2EE programovat tak´ jednoduˇe. Pozdˇji, roku 2003 byl zaloˇen e z e s e z opensource projekt na port´lu sourceforge.net, kter´ vych´zel z p˚vodn´ k´du a postupnˇ se a y a u ıho o e stal mezi v´voj´ˇi velmi popul´rn´ Dnes je Spring ve stabiln´ verzi 2.0, ˇas uk´zal, ˇe koncept, y ar a ı. ı c a z
  19. 19. ˇˇ KAPITOLA 2. RESERSE 5 kter´ Rod Johnsonn navrhl je spr´vn´. St´vaj´ ı Java EE 5 se velmi Springem inspirovala a y ay a ıc´ budouc´ specifikace Java EE 6 se pl´nuje Springu pˇibl´zit jeˇtˇ v´ ı a r ıˇ s e ıce. 2.2.3 Hlavn´ pˇednosti ır • Snazˇ´ a pˇ´ sı rıjemnˇjˇ´ pr´ce s J2EE, e sı a • neinvazivnost, nenut´ pouˇ´ ı zıvat nic, co pr´vˇ nepotˇebujeme, ae r • objektovˇ orientovan´ n´vrh je d˚leˇitˇjˇ´ neˇ jak´koliv implementaˇn´ technologie, e ya u z e sı z a cı • JavaBeans jako siln´ konfiguraˇn´ n´stroj, y cı a • testov´n´ je z´sadn´ Spring dˇl´ k´d snadnˇji testovateln´, aı a ı, ea o e y • modularita, umoˇnuje zvolit jen ty komponenty, kter´ potˇebujeme, zˇ e r • usnadˇuje pr´ci s dalˇ´ frameworky, pouˇit´ jako sjednocuj´ ı pˇ´ n a sımi zı ıc´ rıstup rozliˇn´ch tech- cy nologi´ a implementac´ ı ı, • usnadˇuje pr´ci s vyj´ n a ımkami, kdy je zaobaluje do l´pe ˇiteln´ch. ec y Obr´zek 2.2: Spring framework, zdroj: [13] a 2.2.4 Moduly D˚leˇit´m aspektem je, ˇe Spring lze pouˇ´ i na servletov´m kontejneru, dokonce i uzy z zıt e ˇistˇ s Java SE. Modul´rnost je tak´ doc´ ce a e ılena t´ ˇe se skl´d´ z v´ .jar archiv˚, z´kladn´ ım, z aa ıce ua ıch i voliteln´ch, pˇiˇemˇ si vybereme, co z nˇj chceme pouˇ´ y rc z e zıt. • Spring Core - hlavn´ j´dro frameworku, jedin´ povinn´ modul, metodika Inversion of ıa y y Control, rozhran´ BeanFactory ı • Spring DAO - abstrakce a zjednoduˇen´ pr´ce s JDBC sıa
  20. 20. ˇˇ 6 KAPITOLA 2. RESERSE • Spring ORM - integrace s ORM frameworky, vlastn´ implementace perzistentn´ API i ı ıho na JRE 1.4 bez JPA • Spring Web - integrace s webov´mi frameworky jako JSF, Struts2, Velocity, vlastn´ im- y ı plementace webov´ho frameworku Spring Web MVC e • Spring AOP - podpora aspektovˇ orientovan´ho programov´n´ e e aı • Spring J2EE - podpora pro EJB, JMX, JMS, web service 2.2.5 Inversion of Control N´vrhov´ vzor IoC je zaloˇen na tzv. Hollywoodsk´m principu: “Nevolejte mi, j´ za- a y z e a vol´m v´m.”[5]. Aplikace se vzd´v´ odpovˇdnosti za vytv´ˇen´ a nastaven´ instanc´ ve prospˇch a a aa e ar ı ı ı e frameworku, resp. jeho IoC kontejneru. Jedn´ se o stˇˇejn´ vlastnost, proto ji uk´ˇu na pˇ´ a ez ı az rıkladu. Obr´zek 2.3: Princip IoC, zdroj: [13] a Zap´seme tˇ´ SampleContoller dvˇma zp˚soby, jednak klasicky a jednak s vyuˇit´ ıˇ rıdu e u z ım techniky IoC. SampleContollerWithoutIoC.java public class SampleContollerWithoutIoC implements org.springframework.web.servlet.mvc.Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { Connection connection = DatabaseUtils.getConnection(); UserDAO dao = DAOFactory.createUserDAO(quot;hibernatequot;, connection); List users = dao.getUsers(); DatabaseUtils.closeConnection(conn); return new ModelAndView(quot;userListquot;, quot;usersquot;, users); } } SampleContollerWithIoC.java public class SampleContollerWithIoC implements org.springframework.web.servlet.mvc.Controller { private UserDAO dao = null; public void setUserDAO(UserDAO userDAO) { this.dao = userDAO; } public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { List users = dao.getUsers();
  21. 21. ˇˇ KAPITOLA 2. RESERSE 7 return new ModelAndView(quot;userListquot;, quot;usersquot;, users); } } action-servlet.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <beans> <bean id=quot;sampleControllerquot; class=quot;SampleContollerWithIoCquot;> <property name=quot;userDAOquot; ref=quot;userDAOquot;/> </bean> </beans> Ve tˇ´ e SampleContollerWithoutIoC jsme ruˇnˇ nastavovali komponentu dao. Ve tˇ´ e rıdˇ ce rıdˇ SampleContollerWithIoC jsme ji dostali jiˇ nakonfigurovanou. Pˇedstavme si pˇ´ z r rıklad v kon- textu re´ln´ho ˇivota, komponentu dao vyuˇ´ ı des´ ae z zıvaj´ ıtky tˇ´ Co by se stalo, kdybychom byli rıd. nuceni zmˇnit rozhran´ tov´rn´ metody createUserDAO? Museli bychom zmˇnit i implementaci e ı aı e v des´ ach tˇ´ kter´ dao pouˇ´ ı, coˇ odporuje prvn´ z´sadˇ OOP: “Pˇid´vej vlastnost jen ıtk´ rıd, e zıvaj´ z ıa e ra na jednom m´ e!”.1 ıstˇ ´c Uˇel souboru action-servlet.xml a vlastn´ konfigurace bean, jak vid´ ı ıme v pˇ´ rıkladu, ˇeˇ´ v kapitole 2.2.6. r sım 2.2.5.1 Dependecy lookup N´vrhov´ vzor IoC m˚ˇeme rozdˇlit do dvou technik, prvn´ z nich je dependecy lookup. a y uz e ı Je to n´vrhov´ vzor, pomoc´ nˇhoˇ objekt ˇ´d´ kontejner o beanu. Toto ˇeˇen´ bylo pouˇito a y ıez za a rs ı z v EJB 2.X v technologii JNDI, kdy poˇadovan´ beana musela implementovat API specifick´ z a e pro dan´ kontejner. Evoluce uk´zala, ˇe toto nen´ nejvhodnˇjˇ´ ˇeˇen´ Spring jej pouˇ´ a pro y a z ı e sı r s ı. zıv´ z´ an´ beany “z ruky”. ısk´ ı XmlBeanFactory beanFactory = new XmlBeanFactory(quot;action-servlet.xmlquot;); DemandService demandService = (DemandService) beanFactory.getBean(quot;demandServicequot;); 2.2.5.2 Dependecy injection Druhou technikou IoC je n´vrhov´ vzor dependecy injection, kter´ ˇeˇ´ samotn´ na- a y y r sı e staven´ a nainjektov´n´ potˇebn´ch objekt˚ a jejich z´vislost´ Vlastn´ vloˇen´ z´vislost´ m˚ˇe ı aı r y u a ı. ı zıa ı uz prob´ıhat pomoc´ı Setter injection - Nainjektov´n´ z´vislost´ pomoc´ JavaBeans setter˚. Pˇ´ aı a ı ı u rıklad je uveden v kapitole 2.2.5. Constructor injection - Nainjektov´n´ z´vislost´ pomoc´ konstruktoru. aı a ı ı public class SampleContollerWithIoC implements Controller { private UserDAO dao = null; public SampleContollerWithIoC(UserDAO userDAO) { this.dao = userDAO; } public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 1 V takto jednoduch´m pˇ´ e rıkladu to samozˇejmˇ lze obej´ v´voj´ˇ komponenty dao by byl nucen prov´st r e ıt, y ar e zmˇnu s ohledem na kompatibilitu, kaˇdop´dnˇ je to probl´m, do kter´ho se nemus´ e z ae e e ıme dostat.
  22. 22. ˇˇ 8 KAPITOLA 2. RESERSE List users = dao.getUsers(); return new ModelAndView(quot;userListquot;, quot;usersquot;, users); } } action-servlet.xml <bean id=quot;sampleControllerquot; class=quot;SampleContollerWithIoCquot;> <constructor-arg ref=quot;userDAOquot;/> </bean> rıklad.2 Method injection - Pouˇit´ pro speci´ln´ pˇ´ zı a ı rıpady, pro netrivi´lnost zde neuvedu pˇ´ a Mezi dalˇ´ typ dependecy injection, kter´ Spring avˇak nepodporuje, patˇ´ Interface sı y s rı injection, na kter´m je zaloˇen kontejner frameworku Avalon. Nejpouˇ´ ejˇ´ je metoda Setter e z zıvanˇ sı injection, nejˇastˇji z tˇchto d˚vod˚: ce e u u • je jednoduˇˇ´ pracovat s defaultn´ hodnotami properties dan´ho objektu, ssı ımi e • pomoc´ getteru z´ ame okamˇitˇ hodnotu dan´ property, ı ısk´ ze e • settery mohou b´t v pˇ´ e potˇeby vol´ny v´ y rıpadˇ r a ıcekr´t, coˇ konstruktor b´t nem˚ˇe, a z y uz • gettery/settery jsou zdˇdˇny na rozd´ od konstruktor˚ jako klasick´ metody. ee ıl u e 2.2.6 Rozhran´ BeanFactory a ApplicationContext ı 2.2.6.1 BeanFactory BeanFactory je ustˇedn´ ˇ´st´ cel´ho frameworku, ˇ´ ı ˇivotn´ cyklus, konfiguraci a ´r ı ca ı e rıd´ z ı vlastn´ injektaci vˇech bean. Kontejner startuje podle nasazen´ aplikace, napˇ. na aplikaˇn´ ı s ı r c ım serveru pomoc´ definice v deployment deskriptoru web.xml nebo v JUnit testovac´ sadˇ pomoc´ ı ı e ı pˇipraven´ch startovac´ API, m˚ˇeme ho tak´ samozˇejmˇ nainicializovat ruˇnˇ, jak jsme r y ıch uz e r e ce vidˇli v kapitole 2.2.5.1. e Manageovan´ objekt m˚ˇe b´t jak´koliv, v t´to souvislosti se mluv´ o tzv. POJO, coˇ v y uz y y e ı z pˇekladu znamen´ star´ dobr´ java objekt. Je to jak´koliv objekt, kter´ nen´ nucen dodrˇovat r a y y y y ı z implementaˇn´ omezen´ dan´ platformy. Vlastn´ konfigurace vz´jemn´ch vztah˚ bean m˚ˇeme cı ı e ı a y u uz definovat pomoc´ ı: • XML - nejˇastˇjˇ´ a nejpˇehlednˇjˇ´ z´pis, oddˇluje konfiguraci od vlastn´ pouˇit´ c e sı r e sı a e ıho z ı, • anotac´ - podobnˇ jako EJB, je konfigurace zaps´na v POJO, ı e a • JavaBean properties, • Jakarta Commons atributes. Pokud vyuˇ´ ame XML konfigurace, m´me minim´lnˇ jeden koˇenov´ konfiguraˇn´ sou- zıv´ a ae r y cı bor, nazveme jej napˇ. applicationContext.xml, na kter´ ve webov´m nasazen´ ukazuje de- r y e ı poloyment descriptor. web.xml 2 Pokud chceme nainjektovat beany s r˚zn´mi scopy (viz. 2.2.6.2), nevystaˇ´ uy cıme si s setter injection, ˇten´ˇe c ar odkazuji na referenˇn´ dokumentaci Springu [13]. cı
  23. 23. ˇˇ KAPITOLA 2. RESERSE 9 <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <web-app> <!-- Context Configuration locations for Spring XML files --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- Base dispacher’s servlet mapping --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/action-servlet*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> </web-app> Kromˇ koˇenov´ho aplikaˇn´ kontextu3 nadefinujeme servlet, kter´ se vˇdy star´ o je- er e c ıho y z a den typ poˇadavk˚ (v naˇem pˇ´ e o vˇe s pˇ´ z u s rıpadˇ s rıponou .html), kter´ zpracov´v´ DispacherServlet. e aa Podrobnˇji je tomu vˇnov´na kapitola 2.2.7.4. Jelikoˇ budu mluvit o jedn´ jedin´ konfiguraci, e e a z e e budu ApplicationContext.xml a action-servlet.xml vˇdomˇ zamˇnovat. e e eˇ ıme, kam zapsat XML konfigurace, aby se automaticky naˇetly, pod´ ame se ted’ na V´ c ıv´ z´kladn´ syntaxi. Hodnotu do property dan´ beany m˚ˇeme zapsat bud’to rovnou, a ı e uz <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <beans xmlns=quot;http://www.springframework.org/schema/beansquot; xmlns:xsi=quot;http://www.w3.org/2001/XMLSchema-instancequot; xsi:schemaLocation=quot; http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsdquot;> <bean id=quot;beanquot; class=quot;SampleBeanquot;> <property name=quot;propertyquot; value=quot;valuequot;/> </bean> </beans> nebo odkazem na jinou beanu. <bean id=quot;beanquot; class=quot;SampleBeanquot;> <property name=quot;propertyquot; ref=quot;bean2quot;/> </bean> <bean id=quot;bean2quot; class=quot;SampleBean2quot; /> ˇ 2.2.6.2 Zivotnost beany 3 Nic n´m nebr´n´ m´ koˇenov´ch konfiguraˇn´ soubor˚ v´ v tagu <param-value/> m˚ˇe b´t regul´rn´ a a ı ıt r y c ıch u ıce, uz y aı v´raz. y
  24. 24. ˇˇ 10 KAPITOLA 2. RESERSE Kaˇd´ beana m´ z hlediska konverze IoC kontejneru s klientem svoji ˇivotnost (obor za a z viditelnosti), kter´ ˇ´ ame scope. Kromˇ definice z´vislost´ beany, Spring jednoduˇe dovoluje si e rık´ e a ı s zvolit i jej´ scope. Od verze 2.0 m˚ˇeme vytv´ˇet beany 5ti (resp. 6ti) scop˚. ı uz ar u • sigleton - existuje jen jedna instance, kter´ se vytvoˇ´ pˇi prvn´ injekci, u dalˇ´ se a rı r ı sıch injektuje tato, • prototype - pro kaˇdou injektaci se vytvoˇ´ nov´ instance, z rı a • request - beana plat´ po dobu HTTP requestu,4 ı • session - beana plat´ po dobu HTTP session, ı • global session - beana plat´ po dobu HTTP global session, ı • custom - pokud potˇebujeme nestandardn´ ˇeˇen´ Spring dovoluje definovat vlastn´ r ı r s ı, ı. prototype Defaultnˇ se vˇdy pouˇije singleton. Je to logick´, ve vˇtˇinˇ pˇ´ u n´s stav beany ne- e z z e e s e rıpad˚ a zaj´ a a plnˇ si s t´ vystaˇ´ ım´ e ım cıme, pokud ale potˇebujeme vytv´ˇet pokaˇd´ nov´ instance, r ar ze e tj. chceme zohledˇovat stav beany, mus´ n ıme uv´st explicitnˇ parametr scope. e e <bean id=quot;bean3quot; class=quot;SampleBean3quot; scope=quot;prototypequot; /> web scopes Jako pˇ´ rıklad uvedu n´sleduj´ ı beany: a ıc´ <bean id=quot;loginActionquot; class=quot;LoginActionquot; scope=quot;requestquot;/> <bean id=quot;userPreferencesquot; class=quot;UserPreferencesquot; scope=quot;sessionquot;/> <bean id=quot;userPreferencesquot; class=quot;UserPreferencesquot; scope=quot;globalSessionquot;/> Po kaˇd´m HTTP requestu se vytvoˇ´ nov´ instance beany loginAction, zat´ ze rı a ımco intuitivnˇ e beana userPreferences m´ m´ platnost po celou dobu relace. a ıt Ve vˇtˇ´ e pˇ´ u ve webov´ aplikaci si pˇi definici bean vystaˇ´ e sınˇ rıpad˚ e r cıme pouze s prvn´ımi dvˇma standardn´ scopy. Pokud potˇebujeme nainjektovat beanu s webov´m (nebo e ımi r y custom) scopem do beany se standardn´ scopem, mus´ k tomu poˇ´ chytr´ho objektu ım ıme zıt e - proxy, kter´ nainjektovanou beanu zastupuje. Pˇi vol´n´ metody beany proxy z´ a y r aı ısk´ objekt ze scopu a deleguje jej´ vol´n´ ı a ı. <bean id=quot;userPreferencesquot; class=quot;com.foo.UserPreferencesquot; scope=quot;sessionquot;> <aop:scoped-proxy/> </bean> <bean id=quot;userServicequot; class=quot;com.foo.SimpleUserServicequot;> <property name=quot;userPreferencesquot; ref=quot;userPreferencesquot;/> </bean> K webov´m scop˚m vˇak nejˇastˇji pˇistupujeme jako ke kontejner˚m, do kter´ch y u s ce r u y ukl´d´me objekty (a z nich vyb´ ame) programovˇ. Tuto praktiku ukazuji spolu s SWF aa ır´ e scopy v kapitol´ch 2.2.7.5, 2.2.8.5. a 4 Tyto 3 tzv. webov´ scopy maj´ smysl pouze ve webov´ aplikaci s pouˇit´ webov´ implementace e ı e z ım e ApplicationContextu - s XmlWebApplicationContext.
  25. 25. ˇˇ KAPITOLA 2. RESERSE 11 2.2.6.3 Typov´ konverze e Typov´ konverze je zp˚sob pˇevodu hodnot zapsan´ch v XML deskriptoru na re´ln´ a u r y ae objekty. Chtˇli bychom napˇ´ e rıklad zapsat nˇco jako e <bean id=quot;beanquot; class=quot;SampleBeanquot;> <property name=quot;measurequot; value=quot;90/60/90quot;/> </bean> public Class SampleBean { private Measure measure; public Measure getMeasure() { return measure;} public void setMeasure(Measure measure) {this.measure=measure;} } Spring n´m nab´ ı moˇnost implementace Property editoru, na kter´ se kontejner obr´t´ a ız´ z y aı v pˇ´ e, ˇe v setteru naraz´ na dan´ typ, kter´ neum´ automaticky dosadit. rıpadˇ z ı y y ı public class MeasurePropertyEditor extends java.beans.PropertyEditorSupport { @Override public void setAsText(String measure) throws IllegalArgumentException { try { //set data from String to value setValue(value); } catch (NumberFormatException e) { throw new IllegalArgumentException(); } } } Implementaci metody setAsText nech´v´m na ˇten´ˇi. Kromˇ n´ existuje inverzn´ metoda aa c ar eı ı getAsText(). Property editor zaregistrujeme napˇ´ rıklad do beany customEditorConfigurer, kte- rou um´ ıme na viditeln´ m´ ıst´ e ısto z ApplicationContextu. <bean id=quot;customEditorConfigurerquot; class=quot;org.springframework.beans.factory.config.CustomEditorConfigurerquot;> <property name=quot;customEditorsquot;> <map> <entry key=quot;Measurequot;> <bean class=quot;MeasurePropertyEditorquot; /> </entry> </map> </property> </bean> 2.2.6.4 Autowiring Ohlednˇ Spring IoC kontejneru stoj´ za to zm´ e ı ınit jeˇtˇ jednu zaj´ se ımavou vlastnost - autowiring. <bean id=quot;beanquot; class=quot;SampleBeanquot; autowire=quot;byNamequot; /> T´ ˇekneme Sprigu, aby se pokusil automaticky vyˇeˇit z´vislosti injektovan´ch bean ım r rs a y s´m, bez nutnosti je explicitnˇ uv´dˇt. Hodnota v parametru autowire m˚ˇe nab´vat nejˇastˇji a e ae uz y ce n´sleduj´ ıch hodnot: a ıc´ • no - ˇ´dn´ autowiring, za y
  26. 26. ˇˇ 12 KAPITOLA 2. RESERSE • byName - Spring hled´ ve sv´m ApplicationContextu beanu, podle jm´na JavaBean pro- a e e perty, • byType - Spring hled´ beanu podle typu JavaBean property, funguje pouze pokud se v a beanˇ nevyskytuje v´ properties stejn´ho druhu. e ıce e 2.2.6.5 ApplicationContext Rozhran´ ApplicationContext obaluje BeanFactory a rozˇiˇuje jej´ funkcionalitu o inter- ı sr ı nacionalizaci, publikov´n´ ud´lost´ nebo nahr´v´n´ zdroj˚. Uk´ˇi na pˇ´ aı a ı aaı u az rıkladu internacionalizaci, resp. pouˇit´ souboru .properties, kde uv´d´ zı a ıme k dan´mu kl´ci jeho hodnotu. e ıˇ Sample.properties bean.value = someOtherValue Kdekoliv v naˇ´ XML konfiguraci tyto promˇnn´ m˚ˇeme pomoc´ Expression Language5 sı e e uz ı pouˇ´ napˇ´ zıt, rıklad takto. <bean id=quot;beanquot; class=quot;SampleBeanquot;> <property name=quot;propertyquot; value=quot;${bean.value}quot;/> </bean> Vˇe bude fungovat, pokud dopln´ s ıme ApplicationContext o beanu <bean id=quot;propertyConfigurerquot; class=quot;org.springframework.beans.factory.config. PropertyPlaceholderConfigurerquot;> <property name=quot;locationsquot;> <list> <value>classpath:Sample.properties</value> </list> </property> </bean> 2.2.7 Spring Web MVC V t´to kapitole pˇedstav´ webov´ frameworky, vysvˇtl´ cestu, jak jsme se k nim e r ım e e ım dostali a uk´ˇu Springovskou implementaci webov´ho frameworku Spring Web MVC. Jako az e vˇechny modern´ webov´ frameworky je Spring MVC, jak uˇ jeho n´zev napov´ a, zaloˇen na s ı e z a ıd´ z n´vrhov´m vzoru Model View Controller. a e 2.2.7.1 N´vrhov´ vzor MVC a y Z historick´ho pohledu se pˇed n´stupem JSP pouˇ´ e r a zıvaly pouze servlety, s nimiˇ se z v´sledn´ HTML v´stup generoval obt´znˇ. Z dneˇn´ pohledu je tento zp˚sob vhodn´ jen pro y y y ıˇ e s ıho u y nejjednoduˇˇ´ pˇ´ ssı rıpady. Pˇi pˇ´ r rıchodu specifikace JSP 1.0 byla zvolena architektura tzv. Model 1, kdy je HTTP poˇadavek delegov´n pˇ´ z a rımo na pˇ´ snou JSP str´nku, v n´z je um´ en veˇker´ k´d pomoc´ rısluˇ a ıˇ ıstˇ s yo ı 6 Tento pˇıstup se dnes oznaˇuje term´ skriptlet˚. u r´ c ınem “ˇpagetov´ k´d”, postr´d´me tu jak´koliv s yo aa e 5 EL se prim´rnˇ pouˇ´ a pro vyhodnocov´n´ v´raz˚ na JSP str´nk´ch, pro pˇ´ ae zıv´ aı y u aa rıstup k hodnot´m z Command a Objekt˚ a podobnˇ. u e 6 Skriptlet je speci´ln´ tag, v nˇmˇ je um´ en pˇ´ aı ez ıstˇ rımo Java k´d <% /*java code here*/ %>. o
  27. 27. ˇˇ KAPITOLA 2. RESERSE 13 Obr´zek 2.4: N´vrhov´ vzor MVC, zdroj: [15] a a y rozdˇlen´ do vrstev, centralizovan´ pˇ´ eı y rıstup HTTP poˇadavk˚ a potenci´ln´ moˇnost rozˇ´ren´ z u aı z sıˇ ı aplikace. Specifikace JSP 1.1, kromˇ pˇ´ e rıstupu psan´ logiky aplikace pomoc´ tag˚, pˇinesla imple- ı ı ur mentaci n´vrhov´ho vzoru MVC (obr´zek 2.4), kterou oznaˇujeme jako Model 2. a e a c Obr´zek 2.5: MVC implementace JSP Model 2, zdroj: [1] a MVC slouˇ´ k oddˇlen´ aplikaˇn´ prezentaˇn´ logiky a datov´ho modelu. Nen´ pouˇit zı eı c ı, cı e ı z jen ve webov´ch frameworc´ y ıch, ale napˇ´rıklad v desktopov´ch aplikac´ u knihoven Swing a y ıch SWT. Jeho koˇeny m˚ˇeme naj´ ve Smalltalku, kdy byl p˚vodnˇ pouˇit pro zakomponov´n´ r uz ıt u e z aı klasick´ho postupu vstup-zpracov´n´ ystup do GUI program˚. e a ı-v´ u • Controller - prostˇedn´ mezi vrstvami Model a View r ık • Model - pˇedstavuje vlastn´ data zobrazovan´ ve View r ı a • View - transformuje Model do prezentaˇn´ podoby cı Jelikoˇ HTTP protokol je typu request/response, tedy bezestavov´, nem˚ˇeme zde apli- z y uz kovat typick´ MVC pattern. Model 2 je upraven´ MVC sch´ma, kdy jedin´ rozd´ spoˇ´ a v y e e y ıl cıv´ tom, ˇe View nem˚ˇe volat Controller. z uz Vz´jemnou interakci si m˚ˇeme pˇedstavit tak, ˇe klient poˇle poˇadavek na webov´ a uz r z s z y server, ten je vz´pˇt´ delegov´n na servlet, kter´ pˇedstavuje controller, servlet zavol´ aplikaˇn´ a eı a yr a cı
  28. 28. ˇˇ 14 KAPITOLA 2. RESERSE logiku, ze kter´ z´ a model, ten zaregistruje do scopu viditeln´ho z JSP, kter´ pˇedstavuje view. e ısk´ e er N´slednˇ provede pˇesmˇrov´n´ na View a posl´ze na JSP, kter´ si vyzvedne data ze scopu a a e r e aı e e ten v´sledek zobraz´ y ı.[15] V prostˇed´ webu existuje nˇkolik implementac´ kter´ odpov´ ı n´vrhov´m vzor˚m: rı e ı, e ıdaj´ a y u • Front Controller (Service to worker) - frameworky Struts, Spring Web MVC, WebWork, Ruby on Rails • Dispacher view (View helper) - frameworky JSF-based (JSF, Seam, Shale), Tapestry, Wicket, Echo2 Rozd´ mezi pˇ´ ıl rıstupy je v okamˇiku vol´n´ aplikaˇn´ logiky. V pˇ´ e Front Controller u z aı cı rıpadˇ se aplikaˇn´ logika vol´ pˇed pˇed´n´ zpracov´n´ do View, zat´ cı ar r a ım aı ımco u Dispacher View se vol´ a aplikaˇn´ logika uvnitˇ View pomoc´ View Helper u[3]. cı r ı 2.2.7.2 Rozdˇlen´ webov´ch framework˚ eı y u ˇ ım e sı ´ Nejd˚leˇitˇjˇ´ roli hraje uroveˇ abstrakce nad protokolem HTTP. C´ vˇtˇ´ je uroveˇ abstrakce, u z e sı ´ n n t´ m´nˇ se mus´ jednotliv´ vrstvy starat o samotn´ protokol. Takto dˇl´ webov´ frameworky ım e e ı e y e ıme e do dvou skupin • Poˇadavkovˇ orientovan´ (Request based) - zaloˇen´ na Front Controlleru, z e e ze • Komponentovˇ orientovan´ (UI component based, event-based) - zaloˇen´ na View Hel- e e ze peru. Budoucnost patˇ´ komponentovˇ orientovan´m webov´m framework˚m. Ty umoˇnuj´ rı e y y u zˇ ı v´voj´ˇi pracovat na urovni UI komponent a ud´lost´ tedy stejnˇ jednoduˇe jako s dalˇ´ y ar ´ a ı, e s sımi napˇ. s desktopov´mi frameworky (Swing, SWT). Snadno napˇ´ r y rıklad vytvoˇ´ rıme RAD n´stroj a pro WYSIWYG editaci webov´ aplikace. e 2.2.7.3 Architektura Obr´zek 2.6: Architektura aplikace ve Spring MVC, zdroj: [20] a Architektura aplikace ve Spring Web MVC je rozdˇlena do navz´jem nez´visl´ch vrstev, e a ay jak vid´ ıme na obr´zku 2.6. a User Interface - prezentaˇn´ vrstva, star´ se o generov´n´ v´stupu k uˇivateli (nejˇastˇji cı a aı y z ce XHTML), vˇtˇinou pouˇito JSP, ke kter´mu existuj´ implementace rozhran´ View es z e ı ı
  29. 29. ˇˇ KAPITOLA 2. RESERSE 15 org.springframework.web.servlet.view.JstlView. Jako pˇ´ rıklad si uvedeme jednodu- chou JSP str´nku.7 a SampleJSP.jsp <?xml version=quot;1.0quot; encoding=quot;UTF-8quot; ?> <html><body> <c:choose> <c:when test=quot;${1 + 1 == 10}quot;> we count in binary base </c:when> <c:otherwise> we don’t count in binary base </c:otherwise> <c:choose> </body></html> Web - webov´ vrstva ˇeˇ´ pˇechody mezi str´nkami a odstiˇuje servisn´ vrstvu od vlastn´ a r sı r a n ı ı implementace. Hlavn´ rozhran´ v t´to vrstvˇ je Controller. ı ı e e • AbstractController - z´kladn´ abstraktn´ kontrol´r a ı ı e • BaseCommandController,AbstractCommandController - pracuje s Command Ob- jectem, tj. objekt, do kter´ho namapujeme vstupn´ hodnoty z hodnot z´ e ı ıskan´ch y HTTP requestu, ten pak pouˇ´ ame ve View vrstvˇ zıv´ e • SimpleFormController,AbstractSearchController - umoˇnuje napˇ´ zˇ rıklad pˇechody r mezi jednotliv´mi obrazovkami pomoc´ reakce na v´sledek metody y ı y • MultiActionController - umoˇnuje reagovat na v´ typ˚ HTTP request˚, de- zˇ ıce u u faultnˇ se metoda obsluhuj´ ı danou namapovanou str´nku jmenuje stejnˇ jak tato e ıc´ a e str´nka a • UrlFilenameViewController - pomoc´ namapovan´ str´nky zobraz´ JSP se stejn´m ı ea ı y jm´nem e Pˇ´ rıklad na takov´ jednoduch´ kontrol´r je uveden hned v kapitole 2.2.5. y y e Service - V t´to vrstvˇ se nach´z´ implementace dan´ch byznys requirement˚, jako jedin´ m´ e e aı y u aa pˇ´ rıstup k perzistentn´ vrstvˇ. Jelikoˇ je tato vrstva obvykle v kaˇd´ aplikaci jin´, Spring ı e z ze a k n´ nenab´ ı ˇ´dn´ rozhran´ Jako pˇ´ ı ız´ za e ı. rıklad uk´ˇu rozhran´ IUserService az ı public interface IUserService { public boolean isLoginFree(String login); public AbstractUser getUser(String login); public boolean saveUser(AbstractUser user); } Persistence - Perzistentn´ vrstva implementuje ukl´d´n´ ı a a ı,nahr´v´n´ a pr´ci s objekty datov´ho aaı a e modelu z datab´ze. Nejˇastˇji implementuje metody CRUD (create,retrieve,update,delete). a ce Spring ve sv´m ORM modulu dovoluje pouˇ´ deklarativn´ transakce imlementovan´ po- e zıt ı e moc´ AOP nebo zaobaluje m´nˇ ˇiteln´ vyj´ ı e ec e ımky do ˇitelnˇjˇ´ Spolupr´ce s Hibernate c e sıch. a frameworkem je hlavnˇ doc´ e ılena pomoc´ tˇ´ ı rıd • HibernateTemplate 7 Uveden´ tagy zaˇ´ ıc´ XML namespacem c nebo ftm jsou souˇast´ knihovny JSTL, kde jsou definov´ny e cınaj´ ı c´ ı a z´kladn´ tagy pro vˇtven´ k´du, zobrazov´n´ iterace, definov´n´ a pouˇ´ an´ promˇnn´ch nebo pro form´tov´n´ a ı e ıo a ı, aı zıv´ ı ey a aı textu.
  30. 30. ˇˇ 16 KAPITOLA 2. RESERSE • HibernateDaoSupport Jako pˇ´ rıklad zde uvedu rozhran´ IOfferDao. Uk´zku deklarativn´ transakc´ spolu s im- ı a ıch ı plementaci rozhran´ IOfferDao si uk´ˇeme v kapitole 2.3.8.1. ı az public interface IOfferDao { void saveOrUpdate(Offer offer); Offer getOfferById(long id); Offer getOfferBy(Inzerent inzerent); void delete(Offer offer); List<Offer> getTopItems(int maxResult); } Domain model - datov´ model, soubor tzv. Bussiness Object˚, kter´ abstrahuj´ entity z y u e ı dom´nov´ho modelu do programu, kter´ s nimi pracuje, nakonfigurovan´ch pro O/R e e y y mapov´n´ dan´m perzistentn´ n´strojem. Uk´ˇeme si jednoduch´ pˇ´ aı y ım a az y rıklad se z´pisem a pomoc´ JPA anotac´ ı ı. Inzerent.java @Entity public class Inzerent extends AbstractUser { private String firstName = quot;quot;; private String lastName = quot;quot;; private String telephone = quot;quot;; //appropriate getters and setters } Podrobnˇji se t´to problematice vˇnuji v kapitole 2.3. e e e 2.2.7.4 Dispacher servlet DispacherServlet je Front Controller, jak jsem uk´zal v kapitole 2.2.7.1. Nyn´ si uk´ˇeme a ı az jednoduch´ pˇ´ y rıklad, kde d´me vˇe probran´ v t´to kapitole do kontextu. V deployment deskrip- a s ee toru jsme nadefinovali pro vˇechny pˇ´ s rıstupy na *.html obsluhu servletu action, jemuˇ odpov´ a z ıd´ konfigurace action-servlet.xml8 , jak je uvedeno v kapitole 2.2.6. V action-servlet.xml nadefinu- jeme: <bean id=quot;urlMappingquot; class=quot;org.springframework.web.servlet.handler.SimpleUrlHandlerMappingquot;> <property name=quot;alwaysUseFullPathquot; value=quot;truequot; /> <property name=quot;mappingsquot;> <props> <prop key=quot;/sample-web-page.htmlquot;>sampleController2</prop> </props> </property> </bean> <bean id=quot;sampleController2quot; class=quot;SampleController2quot;> <property name=quot;viewquot; value=quot;sampleJSPquot; /> </bean> 8 Podle jm´na servletu “action” se pˇid´ automaticky “-servlet”. e ra
  31. 31. ˇˇ KAPITOLA 2. RESERSE 17 Tedy kaˇd´ poˇadavek o sample-web-page.html bude zpracov´vat beana sampleCont- zy z a roller2, ta m´ “nasetov´nu” JSP str´nku9 , kter´ se ve v´sledku zobraz´ Implementace tˇ´ a a a a y ı. rıdy SampleController2 bude velmi podobn´ pˇ´ a rıkladu SampleContollerWithIoC u kapitoly 2.2.5. public class SampleContoller2 implements org.springframework.web.servlet.mvc.Controller { private String view; public void setView(String view) { this.view = view; } public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { return new ModelAndView(view); } } Pokud potˇebujeme jen jednoduˇe podle poˇadavku na sample-web-page.html zobrazit r s z jen JSP str´nku a nic jin´ho, tak k tomu pouˇijeme kontrol´r UrlFilenameViewController, a e z e kter´ hled´ View a posl´ze JSP se stejn´m jm´nem jako je html poˇadavek. V pˇ´ y a e y e z rıkladu by staˇilo zmˇnit odpov´ ıc´ kontrol´r. c e ıdaj´ ı e <bean id=quot;urlFilenameViewControllerquot; class=quot;org.springframework.web.servlet.mvc.UrlFilenameViewControllerquot; /> 2.2.7.5 Webov´ scopy e Jak jsem zm´ v kapitole 2.2.6.2, ˇastˇji k webov´m scop˚m pˇistupujeme jako ke ınil ce y u r kontejner˚m pro data, jeˇ maj´ b´t viditeln´ v r´mci n´mi definovan´ho scopu. u z ıy a a a e • Request - platnost jen v pr˚bˇhu jednoho HTTP poˇadavku, v requestu pˇich´z´ para- ue z r aı metry z HTTP GETu, • Session - platnost v pr˚bˇhu HTTP session, ue • Global session - platnost v pr˚bˇhu HTTP global session, ue Z´kladn´ moˇnosti pr´ce uv´d´ v n´sleduj´ ım pˇ´ a ı z a a ım a ıc´ rıkladu, napˇ´ rıklad s pomoc´ tˇ´ ı rıdy org.springframework.web.context.request.DispatcherServletWebRequest. HttpServletRequest request; //gets as method parameter HttpSession session = request.getSession(); DispatcherServletWebRequest webRequest = new DispatcherServletWebRequest(request); Integer id = (Integer) request.getParameter(quot;idquot;); id = (Integer) webRequest.getAttribute(quot;idquot;, RequestAttributes.SCOPE_REQUEST); session.setAttribute(quot;stringquot;, id.toString()); webRequest.setAttribute(quot;stringquot;, id.toString(), RequestAttributes.SCOPE_SESSION); webRequest.setAttribute(quot;stringquot;, id.toString(), RequestAttributes.SCOPE_GLOBAL_SESSION); 9 V tomto jednoduch´m kontextu si m˚ˇeme pˇedstavit napˇ´ e uz r rıklad tu, jeˇ jsem uk´zal v kapitole 2.2.7.3. z a
  32. 32. ˇˇ 18 KAPITOLA 2. RESERSE 2.2.8 Spring Web Flow Spring Web Flow je mocn´ n´stroj pro definici toku obrazovek ve webov´ aplikaci. ya e Snadno ˇeˇ´ probl´my, kter´ konvenˇn´ pˇ´ r sı e e c ı rıstup ˇeˇ´ velmi neefektivnˇ. Hlavn´ idea spoˇ´ a v r sı e ı cıv´ kl´cov´ abstrakci konverzace mezi uˇivatelem a serverem - ve flow. Flow je nˇco v´ neˇ jed- ıˇ e z e ıce z notliv´ poˇadavek, nˇco m´nˇ neˇ cel´ session. Jedin´ flow ˇ´ ı celou konverzaci, kdyˇ se od yz e ee z a e rıd´ z uˇivatele oˇek´v´ nˇjak´ vstup, flow je pozastaveno a ˇek´ na uˇivatel˚v vstup. Klient ovl´d´ z c aa e y ca z u aa konverzaci pomoc´ ud´lost´ podle kter´ch se flow rozhoduje, co udˇlat d´l. ıa ı, y e a 2.2.8.1 Struktura Definice flow nen´ nic jin´ho neˇ koneˇn´ automat s poˇ´teˇn´ stavem, mnoˇinou ı e z cy ca c ım z stav˚, ve kter´ch se m˚ˇe nach´zet, mnoˇinou koneˇn´ch stav˚ a vlastn´ pˇechody do dalˇ´ u y uz a z cy u ımi r sıch ’to do XML souboru nebo do java k´du (pouˇit´ pˇi stav˚. Takov´to z´pis prov´d´ u y a a ıme bud o zı r speci´ln´ pˇ´ a ıch rıpadech a napojen´ na dalˇ´ syst´my). Pro zaˇ´tek zde uvedu uvodn´ z´pis, ıch sı e ca ´ ıa ve kter´m flow konfigurujeme. e sample-flow.xml <?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?> <flow xmlns=quot;http://www.springframework.org/schema/webflowquot; xmlns:xsi=quot;http://www.w3.org/2001/XMLSchema-instancequot; xsi:schemaLocation=quot;http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-1.0.xsdquot;> </flow> 2.2.8.2 Stavy Start State - Poˇ´teˇn´ stav, jako u kaˇd´ho automatu je pr´vˇ jeden. Parametr idref odkazuje ca c ı ze ae na jin´ stav. y <start-state idref=quot;actionStatequot; /> End State - Koncov´ stav, pokud je ve flow na nejvyˇˇ´ urovni, ukonˇ´ se jeho prov´dˇn´ y ssı ´ cı a e ı, zresetuj´ se vˇechny promˇnn´. ı s ee <end-state id=quot;endStatequot; /> View State - Stav, ve kter´m doch´z´ k vykreslen´ zadan´ho obsahu. e aı ı e <view-state id=quot;viewStatequot;> <transition to=quot;actionStatequot; /> </view-state> Action State - Stav, ve kter´m doch´z´ k nˇjak´ akci, tj. zavol´n´ metody dan´ beany a e aı ee aı e obvykle podle n´vratu n´sleduje pˇechod do jin´ho stavu. a a r e <action-state id=quot;actionStatequot; > <action bean=quot;actionBeanquot; method=quot;sampleActionquot; /> <transition to=quot;decisionStatequot; /> </action-state> Decision State - Stav, urˇen´ k vˇtven´ logiky, testuje podm´ cy e ı ınku, podle kter´ pˇejde do er dalˇ´ stavu. sıho
  33. 33. ˇˇ KAPITOLA 2. RESERSE 19 <decision-state id=quot;decisionStatequot; > <if test=quot;requestParameters.id gt 0quot; then=quot;viewStatequot; else=quot;subflowStatequot;/> </decision-state> SubFlow State - Do flow m˚ˇeme vnoˇit jin´ flow jako subflow a pomoc´ koncov´ho stavu uz r e ı e dan´ho subflow reagovat a pˇej´ dle logiky aplikace. Vhodn´ pokud se urˇit´ sekvence e r ıt e ce stav˚ a pˇechod˚ opakuj´ ve v´ flow. u r u ı ıce <subflow-state id=quot;subflowStatequot; flow=quot;inner-flowquot;> <transition on=quot;okquot; to=quot;viewStatequot; /> <transition on=quot;cancelquot; to=quot;endStatequot;/> </subflow-state> 2.2.8.3 V´hody y Za hlavn´ v´hody SWF m˚ˇeme bezpochyby oznaˇit: ıy uz c • oddˇlen´ navigace od vlastn´ k´du, eı ıho o • automatick´ ˇ´ ı stavu aplikace, e rızen´ • vyˇˇ´ uroveˇ abstrakce, ssı ´ n • dovoluje volat metody stˇedn´ vrstvy bez nutnosti pouˇit´ kontrol´ru. r ı zı e 2.2.8.4 Nev´hody y Spring Web Flow nem˚ˇeme pouˇ´ tam, kde kv˚li velk´ pr´ci, neˇ se zprovozn´ jen uz zıt u ea z ı jedna jedin´ obrazovka, se n´m jej nevyplat´ nasadit. Avˇak po urˇit´ velikosti a sloˇitosti a a ı s ce z pˇechod˚ mezi str´nkami v aplikaci tato nev´hoda pad´. r u a y a 2.2.8.5 Scope Stejnˇ jako webov´ scopy ve Spring Web MVC, existuj´ ve SWF podobn´ kontejnery pro e e ı e uloˇen´ jak´chkoliv kr´tkodob´ch dat. Pˇistupuje se k nim pˇes rozhran´ Map pomoc´ instance zı y a y r r ı ı tˇ´ RequestContext. rıdy SampleFormAction.java public org.springframework.webflow.Event sampleAction(org.springframework.web.servlet.support. RequestContext context) { Object object = context.getXXXScope().get(quot;keyquot;); context.getXXXScope().put(quot;keyquot;,object); context.getExternalContext().getRequestMap().put(quot;keyquot;,object); Object object = context.getExternalContext().getSessionMap().get(quot;keyquot;); context.getExternalContext().getGlobalSessionMap().put(quot;keyquot;,object); context.getExternalContext().getApplicationMap().put(quot;keyquot;,object); return success(); } kde za XXX dosad´ jeden za 4 scop˚ pouˇiteln´ch ve SWF: ıme u z y • request - maj´ platnost pouze pro dan´ poˇadavek, ı yz
  34. 34. ˇˇ 20 KAPITOLA 2. RESERSE • flash - plat´ dokud uˇivatel neopust´ aktu´ln´ stav, ı z ı aı • flow - plat´ pro cel´ flow, ı e • conversation - plat´ po dobu ˇivotnosti mateˇsk´ho flow. ı z re Na pˇ´ rıkladu vid´ ıme, ˇe pomoc´ tˇ´ RequestContext m´me pˇ´ z ı rıdy a rıstup i ke klasick´m y webov´m scop˚m pˇedstaven´m v kapitole 2.2.7.5, s t´ rozd´ y u r y ım ılem, ˇe k nim pˇistupujeme jako z r k mapˇ. Posledn´ dosud nepˇedstaven´ je application scope, kter´ plat´ v pr˚bˇhu chodu cel´ e ı r y y ı ue e aplikace. Nutno poznamenat, ˇe data v jak´mkoliv scopu, kromˇ singletonu, nejsou viditeln´ z e e a vˇemi uˇivateli dohromady. s z 2.2.8.6 Syntax <transition/> - Definujeme pˇechod do jin´ho stavu, parametry on, to, on-exception. Pa- r e rametr to je povinn´. Pokud prov´d´ y a ıme ve stavu v´ akc´ pˇechod m˚ˇeme podm´ ıce ı, r uz ınit v´sledkem pr´vˇ jedn´ metody. y ae e <action-state id=quot;actionStatequot; > <action bean=quot;actionBeanquot; method=quot;sampleActionquot; /> <action bean=quot;actionBeanquot; method=quot;sampleAction2quot; /> <transition on=quot;sampleAction.successquot; to=quot;decisionStatequot; /> <transition on-exception=quot;exceptionquot; to=quot;endStatequot; /> </action-state> <global-transitions/> - Vhodn´ pouˇ´ pokud se pˇechody v kaˇd´m stavu z flow opakuj´ e zıt, r ze ı. <global-transitions> <transition on=quot;globalEvent1quot; to=quot;state1quot;/> <transition on=quot;globalEvent2quot; to=quot;state2quot;/> </global-transitions> <xxx-actions/> - Pomoc´ tagu definujeme akce: ı • <start-actions/> - akce se provedou po vstupu do flow, • <end-actions/> - akce se provedou pˇed koncem flow, r • <entry-actions/> - akce se provedou po vstupu do stavu, • <exit-actions/> - akce se provedou pˇed koncem stavu, r • <renderer-actions/> - akce se provedou pˇed vlastn´ renderov´n´ ve viewState. r ım a ım <xxx-mapper/> - Tagem definujeme mapov´n´ do flow/z subflow: aı • <input-mapper/> - vstupn´ mapov´n´ ı a ı, • <output-mapper/> - v´stupn´ mapov´n´ y ı a ı. Pokud chceme v subflow pˇistoupit k dat˚m z nadˇazen´ho flow, m´me 2 r u r e a moˇnosti, jak toho dos´hnout. Prvn´ moˇnost´ je pouˇ´ conversation scope, kter´ je v z a ı z ı zıt y subflow viditeln´. T´ y ımto ale dan´ data zviditeln´ a ıme i pro vˇechny ostatn´ subflow. Dalˇ´ s ı sı moˇnost´ je pouˇ´ mapov´n´ atribut˚. V hlavn´ flow definujeme: z ı zıt aı u ım

×