seam framework in_action

106
Seam Framework w akcji

Upload: michal-orman

Post on 06-Jun-2015

2.126 views

Category:

Technology


0 download

DESCRIPTION

Presentation about Seam Framework

TRANSCRIPT

Page 1: Seam framework in_action

Seam Framework w akcji

Page 2: Seam framework in_action

Szew

● Miejsce zszycia kawałków tkaniny, futra itp. wraz z nićmi, którymi te kawałki zszyto.

● Operacyjne zszycie tkanek miękkich.● Naturalne połączenie dwu przylegających do

siebie kości spojonych tkanką łączną.● Połączenie brzegów przedmiotów metalowych

za pomocą nitkowania lub spawania.

Page 3: Seam framework in_action

JSF

EJB

Page 4: Seam framework in_action

JSF

Wicket

RichFacesICEFaces

AJAX

GWT

EJB

SpringJPA

Hibernate

Guice

Seam

Facelets

jBMP

DroolsWebBeans

Groovy

one framework to rule them all...

Page 5: Seam framework in_action

Czym jest Seam?

Page 6: Seam framework in_action

Stos aplikacji

● Integruje różne frameworki z różnych warstw JEE● Widoku (JSF, RichFaces, ICEFaces, Wicket)● Dostępu do danych (JPA, Hibernate)● i więcej ...

Page 7: Seam framework in_action

Kontener komponentów

● Integruje komponenty JPA, EJB, POJO oraz JSF w taki sposób, że zaciera granice pomiędzy poszczególnymi warstwami i daje wrażenie korzystania z jednego kontenera

Page 8: Seam framework in_action

Komponenty i kontenery

Kontener Tworzenie komponentu

EJB @Stateful, @Stateless, @MessageDriven, ejb-jar.xml

JSF faces-config.xml

Spring applicationContext.xml

Kontener servletów web.xml

Page 9: Seam framework in_action

Komponenty i kontenery

Kontener Tworzenie komponentu

EJB @Stateful, @Stateless, @MessageDriven, ejb-jar.xml

JSF faces-config.xml

Spring applicationContext.xml

Kontener servletów web.xml

Seam @Name, components.xml

Page 10: Seam framework in_action

Facelets / RichFaces / JSP

JSF

Seam

EJB / Spring / JPA / Hibernate

Seam context variable

Page 11: Seam framework in_action

Definiowanie komponentu Seam

1. @Name("foo")2. @Scope(ScopeType.CONVERSATION)3. public class Foo { }

Page 12: Seam framework in_action

Wstrzykiwanie zależności

1. @Name("bar")2. public class Bar {3. 4. @In5. private Foo foo;6.7. }

Page 13: Seam framework in_action

Wstrzykiwanie zależności cd...

1. @Name("bar")2. public class Bar {3. 4. @In(create = true)5. private Foo foo;6.7. }

Page 14: Seam framework in_action

Wstrzykiwanie zależności cd...

1. @Name("bar")2. public class Bar {3. 4. @In("#{foo}")5. private Foo foo;6.7. }

Page 15: Seam framework in_action

Inversion of Control

● Wzorzec projektowy „rozluźniający” powiązania pomiędzy komponentami

● Pozwala komponentom na skupienie się na wykorzystywaniu innych komponentów (serwisów) niż ich wyszukiwaniu

● Wszyscy go dobrze znają...

Page 16: Seam framework in_action

Inversion of Control

● Zwykle ludzie mówiąc o IoC mają na myśli dependency injection (DI), jeden z przypadków użycia IoC

● Jednakże IoC > DI

Page 17: Seam framework in_action

DI jest zbyt statyczne

Problem z klasycznym podejściem do DI jest taki, że wstrzykiwanie zależności odbywa się tylko raz, tuż po stworzeniu instancji komponentu. Komponent jest przywiązany do referencji obiektów wstrzykniętych mu w czasie tworzenia.

