Aplikacje wielowarstwowe - Instytut Informatyki Teoretycznej i
Transkrypt
Aplikacje wielowarstwowe - Instytut Informatyki Teoretycznej i
Aplikacje wielowarstwowe dr inż. Grzegorz Michalski Instytut Informatyki Teoretycznej i Stosowanej 15 marca 2016 dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Zasieg ˛ beanów Rodzaje przestrzeni Java bean można skonfigurować do działania w jednej z czterech dostepnych ˛ przestrzeni: none request session application Z reguły korzystamy z przestrzeni sesyjnej. Dlaczego? dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Przestrzenie (1) NoneScoped Obiekty w przestrzeni none moga˛ korzystać z innych obiektów tej przestrzeni. Nie ma możliwości wykorzystania ich na jakiejkolwiek stronie JSF. RequestScoped Obiekty w tej przestrzeni widoczne sa˛ od momentu startu żadania ˛ do jego zakończenia. W przypadku przekierowania, obiekt ten jest aktywny na przekierowanej stronie (jest ona cz˛eścia˛ żadania). ˛ Obiekty z tej przestrzeni maja˛ dostep ˛ do obiektów umieszczonych w innych przestrzeniach. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Przestrzenie (2) SessionScoped Obiekty w tej przestrzeni sa˛ widoczne dla każdego obiektu w danej sesji. „Tworzone” sa˛ w trakcie startu sesji, natomisat usuwane sa˛ w momencie jej wygaśniecia, ˛ ewentualnie wywołania odpowiedniej metody. ApplicationScoped Obiekty umieszczone w tej przestrzeni widoczne sa˛ dla wszystkich klientów aplikacji od momentu uruchomienia aplikacji, aż do jej wyłaczenia. ˛ Wartości atrybutów tych obiektów sa˛ współdzielone dla wszystkich użytkowników. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Cykl życia W trakcie cyklu życia beana sesyjnego można wyróżnić cztery główne zdarzenia: utworzenie (creation) zniszczenie (destruction) dezaktywacja (passivation) aktywacja (activation) Metody odpowiedzialne za obsługe˛ odpowiedniego zdarzenia określane za pomoca˛ odpowiednich adnotacji: @PostConstruct @PreDestroy @PrePassivate @PostActivate dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Metody wywołania beana Klient może wywołać beana sesyjnego na trzy różne sposoby: Local interface – @Local Remote interface – @Remote Web services interfaces – @WebServives Beany wystepuj ˛ a˛ w kilku odmianach. Najpowszechniejszymi sa: ˛ Stateless Stateful dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Cykl życia – Stateless Cykl życia beanów stateless jest relatywnie prosty. 1 Utworzenie beanów z zastosowaniem konstruktora. 2 Przydzielenie zasobów (np. połaczenie ˛ z baza˛ danych). 3 Przeniesienie do puli. 4 Pobranie z puli bezrobotnego beana. 5 Wykonanie logiki biznesowej oferowanej przez beana. 6 Po zakończeniu żadania ˛ odesłanie beana do puli. 7 W razie potrzeby usuniecie ˛ beana z puli. Kontener aplikacji przechowuje pewna liczbe˛ obiektów takiego beana i udostepnia ˛ je na żadanie ˛ klienta. Logika biznesowa realizowana jest za pomoca˛ wywołania jednej metody. W beanach tego typu nie przechowuje sie˛ informacji. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Cykl życia – Stateful (1) Beany tego rodzaju nie sa˛ przechowywane w puli. Po utworzeniu istnieja˛ do momentu żadania ˛ usuniecia ˛ lub upłyniecia ˛ odpowiedniego czasu. Kontener zapewnia otrzymanie tego samego obiektu beana przez jednego klienta. W przeciwieństwie do przedstawionych wcześniej beanów, obiekty te przeznaczone sa˛ do przechowywania informacji. Beany tego typu wymagaja˛ zachowania pewnych reguł: atrybuty musza˛ być typu Java primitives albo implementować interfejs Serializable, co najmniej jedna metoda powinna być oznaczona jako @Remove, maksymalnie jedna metoda @PrePassivate, maksymalnie jedna metoda @PostActivate. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Cykl życia – Stateful (2) Cykl życia beanów stateful jest bardziej złożony od stateless. 1 Utworzenie nowego beana, dla każdej nowo utworzonej sesji klienta. 2 Przydział zasobów. 3 Umieszczenie obiektu w pamieci. ˛ 4 Wykonanie logiki biznesowej żadanej ˛ przez klienta. 5 Oczekiwanie na kolejne żadania. ˛ 6 Przeniesienie z pamieci ˛ na dysk, jeżeli pozostaje bezczynny przez określony czas. 7 Aktywowanie na żadanie ˛ klienta. 8 Usuniecie ˛ po wykonaniu metody @Remove. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Stateless – Stateful Przekształcenie beana Stateless w Stateful jest zawsze możliwe, zamiana w druga˛ strone˛ nie jest już tak oczywista. Porównanie benów Stateless oraz Stateful. przechowywanie atrybutów pula wydajność Webservices dr inż. Grzegorz Michalski Stateless nie tak + + Stateful tak nie – – Aplikacje wielowarstwowe Komunikaty W czasie trwania cyklu życia dowolnej aplikacji JSF każdy obiekt może utworzyć komunikat i dodać go do kolejki komunikatów utrzymywanych w ramach kontekstu stron JSF. W fazie wizualizacji istnieje możliwość wizualizacji tych komunikatów na odpowiednim widoku. W JSF dostepne ˛ sa˛ cztery grypy komunikatów: informacyjne, ostrzeżenia, błedy, ˛ błedy ˛ krytyczne. Najcz˛eściej stosowane sa˛ komunikaty dotyczace ˛ błedów. ˛ dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Komunikaty (2) Za pomoca˛ komunikatów można wyświetlić podsumowanie oraz informacje szczegółowe. Komunikaty w aplikacjach JSF sa˛ obsługiwane za pomoca˛ dwóch znaczników: h:messages h:message Pierwszy znacznik wyświetla wszystkie komunikaty umieszczone w kontekście stron w czasie cyklu życia aplikacji JSF. Liczbe˛ komunikatów wyświetlanych za pomoca˛ tego znacznika można ograniczyć za pomoca˛ odpowiedniego atrybutu. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Komunikaty (3) Drugi znacznik h:message wyświetla pojedynczy komunikat dla konkretnego komponentu. Komponent jest determinowany za pomoca˛ obligatoryjnego atrybutu dla tego znacznika: for. Jeżeli dla danego komponentu zostało wygenerowanych wiecej ˛ niż jeden komunikat, na widoku zostanie wyświetlony tylko ostatni komunikat z puli. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybuty znaczników h:message oraz h:messages errorClass errorStyle fatalClass fatalStyle infoClass infoStyle warnClass warnStyle for globalOnly - Klasa CSS dla komunikatów o błedach. ˛ - Styl CSS dla komunikatów o błedach. ˛ - Klasa CSS dla komunikatów o błedach ˛ krytycznych. - Styl CSS dla komunikatów o błedach ˛ krytycznych. - Klasa CSS dla komunikatów informacyjnych. - Styl CSS dla komunikatów informacyjnych. - Klasa CSS dla komunikatów ostrzeżeń. - Styl CSS dla komunikatów ostrzeżeń. - Identyfikator komponentu (tylko h:message) - Ograniczenie zakresu wyświetlanych komunikatów do komunikatów globalnych. Domyślnie wartość false (tylko dla znacznika h:messages). dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybuty znaczników h:message oraz h:messages (2) layout showDetail showSummary tooltip - Specyfikacja układu komunikatu (tylko h:messages) Dozwolne wartości to list oraz table. - Określenie wyświetlania szczegółów komunikatu. h:messages domyślnie false h:message domyślnie true - Określenie wyświetlania podsumowania komunikatu. h:messages domyślnie true h:message domyślnie false - Określenie, czy szczegóły komunikatu maja˛ być prezentowane w formie pomocy podrecznej. ˛ Wymaga przypisania atrybutom showDetail i showSumamry wartości true. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybuty znaczników h:message oraz h:messages (3) id binding rendered styleClass style title dir lang - Identyfikator obiektu. - Połaczenie ˛ komponentu z właściwościa˛ komponentu wspomagajacego. ˛ - Warunkowa wizualizacja. - Nazwa klasy CSS. - Informacje o stylu wbudowanym. - Tytuł opisujacy ˛ dany element. - Orientacja tekstu. - Jezyk ˛ bazowy atrybutów i tekstu danego elementu. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Komunikaty cd. Atrybut layout umożliwia określenie układu komunikatów znacznika h:messages w formie listy lub tabeli. Przypisanie wartości true dla atrybutów: tooltip, showDetail, showSummary, wyświetla szczegóły komunikatu w formie pomocy podrecznej ˛ prezentowanej po najechaniu na komunikat kursorem myszki. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Komunikaty - przykład Example Opracowanie formularza zbierajacego ˛ informacje o użytkowniku: imie, ˛ nazwisko, rok urodzenia. Dane zapisywane sa˛ do odpowiednich atrybutów beana. Wszystkie pola sa˛ obowiazkowe, ˛ a rok urodzenia jest typu liczbowego. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Panele dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Panele Za pomoca˛ Paneli, znacznik h:panelGrid, można wygenerować na projektowanej stronie tabele jezyka ˛ HTML. Znacznik ten nie posiada wymaganych atrybutów, a utworzenie prostej tabeli złożonej dwóch kolumn definiuje sie˛ w nastepuj ˛ acy ˛ sposób: <h:panelGrid columns="2"> <h:ouputText value="w1k1" <h:ouputText value="w1k2" <h:ouputText value="w2k1" <h:ouputText value="w2k2" <h:ouputText value="w3k1" </h:panelGrid> /> /> /> /> /> Znacznik ten rozmieszcza komponenty od lewej do prawej oraz od góry do dołu. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybuty h:panelGrid bgcolor border cellpadding cellspacing columnClasses rowClasses footerClass headerClass captionClass captionStyle określenie koloru tła określenie szerokości obramowania szerokość wypełnienia wokół komórek tabeli szerokość przestrzeni dzielacej ˛ komórki tabeli klasy CSS dla kolumn, rozdzielone przecinkami klasy CSS dla wierszy, j.w klasa CSS stopki tabeli klasa CSS nagłówka tabeli klasa/styl CSS dla podpisu tabeli (faceta caption) dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybuty h:panelGrid (1) columns frame rules summary liczba kolumn tabeli specyfikacja ramki krawedzi ˛ wokół danej tabeli specyfikacja linii rysowanych pomiedzy ˛ komórkami. podsumowanie tabeli dla przegladarek ˛ renderujacych ˛ strone˛ w sposób inny niż wizualnie. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe h:panelGrid – nadawanie styli Za pomoca˛ odpowiednich atrybutów można oddzielnie określić style dla: nagłówka, stopki, kolumn, wierszy. Dla dwóch pierwszych elementów określany jest jeden styl. Dla dwóch kolejnych określanych jest wiele styli wymienianych po przecinku, które sa˛ stosowane wielokrotnie. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Grupowanie kilku komponentów Grupowanie kilku komponentów w jeden komponent wewnatrz ˛ h:panelGrid: <h:panelGrid> ... <h:panelGroup> <h:inputText name="wiek" value="#{student.wiek}" /> <h:message for="wiek" /> </h:panelGroup> ... </h:panelGrid> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Grupowanie kilku komponentów Grupowanie komponentów pozwala na ich umieszczenie w tej samej komórce tabeli. Zastosowanie tego komponentu umożliwia rozsadne ˛ projektowanie tabel. Najważniejszym parametrem h:panelGroup jest layout określajacy ˛ sposób renderowania grupy. Możliwe sa˛ dwie opcje: brak określenia parametru – zostanie wyrenderowany element span, przypisanie wartości block – zostanie wyrenderowany element div, dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Panele - przykład Example Modyfikacja opracowanego formularza z zastosowaniem paneli. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Warunkowe renderowanie W jaki sposób warunkowo wyświetlić wybrane elementy na stronie? Z pomoca˛ przychodza˛ instrukcje warunkowego renderowania. Wszystkie znaczniki HTML z biblioteki JSF posiadaja˛ przydatny do tego celu atrybut rendered. Jak go zastosować? <h:outpuText value="Witaj świecie" rendered="false" /> Czy można określać widoczność w sposób dynamiczny? dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Warunkowe renderowanie (2) Wartość parametru rendered możne być określana dynamicznie na podstawie określonych w beanie warunków. <h:commandButton value="Wyloguj" rendered="#{user.zalogowany}" /> W jaki inny sposób warunkowo renderować elementy? Wykorzystać do tego celu elementy JSTL. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje warunkowe JSTL Pierwszym krokiem jest dołaczenie ˛ biblioteki znaczników JSTL: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Biblioteka core JSTL udostepnia ˛ 14 znaczników. Ważniejsze z nich to m.in.: choose if forEach otherwise when dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje warunkowe JSTL: if <c:if test="warunek" var="zmienna"> ... </c:if> test – warunek testowy określajacy ˛ zasadność wykonania zdefiniowanych czynności [parametr wymagany], var – nazwa zmiennej do której eksportowany jest rezultat warunku testowego [parametr opcjonalny]. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje warunkowe JSTL: if (2) Z instrukcji warunkowej można korzystać na kilka sposobów: <c:if test="#{user.zalogowany}"> ... </c:if> <c:if test="#{user.wiek > 21}"> ... </c:if> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje warunkowe JSTL : choose Konstrukcja instrukcji warunkowej choose: <c:choose> <c:when test="warunek1"> ... </c:when> <c:when test="warunek2"> ... </c:when> ... <c:otherwise> ... </c:otherwise> </c:choose> dr inż. Grzegorz Michalski when – kolejne warunki opcji wyboru, wymagany parametr test, otherwise – domyślna opcja wyboru, parametr opcjonalny Aplikacje wielowarstwowe Instrukcje warunkowe JSTL : choose Zastosowanie instrukcji choose: <c:choose> <c:when test="#{user.plec == "k" }"> ... </c:when> <c:when test=test="#{user.plec == "m" }"> ... </c:when> ... <c:otherwise> ... </c:otherwise> </c:choose> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje petli ˛ Konstrukcja petli ˛ JSTL: <c:forEach var="zmienna" items="kolekcja" step="x" begin="y" end="z" varStatus="status"> ... </c:forEach> dr inż. Grzegorz Michalski var – nazwa zmiennej items – kolekcja źródłowa step – krok iteracji begin – indeks poczatku ˛ end – indeks końca varStatus –status iteracji (LoopTagStatus) Aplikacje wielowarstwowe Instrukcje petli ˛ (2) Dostepne ˛ własności zmiennej status: index – indeks bieżacej ˛ iteracji, current – bieżacy ˛ obiekt, fisrt – sprawdzenie czy obecny element jest pierwszym w kolekcji, last – sprawdzenie czy bieżacy ˛ element jest ostatnim w kolekcji, step – stosowany krok iteracji, begin – indeks poczatku ˛ iteracji, end – indeks końca iteracji. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje petli ˛ (3) Zastosowanie petli ˛ do utworzenie listy kolorów na stronie: Bean kolor ... List Kol; Kol = new ArrayList(); String k = "bialy"; Kol.add(k); k = "Zloty"; Kol.add(k); ... dr inż. Grzegorz Michalski Strona JSF <ul> <c:forEach var="k" items="#{kolor.Kol}"> <li>$k</li> </c:forEach> </ul> Aplikacje wielowarstwowe Instrukcje petli ˛ (4) Efekt petli ˛ for można uzyskać za pomoca˛ tag’a repeat z biblioteki JSF UI Facelets: <%@ taglib prefix="ui" uri="http://java.sun.com/jsf/facelets" %> Konstrukcja petli: ˛ <ui:repeat value="kolekcja" var="zmienna" > ... </ui:repeat> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Instrukcje petli ˛ (5) Zastosowanie petli ˛ do utworzenie listy kolorów na stronie (kolekcja kolorów w beanie jest zapisana jako obiekt klasy List, jak w poprzednim przykładzie): <ul> <ui:repeat value="#{kolor.Kol}" var="kolor" > <li> #{kolor} </li> </ui:repeat> </ul> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Znaczniki selekcji dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Przykładowe znaczniki selekcji dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Znaczniki selekcji – przypomnienie JSF oferuje programiście siedem kontrolek selekcji: selectBooleanCheckbox selectManyCheckbox selectOneRadio selectOneListbox selectManyListBox selectOneMenu selectManyMenu Znacznik selectBooleanCheckbox reprezentuje pojedyncze pole wyboru. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Znaczniki selekcji (2) Pomijajac ˛ wspomniany znacznik (selectBooleanCheckbox) pozostałe elementy umożliwiaja˛ utworzenie pewnej grupy pól wyboru. W zależności od wybranego rodzaju można zaznaczyć jedna˛ lub wiele opcji. Pola wyboru definiuje sie˛ w ciele konkretnego znacznika w formie jednego lub wielu znaczików: selectItem selectItems <h:selectManyListbox value="wybor"> <f:selectItem itemValue="1" itemLabel="1" /> <f:selectItem itemValue="2" itemLabel="2" /> </h:selectManyListbox> dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Znaczniki selectItem i selectItems Definiowanie dostepnych ˛ elementów w znacznikach selekcji odbywa sie˛ z wykorzystaniem znaczników : selectItem, selectItems. Oprócz definiowania etykiet oraz wartości elementów możliwe jest definiowanie opisów oraz stanu. itemDescription – opis wykorzystywany przez narz˛edzia zewnetrzne, ˛ itemDisabled – aktywny/nieaktywny element, itemLabel – tekst wyświetlany, itemValue – wartość danego elementu, value – wyrażenie reprezentujace ˛ wartość i wskazujace ˛ na egzemplarz klasy SelectItem. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Atrybut value Stosujac ˛ atrybut value można odwołać sie˛ egzemplarzy klasy SelectItem w komponencie JavaBean: <f:selectItem value="#{user.kontakt}" /> Wyrażenie reprezentujace ˛ wartość wskazuje na metode˛ bena user zwracajac ˛ a˛ obiekt SelectItem: public SelectItem kontakt() { return new SelectItem("Newsletter") } dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Klasa SelectItem Klasa SelectItem zdefiniowana jest w bibliotece: javax.faces.model.SelectItem Wybrane konstruktory: SelectItem(Object value) – tworzy obiekt na podstawie przekazanej wartości. Etykieta tworzona jest na podstawie metody toString() dla obiektu value. SelectItem(Object value, String label) – Ustawienie wartości oraz etykiety. SelectItem(Object value, String label, String description) – j.w. z ustawieniem opisu. SelectItem(Object value, String label, String description, Boolean disabled) – j.w. z określeniem stanu aktywności. dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Znacznik selectItems Definiowanie wiecej ˛ niż kilku elementów z wykorzystaniem znacznika jest mało efektywne. Wydajniejszym rozwiazaniem ˛ jest zastosowanie znacznika selectItems: <h:selectOneMenu value="#{user.tytul}"> <f:selectItems value="#{user.tytuly}" /> </h:selectOneMenu> Wyrażenie reprezentujace ˛ wartość #{user.tytuly} może wskazywać m.in na tablice˛ obiektów klasy SelectItem: private static SelectItem[] tytuly ={ new SelectItem(1,"inż."), new SelectItem(2,"mgr"), new SelectItem(3,"mgr inż."), }; public SelectItem[] getTytuly(){ return miasta; } dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Dynamiczne listy wyboru Jak poradzić sobie z dynamicznymi zmianami w elementach selekcji? private List kolory; @PostConstruct public void init() { kolory = new ArrayList(); SelectItem k = new SelectItem(1,"Czerwony"); kolory.add(k); k = new SelectItem(2,"Zielony"); kolory.add(k); k = new SelectItem(3,"Niebieski"); kolory.add(k); } dr inż. Grzegorz Michalski Aplikacje wielowarstwowe Dynamiczne listy wyboru (2) public List getKolory() { return kolory; } Atrybut value znacznika selectItems musi mieć przypisany obiekt: pojedynczy obiekt SelectItem, kolekcje˛ obiektów klasy SelectItem, tablice˛ obiektów klasy SelectItem, mape, ˛ której elementy reprezentuja˛ etykiety i wartości (jako para etykieta wartość). dr inż. Grzegorz Michalski Aplikacje wielowarstwowe