Wykorzystano fragmenty wykładu Michała Wójcika i Michała Piotrowskiego Waldemar Korłub J AVAS ERVER FACES Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska
JSF 2: JavaServerFaces Framework do budowania interfejsu webowego dla aplikacji działającej po stronie serwera Jest częścią standardu Java EE od wersji 5 Komponentowy MVC Model komponentów oddzielony od algorytmów wyświetlania ich na różne sposoby Model obsługi zdarzań emitowanych przez bogate komponenty w interfejsie użytkownika Mechanizmy konwersji i walidacji danych z komponentów
JSF 2: JavaServerFaces Zaprojektowany z myślą o wsparciu narzędziowym (integracja z IDE) Obejmuje standardowy mechanizm szablonów (od Java EE 6) Posiada wygodny mechanizm relokacji zasobów (np. style CSS, skrypty) Posiada mechanizm budowania linków nadających się na zakładki (ang. bookmarkable urls)
JSF a action-driven MVC Action-driven MVC Front-controller Routing (url à akcja) Kontrolery Model widoku Szablony widoków JSF FacesServlet / backing beans? / pola backing beans? Facelets
JSF przepływ sterowania Aplikacja oparta o JSF przypomina bardziej aplikację okienkową niż większość popularnych aplikacji internetowych (action-driven MVC) Nawigacja odbywa się od widoku do widoku Czemu towarzyszą wywołania metod obsługi zdarzeń Action-driven MVC: routing à akcja kontrolera à widok Widoki zbudowane z bogatych komponentów Posiadających własne zachowania do których przypisuje się funkcje obsługi zdarzeń w celu obsłużenia akcji użytkownika n Funkcje obsługi zdarzeń zgromadzone w backing beans Aplikacje stanowe stany widoków zapamiętywane między żądaniami
JSF przepływ sterowania Deweloper JSFa nie myśli na poziomie żądań HTTP przez większość czasu Nie ma routingu, nie ma mapowania URLi na akcje Deweloper JSFa myśli w kontekście interakcji między komponentami widoku i metod obsługi zdarzeń Przykład!
Konwertery, walidatory, listenery Konwertery: konwertują wartości wpisywane w formularzach na typy Javy, standardowo dostępne są konwertery do wszystkich podstawowych typów (w tym dat); Walidatory: odpowiadają za kontrolę wpisywanych wartości w pola formularzy własne walidatory implementowane jako metody w backing beanie lub klasy spełniające interfejs Validator; Listenery: pozwalają nasłuchiwać na pewne zdarzenie jak: kliknięcie przycisku lub linku, zmiana wartości pola itp., Implementuje się je jako metodę w beanie lub klasę spełniającą odpowiedni interfejs.
Obsługa żądania w JSF
Obsługa żądania w JSF Restore View tworzenie widoku strony, wiązanie walidatorów, konwerterów i procedur obsługi zdarzeń z komponentami Apply Requests przypisanie wartości z żądania do obiektów reprezentujących komponenty Process Validations walidacja wartości Update Model przypisanie wartości z komponentów do modelu Invoke Applications obsługa zdarzeń na poziome aplikacji, zgłaszanie formularza, linkowanie do innych stron Render Response generowanie strony
Powiązania między komponentami a backing beans Dwa podejścia: Wykorzystanie właściwości obiektu w atrybutach komponentów widoku n Wyrażenia EL: #{bean.metodaobslugizdarzenia()} Powiązanie komponentów widoku z polami obiektów (binding) n Dostęp do surowych danych wpisanych w komponencie (bez konwersji typów) n beany stają się zależne od klas JSF i konkretnych widoków n Pozwala z poziomu beana sterować komponentem widoku (widoczność, wygląd, atrybuty...)
Zasięgi Obiekty backing beans można umieszczać w różnych zasięgach: Aplikacji Sesji Żądania Widoku Żaden nowa instancja przy każdym użyciu Własny (programisty)
Deskryptor faces-config.xml Umożliwia konfigurację: beanów zarządzanych (backing beans) konwerterów, walidatorów, listenerów obsługi elementów frameworka JSF, np. własną obsługę widoków (ViewHandler) zasobów (np. pliki z tłumaczeniami) nawigacji pomiędzy widokami Nieobowiązkowy plik konfiguracyjny Możliwa konfiguracja za pomocą adnotacji (dłuższy czas wdrażania aplikacji konieczność skanowania klas)
Przypomnienie z WAI: Idiom POST-REDIRECT-GET Deweloper JSFa przez większość czasu nie przejmuje się protokołem HTTP ale pewnych jego cech nie da się ominąć Problem wielokrotnego przesłania formularza jest obecny w JSF tak, jak w każdym innym frameworku
Problem wielokrotnego submitu 14 <form method="post"> <!--... --> </form> POST przelew.php 200 OK Zlecenie przelewu Status: przyjęty do realizacji Odśwież POST przelew.php
POST i przycisk Odśwież 15 Współczesne przeglądarki ostrzegają przed ponownym wysłaniem zapytania POST Gdyby tylko użytkownicy czytali komunikaty i wiedzieli jak je interpretować
POST i zmiany stanu 16 Żądanie POST, które zmieniło stan po stronie serwera, nie powinno zwracać informacji dla użytkownika, a jedynie odpowiedź Redirect (grupa 3xx) dla przeglądarki Przeglądarka zrealizuje przekierowanie pod adres umieszczony w nagłówku Location Docelowa strona powinna prezentować status wykonanej operacji Jeśli nie nastąpiła zmiana stanu, przekierowanie nie jest konieczne np. błędnie wypełniony formularz
Idiom POST-REDIRECT-GET 17 <form method="post"> <!--... --> </form> Obsługa przekierowania POST przelew.php 302 Found Location: status.php?id=17 GET status.php?id=17 200 OK Zlecenie przelewu Pobranie statusu Status: przyjęty do realizacji Odśwież GET status.php?id=17
Redirect w JSF Parametr faces-redirect umożliwia wysłanie odpowiedzi 302 do przeglądarki, np.: public String savebook() { bookservice.savebook(book); return "list_books?faces-redirect=true"; }
Facelets
Facelets Zalecany język deklaracji widoków w JSF 2 Widok deklaruje się jako standardowy plik XHTML z przestrzeniami nazw JSF, Facelets i JSTL Pozwala na tworzenie szablonów stron w prosty sposób (znaczniki <ui:insert> i <ui:define> Pozwala na łatwe budowanie własnych komponentów złożonych, wspiera wykorzystanie EL
Facelets obsługiwane biblioteki JavaServer Faces Facelets Tag Library budowanie szablonów JavaServer Faces HTML Tag Library renderowanie komponentów HTML JavaServer Faces Core Tag Library podstawowe akcje niezależne od komponentów renderujących (render kit) JSTL Functions Tag Library funkcje z JSTL
Pytania?