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

Podobne dokumenty