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