JBoss Seam - Technologie biznesu elektronicznego seminarium
Transkrypt
JBoss Seam - Technologie biznesu elektronicznego seminarium
JBoss Seam Technologie biznesu elektronicznego seminarium Piotr Jaszczyk Tomasz Kolasa Wydział Informatyki i Zarządzania JBoss Seam Plan wystąpienia 1 Co to jest Seam? Krótki wstęp do Java Enterprise Edition Cechy Seama 2 Prosty przykład 3 Bardziej szczegółowe spojrzenie Facelets Komponenty i kontekst Seam’a Ulepszenia Seam dla JSF Seam Application Framework Obsługa wyjątków Bezpieczeństwo Zdarzenia Testowanie 4 Podsumowanie 2 / 50 JBoss Seam Co to jest Seam? Krótki wstęp do Java Enterprise Edition Enterprise Java Beans Co to jest? Technologia przeznaczona do tworzenia rozbudowanych aplikacji korporacyjnych Wiele aspektów programowania aplikacji internetowych jest obsługiwanych przez kontener Rewolucja w wersji trzeciej (POJO, dependency injection, adnotacje) 3 / 50 JBoss Seam Co to jest Seam? Krótki wstęp do Java Enterprise Edition Enterprise Java Beans Co to jest? Technologia przeznaczona do tworzenia rozbudowanych aplikacji korporacyjnych Wiele aspektów programowania aplikacji internetowych jest obsługiwanych przez kontener Rewolucja w wersji trzeciej (POJO, dependency injection, adnotacje) Konener EJB Udostępnia serwisy komponentom EJB: bezpieczeństwo (JCE, JAAS), transakcje (JTA), usługi katalogowe (JNDI), połączenia zdalne (RMI, CORBA, SOAP), . . . Glassfish (Sun), JBoss (Red Hat), Oracle WebLogic, Apache Geronimo, Sun Java System Web Server, . . . 3 / 50 JBoss Seam Co to jest Seam? Krótki wstęp do Java Enterprise Edition EJB – rodzaje komponentów Stateless Session Beans Reprezentują akcje Nie jest zachowywany stan między wywołaniami metod Możliwość trzymania w puli 4 / 50 JBoss Seam Co to jest Seam? Krótki wstęp do Java Enterprise Edition EJB – rodzaje komponentów Stateless Session Beans Reprezentują akcje Nie jest zachowywany stan między wywołaniami metod Możliwość trzymania w puli Stateful Session Beans Również reprezentują akcje Utrzymują stan między wywołaniami metod Nieużywane są usuwane 4 / 50 JBoss Seam Co to jest Seam? Krótki wstęp do Java Enterprise Edition EJB – rodzaje komponentów Stateless Session Beans Reprezentują akcje Nie jest zachowywany stan między wywołaniami metod Możliwość trzymania w puli Stateful Session Beans Również reprezentują akcje Utrzymują stan między wywołaniami metod Nieużywane są usuwane Message-Driven Beans Asynchroniczne przesyłanie komunikatów Często używane w aplikacjach B2B Java Message Service = JDBC wśród systemów przesyłania komunikatów 4 / 50 JBoss Seam Co to jest Seam? Cechy Seama Cechy Seama integracja frameworków JEE framework rozumiejący ORM zaprojektowany dla aplikacji stateful gotowy na Web 2.0 serwisy oparte na POJO i dependency bijection rozsądne wartości domyślne uniknięcie „programowania w XMLu” wsparcie narzędzi (JBoss Tools) 5 / 50 JBoss Seam Prosty przykład Prosty przykład W jaki sposób seam-gen ułatwia nam życie. Tworzenie aplikacji podobnie jak w RoR. Gotowy projekt oparty o Ant. Możliwość rozwoju aplikacji w popularnych środowiskach (NetBeans, Eclipse). 6 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Facelets Co to jest Facelets? Framework służący do tworzenia stron korzystających z komponentów JSF. Alternatywa dla JSP Pozwala na tworzenie szablonów Zaprojektowany z myślą o JSF Podobno wydajniejszy niż JSP nawet do 50% Czytelne informacje o błędach w przeglądarce: home . x h t m l @57 , 8 7 v a l u e=”#{l o g M e s s a g e L i s t ” EL E x p r e s s i o n U n b a l a n c e d : . . . #{l o g M e s s a g e L i s t 7 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Facelets szablon.xhtml <h tm l x m l n s=” h t t p : //www . w3 . o r g /1999/ x h t m l ” x m l n s : h=” h t t p : // j a v a . sun . com/ j s f / h t ml ” x m l n s : u i=” h t t p : // j a v a . sun . com/ j s f / f a c e l e t s ”> <head> < t i t l e > F a c e l e t s page e x a m p l e</ t i t l e > </ head> <body> <d i v i d=” c o n t a i n e r ”> <h1> F a c e l e t s page e x a m p l e</ h1> <d i v i d=”menu”> < u i : i n s e r t name=”menu” /> </ d i v> <d i v> < u i : i n s e r t name=” body ” /> </ d i v> </ d i v> </ body> </ ht m l> 8 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Facelets index.xhtml < u i : c o m p o s i t i o n t e m p l a t e=” s z a b l o n . x h t m l ” x m l n s=” h t t p : //www . w3 . o r g /1999/ x h t m l ” x m l n s : h=” h t t p : // j a v a . sun . com/ j s f / h t ml ” x m l n s : u i=” h t t p : // j a v a . sun . com/ j s f / f a c e l e t s ”> < u i : d e f i n e name=”menu”> < u i : i n c l u d e s r c=”menu . x h t m l ” /> </ u i : d e f i n e> < u i : d e f i n e name=” body ”> < u i : i n c l u d e s r c=” t e k s t . x h t m l ” /> </ u i : d e f i n e> </ u i : c o m p o s i t i o n> 9 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Facelets tekst.xhtml <u i : c o m p o s i t i o n x m l n s=” h t t p : //www . w3 . o r g /1999/ x h t m l ” x m l n s : h=” h t t p : // j a v a . sun . com/ j s f / h t ml ” x m l n s : u i=” h t t p : // j a v a . sun . com/ j s f / f a c e l e t s ”> <u i : f r a g m e n t r e n d e r e d=”#{ u s e r . r o l e == ’ADMIN’ } ”> <p>#{ a r t i c l e . comments }</p> </ u i : f r a g m e n t> <p>#{ a r t i c l e . c o n t e n t }</p> <u l> < u i : r e p e a t v a l u e=”#{ a r t i c l e . a u t h o r s } ” v a r=” a u t h o r ”> < l i >#{a u t h o r . t o S t r i n g ( ) }</ l i > </ u i : r e p e a t> </ u l> </ u i : c o m p o s i t i o n> 10 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Komponenty Każdy komponent w kontekście jest identyfikowany przez nazwę (adnotacja @Name) Komponentami Seam’a mogą być: EJB 3.0 stateless session beans EJB 3.0 stateful session beans EJB 3.0 entity beans EJB 3.0 message-driven beans JavaBeans Spring beans 11 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Komunikacja z kontekstem poprzec IoC, czyli Seam bijection „Bijekcja” będąca generalizacją wzorca IoC (Inversion of control) pozwala na: wstrzykiwanie zależności z kontekstu do komponentu (adnotacja @In), ale również „wystrzykiwanie” z komponentu do kontekstu (adnotacja @Out). 12 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Zasięg komponentu w kontekscie Stateless context Event context Page context Conversation context Session context Business process context Application context 13 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Przykładowy komponent Seam’a @Name( ” a u t h e n t i c a t o r ” ) @Stateless p u b l i c c l a s s A u t h e n t i c a t o r A c t i o n implements A u t h e n t i c a t o r { @In p r i v a t e UserDAO userDAO ; @Out ( v a l u e = ” l o g g e d I n U s e r ” , r e q u i r e d = f a l s e , s c o p e = ScopeType . SESSION ) p r i v a t e User l o g g e d I n U s e r ; @In ( r e q u i r e d = f a l s e , s c o p e = ScopeType . EVENT) @Out ( r e q u i r e d = f a l s e , s c o p e = ScopeType . EVENT) p r i v a t e User u s e r ; p u b l i c boolean a u t h e n t i c a t e () { try { u s e r = userDAO . f i n d B y L o g P a s s ( c r e d e n t i a l s . g e t U s e r n a m e ( ) , c r e d e n t i a l s . g e t P a s s w o r d ( ) ) ; // a u t h e n t i c a t i o n c o d e } c a t c h ( UserNotFound e x ) { } } @ O b s e r v e r ( ” o r g . j b o s s . seam . s e c u r i t y . l o g i n S u c c e s s f u l ” ) p u b l i c void onLogIn ( ) { loggedInUser = user ; } } 14 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Seam Long-running conversation Zasięg Conversation (temporary conversation) Long-running conversation Session Zarządzanie konwersacją poprzez adnotacje @Begin — promuje konwersację tymczasową do Long-running conversation @End — przekształca Long-running conversation do konwersacji tymczasowej 15 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Komponenty i kontekst Seam’a Long-running conversations @Stateful @Name( ” c a r t ” ) p u b l i c c l a s s C a r t A c t i o n implements Cart { L i s t<P r o d u c t> p r o d u c t s = new L i n k e d L i s t<P r o d u c t >(); @Begin ( j o i n = t r u e ) p u b l i c void addProduct ( Product product ) { // b e g i n s a l o n g r u n n i n g c o n v e r s a t i o n w i t h } first product @End p u b l i c v o i d c h e c k o u t (){ // e n d s s h o p i n g and s a v e s p r o d u c t s t o d a t a b a s e } p u b l i c L i s t<P r o d u c t> g e t P r o d u c t s (){ return products ; } @Remove public void cleanup () { // do n o t h i n g } } 16 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF JBOSS Expression Language Rozszerza Unified Expression Language (EL) z JSP i JSF Umożliwia wywoływanie metod z parametrami <h:commandButton t y p e=” s u b m i t ” v a l u e=” Say H e l l o ” a c t i o n=”#{manager . s a y H e l l o ( p e r s o n , ’ H e l l o ’ ) } ” /> 17 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF JBOSS Expression Language Rozszerza Unified Expression Language (EL) z JSP i JSF Umożliwia wywoływanie metod z parametrami <h:commandButton t y p e=” s u b m i t ” v a l u e=” Say H e l l o ” a c t i o n=”#{manager . s a y H e l l o ( p e r s o n , ’ H e l l o ’ ) } ” /> Dodaje pojęcie projekcji do list #{company . d e p a r t m e n t s . { d | d . name }} #{company . d e p a r t m e n t s . { d | d . emps . { emp | emp . l a s t N a m e }}} 17 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF JBOSS Expression Language Rozszerza Unified Expression Language (EL) z JSP i JSF Umożliwia wywoływanie metod z parametrami <h:commandButton t y p e=” s u b m i t ” v a l u e=” Say H e l l o ” a c t i o n=”#{manager . s a y H e l l o ( p e r s o n , ’ H e l l o ’ ) } ” /> Dodaje pojęcie projekcji do list #{company . d e p a r t m e n t s . { d | d . name }} #{company . d e p a r t m e n t s . { d | d . emps . { emp | emp . l a s t N a m e }}} Można go używać wszędzie, np.: W plikach konfiguracyjnychi i źródłowych W resource boundle (internacjonalizacja) 17 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja między stronami JSF Way <n a v i g a t i o n −r u l e> <from−v i e w−i d>/ e d i t D o c u m e n t . x h t m l</ from−v i e w−i d> <n a v i g a t i o n −c a s e> <from−a c t i o n>#{d o c u m e n t E d i t o r . u p d a t e }</ from−a c t i o n> <from−outcome>s u c c e s s</ from−outcome> <to−v i e w−i d>/ viewDocument . x h t m l</ to−v i e w−i d> < r e d i r e c t /> </ n a v i g a t i o n −c a s e> </ n a v i g a t i o n −r u l e> 18 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja między stronami JSF Way <n a v i g a t i o n −r u l e> <from−v i e w−i d>/ e d i t D o c u m e n t . x h t m l</ from−v i e w−i d> <n a v i g a t i o n −c a s e> <from−a c t i o n>#{d o c u m e n t E d i t o r . u p d a t e }</ from−a c t i o n> <from−outcome>s u c c e s s</ from−outcome> <to−v i e w−i d>/ viewDocument . x h t m l</ to−v i e w−i d> < r e d i r e c t /> </ n a v i g a t i o n −c a s e> </ n a v i g a t i o n −r u l e> Seam Way <page v i e w−i d=” / e d i t D o c u m e n t . x h t m l ”> <n a v i g a t i o n from−a c t i o n=”#{d o c u m e n t E d i t o r . u p d a t e }”> <r u l e i f =”#{d o c u m e n t E d i t o r . e r r o r s . empty }”> < r e d i r e c t v i e w−i d=” / viewDocument . x h t m l ” /> </ r u l e> </ n a v i g a t i o n> </ page> 18 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Walidacja Dostępne sposoby walidacji: Walidacja ręczna - w metodzie akcji (kod Java) Walidacja JSF Walidacja przy pomocy adnotacji (Hibernate validators) 19 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Walidacja JSF <h : f o r m> <h : m e s s a g e s /> <d i v> Country: <h : i n p u t T e x t v a l u e=”#{ l o c a t i o n . c o u n t r y }” r e q u i r e d=” t r u e ”> <m y : v a l i d a t e C o u n t r y /> </ h : i n p u t T e x t> </ d i v> <d i v> Zip code: <h : i n p u t T e x t v a l u e=”#{ l o c a t i o n . z i p }” r e q u i r e d=” t r u e ”> <m y : v a l i d a t e Z i p /> </ h : i n p u t T e x t> </ d i v> <h:commandButton /> </ h : f o r m> 20 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Walidacja przy pomocy adnotacji (Hibernate validators) public class Location { private String country ; private String zip ; @NotNull @Length ( max=30) public String getCountry () { return country ; } public void setCountry ( S t r i n g c ) { country = c ; } @NotNull @Length ( max=6) @ P a t t e r n ( ” ˆ\ d∗ $ ” ) public String getZip () { return zip ; } public void setZip ( S t r i n g z ) { z ip = z ; } } 21 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Walidacja przy pomocy adnotacji (Hibernate validators) <h : f o r m> <h : m e s s a g e s /> < s : v a l i d a t e A l l> <d i v> Country: <h : i n p u t T e x t v a l u e=”#{ l o c a t i o n . c o u n t r y }” r e q u i r e d=” t r u e ” /> </ d i v> <d i v> Zip code: <h : i n p u t T e x t v a l u e=”#{ l o c a t i o n . z i p }” r e q u i r e d=” t r u e ” /> </ d i v> <h:commandButton /> </ s : v a l i d a t e A l l> </ h : f o r m> 22 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Generowanie dokumentów PDF Seam integruje Facelets z biblioteką iText. Pozwala to na dynamiczne generowanie dokumentów PDF. <p : d o c u m e n t x m l n s : p=” h t t p : // j b o s s . com/ p r o d u c t s / seam / p d f ” t i t l e =” H e l l o ”> <p : c h a p t e r number=” 1 ”> < p : t i t l e ><p : p a r a g r a p h>H e l l o</ p : p a r a g r a p h></ p : t i t l e > <p : p a r a g r a p h>H e l l o #{ u s e r . name } !</ p : p a r a g r a p h> </ p : c h a p t e r> <p : c h a p t e r number=” 2 ”> < p : t i t l e ><p : p a r a g r a p h>Goodbye</ p : p a r a g r a p h></ p : t i t l e > <p : p a r a g r a p h>Goodbye #{ u s e r . name } .</ p : p a r a g r a p h> </ p : c h a p t e r> </ p : d o c u m e n t> 23 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Generowanie arkuszy Excel Seam integruje Facelets z biblioteką jExcelAPI. Pozwala to na dynamiczne generowanie arkuszy programu Microsoft Excel. <e : w o r k b o o k> <e : w o r k s h e e t name=” A r k u s z p i e r w s z y ” s t a r t R o w=” 1 ”> <e : c o l u m n v a l u e=”#{ba za . l i s t a O s o b } ” v a r=” o s o b a ”> < f : f a c e t name=” h e a d e r ”> < e : c e l l v a l u e=” N a zw i s k o ” /> </ f : f a c e t> < e : c e l l v a l u e=”#{o s o b a . n a z w i s k o } ” /> </ e : c o l u m n> </ e : w o r k s h e e t> <e : w o r k b o o k> 24 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Wysyłanie wiadomości e-mail (blocked accout message.xhtml) Seam oraz Facelets pozwalają na szablonowanie wiadomości e-mail oraz ich wysyłanie. <m:message x m l n s=” h t t p : //www . w3 . o r g /1999/ x h t m l ” xmlns:m=” h t t p : // j b o s s . com/ p r o d u c t s / seam / m a i l ” x m l n s : h=” h t t p : // j a v a . s u n . com/ j s f / h t m l ”> <m:from name=” System ” a d d r e s s=” no−r e p l y @ m a i l . com” /> <m: to name=”#{p e r s o n . f i r s t n a m e } #{p e r s o n . l a s t n a m e }”> #{p e r s o n . a d d r e s s } </ m :to> <m : s u b j e c t>You a c c o u n t was b l o c k e d !</ m : s u b j e c t> <m:body> <p>Dear #{p e r s o n . f i r s t n a m e } ,</p> <p> Your a c c o u n t was b l o c k e d due t o o u r s p e c i a l s e c u r i t y p o l i c y . You can now t a k e a d v a n t a g e o f o u r new b a r g a i n o f f e r and have your account unblocked f o r o n l y $ 9 . 9 9 . </p> <p>R e g a r d s ,</p> <p>System</p> </ m:body> </ m:message> 25 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Wysyłanie wiadomości e-mail (MailAction) p u b l i c c l a s s M a i l A c t i o n implements M a i l { @In ( c r e a t e=t r u e ) private Renderer renderer ; p u b l i c void send ( ) { try { r e n d e r e r . r e n d e r ( ”/ b l o c k e d a c c o u t m e s s a g e . xhtml ” ) ; f a c e s M e s s a g e s . add ( ” E m a i l s e n t s u c c e s s f u l l y ” ) ; } catch ( E x c e p t i o n e ) { f a c e s M e s s a g e s . add ( ” E m a i l s e n d i n g f a i l e d : ” + e . getMessage ( ) ) ; } } } 26 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja oparta o HTTP GET Tradycyjny JSF: Przejścia między stronami w JavaScript Oparte na metodzie POST Nie da się zapisać w zakładkach interesującej nas strony 27 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja oparta o HTTP GET Tradycyjny JSF: Przejścia między stronami w JavaScript Oparte na metodzie POST Nie da się zapisać w zakładkach interesującej nas strony Seam: Pozwala tworzyć adresy typu http://server/app/display.seam?productId=123 Rozwiązanie oparte o XML lub adnotacje 27 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja oparta o HTTP GET - XML pages.xml <page view −i d=” / p e r s o n . x h t m l ”> <param name=” p i d ” v a l u e=”#{manager . p i d } ” c o n v e r t e r I d=” j a v a x . f a c e s . Long ” /> </ page> 28 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja oparta o HTTP GET - XML pages.xml <page view −i d=” / p e r s o n . x h t m l ”> <param name=” p i d ” v a l u e=”#{manager . p i d } ” c o n v e r t e r I d=” j a v a x . f a c e s . Long ” /> </ page> Kod Java @ S t a t e f u l @Name( ” manager ” ) p u b l i c c l a s s M a n a g e r A c t i o n implements Manager , Serializable { Long p i d ; p u b l i c v o i d s e t P i d ( Long p ) { p i d = p ; } p u b l i c Long g e t P i d ( ) { r e t u r n p i d ; } ... } 28 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Ulepszenia Seam dla JSF Nawigacja oparta o HTTP GET - Java Kod Java @ S t a t e f u l @Name( ” manager ” ) p u b l i c c l a s s M a n a g e r A c t i o n implements Manager , Serializable { @RequestParameter // a l b o @ R e q u e s t P a r a m e t e r ( ” p e r s o n I d ” ) Long p i d ; ... } 29 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework Cechy: gotowe komponenty DAO można definiować przez konfigurację (w XML) lub przez rozszerzenie (w kodzie Java) proste aplikacje da się implementować nie pisząc żadnego kodu warstwy logiki biznesowej obsługuje Hibernate i JPA 30 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework Cechy: gotowe komponenty DAO można definiować przez konfigurację (w XML) lub przez rozszerzenie (w kodzie Java) proste aplikacje da się implementować nie pisząc żadnego kodu warstwy logiki biznesowej obsługuje Hibernate i JPA Rodzaje komponentów: Home objects Query objects Controller objects 30 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – home Klasa encji: @Entity p u b l i c c l a s s Person implements S e r i a l i z a b l e { @Id @ G e n e r a t e d V a l u e p r i v a t e Long i d ; @Length ( 3 0 ) @ N o t N u l l p r i v a t e S t r i n g name ; // g e t t e r y i s e t t e r y } 31 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – home Klasa encji: @Entity p u b l i c c l a s s Person implements S e r i a l i z a b l e { @Id @ G e n e r a t e d V a l u e p r i v a t e Long i d ; @Length ( 3 0 ) @ N o t N u l l p r i v a t e S t r i n g name ; // g e t t e r y i s e t t e r y } Komponent home – konfiguracja <f r a m e w o r k : e n t i t y −home name=” personHome ” e n t i t y −c l a s s=” p l . t e s t . P e r s o n ” /> 31 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – home Klasa encji: @Entity p u b l i c c l a s s Person implements S e r i a l i z a b l e { @Id @ G e n e r a t e d V a l u e p r i v a t e Long i d ; @Length ( 3 0 ) @ N o t N u l l p r i v a t e S t r i n g name ; // g e t t e r y i s e t t e r y } Komponent home – konfiguracja <f r a m e w o r k : e n t i t y −home name=” personHome ” e n t i t y −c l a s s=” p l . t e s t . P e r s o n ” /> Komponent home – rozszerzenie @Name( ” personHome ” ) p u b l i c c l a s s PersonHome e x t e n d s EntityHome<P e r s o n > {} 31 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – home Zapis do bazy: < s : d e c o r a t e t e m p l a t e=” / l a y o u t / e d i t . x h t m l ”> < u i : d e f i n e name=” l a b e l ”> #{m e s s a g e s [ ’ r e g i s t r a t i o n . name ’ ] } </ u i : d e f i n e> <h : i n p u t T e x t i d=”name” v a l u e=”#{personHome . i n s t a n c e . name} ” /> </ s : d e c o r a t e> <h:commandButton t y p e=” s u b m i t ” v a l u e=”#{m e s s a g e s [ ’ r e g i s t r a t i o n . s u b m i t ’ ] } ” a c t i o n=”#{personHome . p e r s i s t } ” /> 32 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – query Komponent query – konfiguracja <f r a m e w o r k : e n t i t y −q u e r y name=” p e r s o n L i s t ” e j b q l=” s e l e c t p from P e r s o n p”> < f r a m e w o r k : r e s t r i c t i o n s> <v a l u e> l o w e r ( name ) l i k e l o w e r ( c o n c a t (#{ e x a m p l e P e r s o n . name } , ’% ’ ) ) </ v a l u e> </ f r a m e w o r k : r e s t r i c t i o n s> </ f r a m e w o r k : e n t i t y −q u e r y> 33 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – query Komponent query – rozszerzenie @Name( ” p e r s o n L i s t ” ) p u b l i c c l a s s P e r s o n L i s t e x t e n d s E n t i t y Q u e r y <P e r s o n > { p r i v a t e s t a t i c f i n a l S t r i n g EJBQL = ” s e l e c t p from P e r s o n p” ; p r i v a t e s t a t i c f i n a l S t r i n g [ ] RESTRICTIONS = { ” l o w e r ( name ) l i k e l o w e r ( c o n c a t (#{ e x a m p l e P e r s o n . name } , ’ % ’ ) ) ” }; public LogMessageList () { s e t E j b q l ( EJBQL ) ; setRestrictionExpressionStrings ( A r r a y s . a s L i s t ( RESTRICTIONS ) ) ; } } 34 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Seam Application Framework Seam Application Framework – query Przeglądanie danych: <h : f o r m> Name: <h : i n p u t T e x t v a l u e=”#{e x a m p l e P e r s o n . f i r s t N a m e } ” /> <h:commandButton v a l u e=” S e a r c h ” a c t i o n=” / s e a r c h . j s p ” /> </ h : f o r m> <h : d a t a T a b l e v a l u e=”#{ p e r s o n L i s t . r e s u l t L i s t } ” v a r=” p e r s o n ”> <h : c o l u m n> < s : l i n k v i e w=” / e d i t P e r s o n . x h t m l ” v a l u e=”#{p e r s o n . name} ”> <f : p a r a m name=” p e r s o n I d ” v a l u e=”#{p e r s o n . i d } ” /> </ s : l i n k> </ h : c o l u m n> </ h : d a t a T a b l e> 35 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Obsługa wyjątków Obsługa wyjątków Chcemy uniknąć tego: 36 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Obsługa wyjątków Obsługa wyjątków Chcemy uniknąć tego: Zamiast tego chcemy: przechwytywać wyjątki aplikacji, reagować na każdy z nich inaczej. 36 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Obsługa wyjątków Obsługa wyjątków – adnotacje Przekierowanie @ApplicationException ( r o l l b a c k = true ) @ Re d ir e ct ( v i e w I d = ”/ i n v e n t o r y E r r o r . xhtml ” ) public class InventoryException extends Exception { . . . } 37 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Obsługa wyjątków Obsługa wyjątków – adnotacje Przekierowanie @ApplicationException ( r o l l b a c k = true ) @ Re d ir e ct ( v i e w I d = ”/ i n v e n t o r y E r r o r . xhtml ” ) public class InventoryException extends Exception { . . . } Błąd HTTP @ H t t p E r r o r ( e r r o r C o d e =404 , end=t r u e ) public c l a s s OtherException extends Exception { . . . } 37 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Obsługa wyjątków Obsługa wyjątków – pages.xml <e x c e p t i o n c l a s s=” j a v a x . p e r s i s t e n c e . E n t i t y N o t F o u n d E x c e p t i o n ” <h t t p −e r r o r e r r o r −c o d e=” 404 ” /> </ e x c e p t i o n> <e x c e p t i o n c l a s s=” j a v a x . p e r s i s t e n c e . O p t i m i s t i c L o c k E x c e p t i o n ”> <end−c o n v e r s a t i o n /> < r e d i r e c t v i e w −i d=” / e r r o r s / o p t i m i s t i c L o c k . x h t m l ” /> </ e x c e p t i o n> <e x c e p t i o n c l a s s=” o r g . j b o s s . seam . s e c u r i t y . A u t h o r i z a t i o n E x c e p t i o n ”> < r e d i r e c t v i e w −i d=” / e r r o r s / p e r m i s s i o n . x h t m l ”> <m e s s a g e>#{m e s s a g e s [ ’ e r r o r s . n o P e r m i s s i o n ’ ] }</ m e s s a g e> </ r e d i r e c t> </ e x c e p t i o n> 38 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Autentykacja Strona logowania Username <h : i n p u t T e x t v a l u e=”#{ c r e d e n t i a l s . u s e r n a m e } ” /> P a s s w o r d <h : i n p u t T e x t v a l u e=”#{ c r e d e n t i a l s . p a s s w o r d } ” /> <h:commandButton v a l u e=” Log i n ” a c t i o n=”#{ i d e n t i t y . l o g i n } ” /> 39 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Autentykacja Strona logowania Username <h : i n p u t T e x t v a l u e=”#{ c r e d e n t i a l s . u s e r n a m e } ” /> P a s s w o r d <h : i n p u t T e x t v a l u e=”#{ c r e d e n t i a l s . p a s s w o r d } ” /> <h:commandButton v a l u e=” Log i n ” a c t i o n=”#{ i d e n t i t y . l o g i n } ” /> Konfiguracja <s e c u r i t y : i d e n t i t y a u t h e n t i c a t e −method=”#{ a u t h e n t i c a t o r . a u t h e n t i c a t e } ” remember−me=” f a l s e ” /> 39 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Autentykacja Komponent autentykujący @Name( ” a u t h e n t i c a t o r ” ) @Stateless p u b l i c c l a s s A u t h e n t i c a t o r A c t i o n implements A u t h e n t i c a t o r { ... p u b l i c boolean a u t h e n t i c a t e () { try { u s e r = userDAO . f i n d B y L o g P a s s ( c r e d e n t i a l s . g e t U s e r n a m e ( ) , c r e d e n t i a l s . getPassword ( ) ) ; i f ( u s e r V e r i f i c a t o r . isUserVerified ( user )) { f o r ( Role r o l e : user . getRoles ( ) ) { i d e n t i t y . addRole ( r o l e . t o S e c u r i t y S t r i n g ( ) ) ; } return true ; } } c a t c h ( UserNotFound e x ) { } return false ; } 40 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Deklaratywna kontrola dostępu pages.xml <p a g e s l o g i n −v i e w −i d=” / l o g i n . x h t m l ”> <page v i e w −i d=” / c h e c k o u t . x h t m l ” l o g i n −r e q u i r e d=” t r u e ” /> <page v i e w −i d=” / i n v e n t o r y . x h t m l ”> < r e s t r i c t>#{ s : h a s R o l e ( ’ admin ’ ) }</ r e s t r i c t> </ page> </ p a g e s> 41 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Deklaratywna kontrola dostępu pages.xml <p a g e s l o g i n −v i e w −i d=” / l o g i n . x h t m l ”> <page v i e w −i d=” / c h e c k o u t . x h t m l ” l o g i n −r e q u i r e d=” t r u e ” /> <page v i e w −i d=” / i n v e n t o r y . x h t m l ”> < r e s t r i c t>#{ s : h a s R o l e ( ’ admin ’ ) }</ r e s t r i c t> </ page> </ p a g e s> Widok < s : d i v r e n d e r e d=”#{ i d e n t i t y . l o g g e d i n } ”> . . . </ s : d i v> 41 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo Deklaratywna kontrola dostępu pages.xml <p a g e s l o g i n −v i e w −i d=” / l o g i n . x h t m l ”> <page v i e w −i d=” / c h e c k o u t . x h t m l ” l o g i n −r e q u i r e d=” t r u e ” /> <page v i e w −i d=” / i n v e n t o r y . x h t m l ”> < r e s t r i c t>#{ s : h a s R o l e ( ’ admin ’ ) }</ r e s t r i c t> </ page> </ p a g e s> Widok < s : d i v r e n d e r e d=”#{ i d e n t i t y . l o g g e d i n } ”> . . . </ s : d i v> Metody @ R e s t r i c t ( ”#{s : h a s R o l e ( ’ admin ’ ) } ” ) public void checkInventory () { . . . } 41 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo JBoss Rules (Drools) Komponent @Name( ” manager ” ) p u b l i c c l a s s Manager { @Restrict public void checkInventory () { . . . } } 42 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Bezpieczeństwo JBoss Rules (Drools) Komponent @Name( ” manager ” ) p u b l i c c l a s s Manager { @Restrict public void checkInventory () { . . . } } security.drl package MyAppPermissions ; i m p o r t o r g . j b o s s . seam . s e c u r i t y . P e r m i s s i o n C h e c k ; i m p o r t o r g . j b o s s . seam . s e c u r i t y . R o l e ; r u l e CanUserCheckInventory when c : P e r m i s s i o n C h e c k ( name==”manager ” a c t i o n==”c h e c k I n v e n t o r y ” ) R o l e ( name==”admin ” ) then c . grant () end ; 42 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Zdarzenia Zdarzenia Zdarzenia w Seam: implementują wzorzec obserwatora, zapewniają większą niezależność między klasami, pozwalają reagować na określone momenty w cyklu życia aplikacji, umożliwiają uruchamianie zdarzeń typu cron przy pomocy Quartz. 43 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Zdarzenia Zdarzenia Wysyłanie zdarzenia @Name( ” h e l l o W o r l d ” ) public c l a s s HelloWorld { public void sayHello () { F a c e s M e s s a g e s . i n s t a n c e ( ) . add ( ” H e l l o World ! ” ) ; Events . i n s t a n c e ( ) . r a i s e E v e n t ( ” h e l l o ” ) ; } } 44 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Zdarzenia Zdarzenia Wysyłanie zdarzenia @Name( ” h e l l o W o r l d ” ) public c l a s s HelloWorld { public void sayHello () { F a c e s M e s s a g e s . i n s t a n c e ( ) . add ( ” H e l l o World ! ” ) ; Events . i n s t a n c e ( ) . r a i s e E v e n t ( ” h e l l o ” ) ; } } Odbieranie zdarzenia @Name( ” h e l l o L i s t e n e r ” ) public class HelloListener { @Observer ( ” h e l l o ” ) public void sayHelloBack () { F a c e s M e s s a g e s . i n s t a n c e ( ) . add ( ” H e l l o t o you t o o ! ” ) ; } } 44 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Zdarzenia Harmonogrowanie – Quartz components.xml <a s y n c : q u a r t z −d i s p a t c h e r /> 45 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Zdarzenia Harmonogrowanie – Quartz components.xml <a s y n c : q u a r t z −d i s p a t c h e r /> Przykład @ S t a t e l e s s @Name( ” m a i n t e n a n c e T i m e r ” ) p u b l i c c l a s s MaintenanceTimerAction implements ... { @ O b s e r v e r ( ” o r g . j b o s s . seam . p o s t I n i t i a l i z a t i o n ” ) p u b l i c void setupCronTimers () { e v e n t s . raiseTimedEvent ( ” sok : backupDatabase ” , new C r o n S c h e d u l e ( ( Long ) n u l l , ” 0 0 1 ∗ ∗ ? ” ) ) ; } @Observer ( ” sok : backupDatabase ” ) p u b l i c v o i d onBa ckupDa t a b a s e ( ) { l o g . i n f o ( ” D a t a b a s e backup ” ) ; // Wykonaj k o p i e } // . . . } 45 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Testowanie Testowanie komponentu Seam Należy rozszerzyć klasę SeamTest oraz skorzystać z ComponentTest: Przykład new ComponentTest ( ) { protected void testComponents ( ) throws Exception { s e t V a l u e ( ”#{u s e r . u s e r n a m e }” , ” 1 o v t h a f e w ” ) ; s e t V a l u e ( ”#{u s e r . p a s s w o r d }” , ” s e c r e t ” ) ; a s s e r t i n v o k e M e t h o d ( ”#{ r e g i s t e r . r e g i s t e r }” ) . e q u a l s ( ” s u c c e s s ” ) ; a s s e r t g e t V a l u e ( ”#{u s e r . name}” ) . e q u a l s ( ” G a v i n King ” ) ; a s s e r t g e t V a l u e ( ”#{u s e r . p a s s w o r d }” ) . e q u a l s ( ” s e c r e t ” ) ; } }. run ( ) ; 46 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Testowanie Testowanie interakcji z użytkownikiem Tutaj również rozszerzamy klasę SeamTest, tym razem implementując metody klasy FacesRequest: processValidations()— przeprowadzamy i testujemy walidację pól formularza updateModelValues()— zapisujemy zmiany w modelu (Entity) invokeApplication()— wykonujemy akcję (np. rejestracja) i sprawdzamy jej wynik renderResponse()— testujemy przeprowadzone zmiany (np. sprawdzając stan bazy danych) 47 / 50 JBoss Seam Bardziej szczegółowe spojrzenie Testowanie Testowanie interakcji z użytkownikiem Przykład p u b l i c c l a s s U s e r T e s t e x t e n d s SeamTest { @Test public void t e s t P a r t i c i p a n t R e g i s t r a t i o n () { new F a c e s R e q u e s t ( ) { protected void updateModelValues () { s e t V a l u e ( ”#{r e g D a t a . l o g i n }” , l o g i n ) ; s e t V a l u e ( ”#{r e g D a t a . p a s s w o r d }” , p a s s w o r d ) ; } protected void invokeApplication () { i n v o k e M e t h o d ( ”#{p a r t i c i p a n t M a n a g e r . r e g i s t e r }” ) ; } protected void renderResponse () { a s s e r t g e t V a l u e ( ”#{p a r t i c i p a n t M a n a g e r . s u c c e s s }” ) . equals ( registrationSuccess ); } }. run ( ) ; } } 48 / 50 JBoss Seam Podsumowanie Źródła I Jboss seam – dokumentacja. http://www.seamframework.org/Documentation. Jboss seam – strona domowa projektu. http://www.seamframework.org/. C. Bauer, G. King. Java Persistence with Hibernate. Manning, 2006. Bill Burke, Richard Monson-Haefel. Enterprise JavaBeans 3.0. Helion (O’Reilly), 2007. Michael Juntao Yuan, Thomas Heute. JBoss Seam – Simplicity and Power Beyond Java EE. Prentice Hall, 2007. 49 / 50 JBoss Seam Podsumowanie KONIEC 50 / 50 JBoss Seam Podsumowanie Prezentacja na podstawie: [2], [1], [5], [3], [4]. 50 / 50