Komponenty powinny być świadome swojego istnienia w kontekście i powinny brać aktywny udział w zarządzaniu komponentami.

Page 18: Seam framework in_action

IoC w Seam

● W Seam mamy do czynienia z dependency bijection

● W Seam zależności są wstrzykiwane dynamicznie w czasie życia komponentu, a nie tylko podczas jego tworzenia

● Dependency bijection pozwala na wstrzykiwanie zależności do komponentu, jak i umieszczanie komponentów w kontekście

● Bijection = injection + outjection

Page 19: Seam framework in_action

Bijection

● Bijection jest to kombinacja injection i outjection● Bijection zachodzi w momencie wywołania

metody (a nie tworzenia komponentu)● Injection w momencie wywołania metody● Outjection po powrocie metody

Page 20: Seam framework in_action

Disinjection

● Wszystkie pola komponentów do których zostały wstrzyknięte zależności otrzymują wartość null.

● Zapobiega wyciekom pamięci● Rozwiązuje problem serializacji obiektów

Page 21: Seam framework in_action

Bijection interceptor

Powrót z metody

Komponent wywołującymetodę

Wstrzykiwanie zależnościw pola oznaczone adnotacją @In

Wywołanie metody

Outjection na polach oznaczonychadnotacją @Out

Disinjection na polachoznaczonych adnotacją @In

Interceptor

Page 22: Seam framework in_action

Bijection w akcji1. @Name("authenticator")2. public class Authenticator {3. @In4. private Credentials credentials;5.6. @Out(scope = ScopeType.SESSION, required = false)7. private Long currentUserId;8.9. @In(create = true)10. private UserQuery userQuery;11.12. public boolean authenticate() {13. userQuery.setUsername(credentials.getUsername());14. User user = userQuery.getSingleResult();15. if (isPasswordValid(credentials.getPassword(), user)) {16. currentUserId = user.getId();17. }18. }19.20. // pozostałe metody21. }

Page 23: Seam framework in_action

Inne formy wstrzykiwania zależności

● @RequestParameter

● @PersistenceContext

● @DataModelSelection

● @DataModelSelectionIndex

Page 24: Seam framework in_action

Inne formy dependency outjection

● @DataModel

● @Factory

● @Unwrap

Page 25: Seam framework in_action

Omijanie bijection

● Wewnętrzne wywołania metod● @BypassInterceptors

Page 26: Seam framework in_action

Generowanie zdarzeń

Page 27: Seam framework in_action

Zdarzenia

● Seam posiada wbudowane wsparcie dla wzorca observer, który w znacznym stopniu pozwala redukować zależności między komponentami (budować luźne powiązania)

● Seam pozwala na generowanie zdarzeń z metod jak i ich obsługę z metod komponentów

● Zdarzenia mogą być generowane na wiele sposobów, jak i można generować wiele typów zdarzeń (synchroniczne, asynchroniczne, czasowe, transakcyjne)

Page 28: Seam framework in_action

Generowanie zdarzeń

1. public String register() {2. // registration action3. Events.instance().raiseEvent("registered");4. return "success";5. }

Page 29: Seam framework in_action

Generowanie zdarzeń

1. @In private Events events;2.3. public String register() {4. // registration action5. entityManager.persist(newUser);6. events.raiseTransactionSuccessEvent(7. "registered", newUser);8. return "success";9. }

Page 30: Seam framework in_action

Generowanie zdarzeń

1. @RaiseEvent("registered")2. public String register() {3. // registration action4. return "success";5. }

Page 31: Seam framework in_action

Generowanie zdarzeń

1. <page view-id="/register.xhtml">2. <navigation 3. from-action="#{userManager.register}">5. <rule if-outcome="success">6. <raise-event type="registered" />7. <redirect 8. view-id="/registered.xhtml" />9. </rule>10. </navigation>11. </page>

Page 32: Seam framework in_action

Obserwowanie zdarzeń

1. @Name("registrationObserver")2. public class RegistrationObserver {3. @Logger private Log logger;4. 5. @Observer(value="registered", create=true)6. public void onRegisteredEvent(User newUser) {7. logger.info("Registered new user: "8. + newUser.getUsername());9. }10.11. }

Page 33: Seam framework in_action

Obserwowanie zdarzeń

1. <event type="registered">2. <action 3. execute=4. "#{registrationObserver.onRegisterEvent(newUser)}"5. />6. </event>

Page 34: Seam framework in_action

Wbudowane zdarzenia

● Inicjalizacja kontenera seamowego● Przypisanie zmiennej kontekstowej (added,

removed)● Zdarzenia cyklu życia komponentów (created,

destroyed)● Zdarzenia związane z autentykacją● Zdarzenia związane z transakcją● i wiele innych...

Page 35: Seam framework in_action

Metody fabrykujące

Page 36: Seam framework in_action

Metody fabrukujące w Seam

● Seam posiada wbudowane wsparcie dla wzorca factory method

● Fabryka ma na celu dostarczenie konkretnych danych zamiast instancji komponentu

● Metody fabrykujące oznacza się adnotacją @Factory lub w deskryptorze komponentów

● Metody fabrykujące z założenia mają wypierać użycie „getterów”

Page 37: Seam framework in_action

Metoda fabrykująca jest wykonywana tylko raz, kolejne wywołania zwracają utworzoną i

umieszczoną w kontekście wcześniej wartość.

Page 38: Seam framework in_action

Rezultat wywołania fabryki

● Rezultat metody fabrykującej może być przekazany na trzy sposoby:● Przez zwrócenie wartości z metody● Przez outjection (jako, że metoda fabrykująca

znajduje się w komponencie to działa na nim bijection)

● Przez umieszczenie wartości bezpośrednio w kontekście

Page 39: Seam framework in_action

Przykład metody fabrykujacej

1. @Name("currentUserFactory")2. public void CurrentUserHome {3. @In private EntityManager em;4. 5. @In private Long currentUserId;6.7. @Factory("currentUser")8. public User getCurrentUser() {9. return em.find(User.class, currentUserId);10. }11. }

Page 40: Seam framework in_action

Przykład metody fabrykujacej

1. @Name("currentUserFactory")2. public void CurrentUserHome {3. @In private EntityManager em;4. 5. @In private Long currentUserId;6.7. @Out private User currentUser;8.9. @Factory("currentUser")10. public User getCurrentUser() {11. currentUser = 12. em.find(User.class, currentUserId);13. }14. }

Page 41: Seam framework in_action

Unwrap

Page 42: Seam framework in_action

Unwrap

● Seam pozwala dostarczać dane do kontekstu za pomocą metody oznaczonej adnotacją @Unwrap

● W odróżnieniu od metody fabrykującej taka metoda jest wywoływana za każdym razem, kiedy komponent pod konkretną nazwą jest żądany

Page 43: Seam framework in_action

@Unwrap a @Factory

● Jest prawdziwym komponentem● Można konfigurować w components.xml

● Można używać adnotacji @Create i @Destroy

● Metoda oznaczona @Unwrap jest wywoływana zawsze

● Komponent może przechowywać stan i obserwować zdarzenia

Page 44: Seam framework in_action

Metody oznaczone @Unwrap można używać jako swoisty alias.

Page 45: Seam framework in_action

1. @Name("org.jboss.seam.faces.facesContext")2. @Scope(ScopeType.APPLICATION)3. public class FacesContext {4. @Unwrap public FacesContext getContext() {5. return FacesContext.getCurrentInstance();6. }7. }

@Unwrap w akcji

Page 46: Seam framework in_action

Method interceptors

Page 47: Seam framework in_action

Interceptory w Seam

● Seam rozszerza funkcjonalność interceptorów z EJB● Przenosi ją ze świata Java EE to świata POJO

● Pozwala w deklaratywny sposób dodawać logikę AOP

Page 48: Seam framework in_action

Definiowanie interceptora

1. @AroundInvoke2. public Object methodName(InvocationContext ctx)3. throws Exception { 4. // interceptor logic...5. return ctx.proceed();6. }

Page 49: Seam framework in_action

Definiowanie interceptora

1. @Interceptor(stateless = true, 2. type = InterceptorType.CLIENT3. public class StatelessInterceptor {4. 5. @AroundInvoke6. public Object methodName(InvocationContext ctx)7. throws Exception { 8. // interceptor logic...9. return ctx.proceed();10. }11.12. }

Page 50: Seam framework in_action

Cechy interceptora w Seam

● Interceptor może być stateful-owy lub stateless-owy

● Interceptory mogą być przypisywane do komponentów zarówno po stronie serwera jak i klienta

● Interceptory mogą być przypisywane do klas deklaratywnie (stereotypes)

Page 51: Seam framework in_action

Przypisywanie interceptorów

● @Interceptors

Page 52: Seam framework in_action

Przypisywanie interceptorów

● @Interceptors

● W Seamie, w odróżnieniu od EJB, adnotacja @Interceptors nie jest nakładana na klasy komponentów, które chcemy interceptować

● Adnotacja ta to meta adnotacja którą nakłada się na inne adnotacje

Page 53: Seam framework in_action

Przypisywanie interceptorów

1. @Target(TYPE)2. @Retention(RUNTIME)3. @Interceptors(CurrentUserAccessInterceptor.class)4. public @interface VerifyCurrentUserAccess {}5.6. @Name("offerAddAction")7. @VerifyCurrentUserAccess8. public class OfferAddAction { }

Page 54: Seam framework in_action

Model kontekstowy w Seam

Page 55: Seam framework in_action

Konteksty w Java Servlet API

● Request● Session● Application

Page 56: Seam framework in_action

Konteksty w Seam

● Event (request)● Page● Conversation● Session● Application● Business process

Page 57: Seam framework in_action

Konteksty w Seam

Przeglądarka

Strona 1 Strona 1 Strona 2 Strona 3

event event event event

page page page

conversation conversation

session

Page 58: Seam framework in_action

Konwersacja

Page 59: Seam framework in_action

Konwersacja w Seam

● Pozwala przechowywać stan komponentów pomiędzy kolejnymi żądaniami (nawet w przypadku występowania przekierowań)

● Jest bardziej ziarnista niż kontekst sesji● W deklaratywny sposób można kontrolować

zakresy konwersacji (oraz jej propagacje)● Na czas konwersacji Seam rozpina transakcje

(utrzymywana jest sesja połączenia z bazą danych)

Page 60: Seam framework in_action

Konwersacja w Seam została pomyślana jako kontekst, który przechowuje stan

komponentów w ramach konkretnego przypadku użycia.

Page 61: Seam framework in_action

A czemu nie w sesji?

● Sesja jest zbyt długa i przechowywanie danych w tym kontekście może prowadzić do wycieków pamięci

● Sesja jest dzielona pomiędzy karty przeglądarki● Sesja nie posiada żadnych mechanizmów

obronnych przed współbieżnym dostępem do danych

● Błędy występujące przez nieprawidłowe wykorzystywanie kontekstu sesji mogą być trudne do reprodukcji w środowisku testowym

Page 62: Seam framework in_action

Mimo wszystko rozwiązanie leży w... sesji. Trzeba ją tylko odpowiednio podzielić i zarządzać.

Page 63: Seam framework in_action

Konwersacja to wydzielony segment sesji

cid = 1 cid = 2

cid = 3 cid = 4

Sesja HTTP

Page 64: Seam framework in_action

Seam zarządza konwersacją

● Każda konwersacja posiada określony czas trwania (timeout)

● Każda konwersacja toczy się w izolacji (nie trzeba się przejmować synchronizacją)

Page 65: Seam framework in_action

Wymagania konwersacji

● Komponenty muszą implementować interfejs java.io.Serializable

● Czas trwania sesji musi być dłuższy niż czas trwania konwersacji

Page 66: Seam framework in_action

Stany konwersacji

● Tymczasowa (temporary conversation)● Długa (long-running conversation)● Zagnieżdżona (nested conversation)

Page 67: Seam framework in_action

Stany konwersacji

● Tymczasowa (temporary conversation)● Długa (long-running conversation)● Zagnieżdżona (nested conversation)

Page 68: Seam framework in_action

Przejścia stanów konwersacji

Temporary Long-running

begin

end

brak konwersacji kontynuacja konwersacji

Zniszczona Zniszczona

koniec żądania sesja lub konwersacja wygasła

Page 69: Seam framework in_action

Stany długiej konwersacji

Zniszczona

Foreground Background

Long-running

begin

end

resumed

resumed

concurrent conversation resumed

session timeout conversation or session timeout

Page 70: Seam framework in_action

Definiowanie zakresów długiej konwersacji

Page 71: Seam framework in_action

Za pomocą adnotacji1. @Name("bookingAction")2. @Restrict("#{s:hasRole('Customer')}")3. public class BookingAction {4. 5. @Begin(join = true)6. public void fetchRooms() {7. // fetching rooms...8. }9. 10. @End(beforeRedirect = true)11. public void confirm() {12. // confirm booking...13. }14.15. @End(beforeRedirect = true)16. public void cancel() {17. // cancel booking...18. }19. 20. }

Page 72: Seam framework in_action

Za pomocą adnotacji

1. @Name("roomsFactory")2. public void RoomsFactory {3. @Begin(join = true)4. public void fetchRooms() {5. // fetching rooms...6. }7. }8.9. @Name("bookingAction")10. public void BookingAction {11. @End(beforeRedirect = true)12. public void confirm() {13. // confirmation action...14. }15. }

Page 73: Seam framework in_action

W deskryptorze strony

1. <page view-id="/booking.xhtml">2. <begin-conversation join="true" />3. </page>

Page 74: Seam framework in_action

W definicjach nawigacji

1. <page view-id="/booking.xhtml">2. <navigation 3. from-action="#{roomsFactory.fetchRooms}"> 4. <begin-conversation join="true" />5. </navigation>6. 7. <navigation from-action="#{bookingAction.confirm}">8. <end-conversation before-redirect="true" />9. </navigation>10. </page>

Page 75: Seam framework in_action

Za pomocą komponentów JSF

1. <s:link view-id="/booking.xhtml" propagation="begin" />2.3. <s:button action="#{bookingAction.confirm}" 4. propagation="end" />5.6. <h:commandButton action="#{bookingAction.confirm}">7. <s:conversationPropagation type="end" />8. </h:commandButton>

Page 76: Seam framework in_action

Zaawansowane zarządzanie stronami w Seam

Page 77: Seam framework in_action

Cykl JSF

JSF Servlet

Restore View

Apply Request Values

Process Validations

Update ModelValues

InvokeApplication

RenderResponse

Page 78: Seam framework in_action

Cykl JSF (initial request)

JSF Servlet

Restore View

Apply Request Values

Process Validations

Update ModelValues

InvokeApplication

RenderResponse

Przeglądarka

Page 79: Seam framework in_action

Cykl JSF (postback)

JSF Servlet

Restore View

Apply Request Values

Process Validations

Update ModelValues

InvokeApplication

RenderResponse

Przeglądarka

Page 80: Seam framework in_action

Nawigacja w JSF

1. <navigation-rule>2. <from-view-id>/login.xhtml</from-view-id>3. <navigation-case>4. <from-action>5. #{authenticator.login}6. </from-action>7. <from-outcome>loggedIn</from-outcome>8. <to-view-id>/home.xhtml</to-view-id>9. <redirect/>10. </navigation-case>11. </navigation-rule>

Page 81: Seam framework in_action

Problemy z JSF

● Skrócony cykl JSF● Służy jako dostawca strony● Zakłada, że nie potrzeba wykonywania żadnej logiki

przed wyrenderowaniem strony● Zakłada, że użytkownik posiada uprawnienia do

żądanego zasobu

● Zorientowanie na żądania typu POST● Mało rozwinięte reguły nawigacji

● Brak możliwości wykorzystania EL w regułach

Page 82: Seam framework in_action

Seam page descriptor

Page 83: Seam framework in_action

Do czego służy deskryptor strony

● Definiowania reguł nawigacji● Generowania komunikatów (FacesMessages)● Mapowania parametrów URL● Dodawania parametrów URL (dla

przekierowań)● Uruchamiania akcji zanim widok zostanie

wyrenderowany

Page 84: Seam framework in_action

Do czego służy deskryptor strony cd...

● Sprawdzania reguł bezpieczeństwa● Kontrolowania zakresów konwersacji● Kontrolowania zakresów page flow● Kontrolowania zakresów procesów

biznesowych i zadań● Wywoływanie eventów● Obsługa wyjątków

Page 85: Seam framework in_action

Deskryptor jest świadomy kontekstu aplikacji

Page 86: Seam framework in_action

Inteligentna nawigacja w Seam

● Pozwala użyć dowolnej wartości (dostępnej za pomocą EL) do definiowania przekierowań

● Reguły nawigacji są warunkowe● Definiuje jak powinna być propagowana

konwersacja, czy proces biznesowy● Pozwala dodawać komunikaty JSF przed

wyrenderowaniem strony bądź przekierowaniem● Pozwala dodawać parametry URL● Pozwala wywoływać eventy

Page 87: Seam framework in_action

Definiowanie nawigacji

1. <page view-id="/login.xhtml" scheme="https">2. <navigation>3. <rule if="#{identity.loggedIn}">4. <redirect view-id="/home.xhtml" />5. </rule>6. </navigation>7. </page>

Page 88: Seam framework in_action

Definiowanie nawigacji

1. <page view-id="/offer/add.xhtml" login-required="true">2. <navigation from-action="#{offerManager.addOffer}">3.4. <rule if-outcome="offerAdded" 5. if="#{offerManager.addNext}">6. <redirect view-id="/offer/add.xhtml" />7. </rule>8.9. <rule if-outcome="offerAdded">10. <redirect view-id="/offer/list.xhtml">11. <param name="userId" 12. value="#{currentUserId}" />13. </redirect>14. </rule>15.16. </navigation>17. </page>

1

2

Page 89: Seam framework in_action

Definiowanie nawigacji

1. <page view-id="*">2. <navigation from-action="#{identity.logout}">3. <end-conversation before-redirect="true" />4. <redirect view-id="/home.xhtml" />5. </navigation>6.7. <navigation 8. from-action="#{quickSearchAction.performSearch}">9. <redirect view-id="/offers/index.xhtml" />10. </navigation>11.12. <navigation>13. <rule if-outcome="accessDenied">14. <redirect view-id="/denied.xhtml" />15. </rule>16. </navigation>17. </page>

1

2

3

Page 90: Seam framework in_action

Definiowanie nawigacji

1. <pages login-view-id="/login.xhtml" 2. no-conversation-view-id="/home.xhtml">3.4. <exception5. class="org.jboss.seam.ConcurrentRequestTimeoutException">6. <http-error error-code="503" />7. </exception>8.9. <exception class="org.jboss.seam.security.AuthorizationException">10. <redirect view-id="/denied.xhtml" />11. </exception>12.13. <exception class="javax.persistence.OptimisticLockException">14. <end-conversation />15. <redirect view-id="/error.xhtml" />16. </exception>17.18. </pages>

1

2

3

Page 91: Seam framework in_action

Definiowanie nawigacji

1. public String goToHome() {2. return "/home.xhtml";3. }

Page 92: Seam framework in_action

Mapowanie parametrów strony

● Seam pozwala na ustawianie wartości pól komponentu w skróconym cyklu JSF (JSF pozwala tylko w postbacku)

● Parametrem strony może być wartość z formularza (POST) jak i parametr URL (GET)

● Parametry mogą być przypisane do dowolnych pól każdego komponentu Seam (osiągalnego za pomocą EL)

Page 93: Seam framework in_action

Mapowanie parametrów URL

http://localhost:8080/profile.seam?userId=1

1. <page view-id="/profile.xhtml" login-required="true">2. <param name="userId" value="#{userManager.userId}" />3. </page>

Page 94: Seam framework in_action

Właściwości parametrów

● Do każdego parametru można zdefiniować JSF-owe walidatory i konwertery takie jak definiuje się dla normalnego postbackowego cyklu

● Można zdefiniować, że parametr jest wymagany bądź opcjonalny

● Parametrów nie trzeba przypisywać do konkretnych pól komponentu, takie parametry mogą po prostu przechowywać dane między kolejnymi żądaniami

Page 95: Seam framework in_action

URL rewrite

● Seam pozwala na przepisywanie adresów URL zgodnie z szablonem zdefiniowanym w deskryptorze strony

● Seam przepisuje URL-e zarówno żądań przychodzących jak i odpowiedzi aplikacji

Page 96: Seam framework in_action

URL rewrite

http://localhost:8080/users/1/profile

1. <page view-id="/profile.xhtml" login-required="true">2. <rewrite pattern="/users/{userId}/profile" />3. <param name="userId" value="#{userManager.userId}" />4. </page>

Page 97: Seam framework in_action

Komponenty przepisujące URL-e

● <s:link> (<h:commandLink>)

● <s:button> (<h:commandButton>)

Page 98: Seam framework in_action

Komponenty przepisujące URL-e

● <s:link> (<h:commandLink>)

● <s:button> (<h:commandButton>)

● <s:form>

Page 99: Seam framework in_action

Akcje strony

● Seam pozwala na wykonywanie akcji dla danej strony (view-id) tuż przed jej wyrenderowaniem (nawet w skróconym przebiegu JSF)

● Są to standardowe akcje dla których można definiować reguły nawigacji (wywoływane jednak przed szóstą fazą JSF a nie w piątej!)

● Akcje te mogą służyć do zainicjalizowania widoku – załadowania danych potrzebnych do wyrenderowania strony● Pozwala to na implementacje RESTful-owych URL-i

Page 100: Seam framework in_action

Akcje strony

http://localhost:8080/users/1/profile

1. <page view-id="/profile.xhtml" login-required="true">2. <rewrite pattern="/users/{userId}/profile" />3. <param name="userId" value="#{userManager.userId}" />4. <action execute="#{userManager.fetchUser}" />5. </page>

Page 101: Seam framework in_action

Czego Seam nie poprawia

● Komunikatów JSF● Walidacja i konwersja dotyczą tylko

pojedynczych wartości, nie jest łatwo zaimplementować tych operacji na zależnych polach (i trzeba przenosić ten proces do piątej fazy)

● Wstrzykiwanie zależności do walidatorów i konwerterów (można je pobierać za pomocą metod statycznych)

Page 102: Seam framework in_action

Czego nie omówiono w prezentacji?

● Deskryptor komponentów components.xml

● Seam-gen● WebBeans (JSR-299)● Workspace i pageflow w kontekście konwersacji● Wsparcia Seam dla warstwy widoku

● Komponenty seamowe● Wsparcie dla AJAX

● Testowanie integracyjne● Symulacja cyklu JSF

● Kontekstu business process

Page 103: Seam framework in_action

Czy Seam daje radę?

Page 104: Seam framework in_action

Do poduszki

Page 105: Seam framework in_action

Q&A

Page 106: Seam framework in_action

Dziękuję za uwagę