www.math.uni.lodz.pl/ radmat
EL - Expression Language Załóżmy, że mamy klasę Pracownik, której atrybutem jest PESEL. Załóżmy dalej, że w atrybucie sesji zalogowany przechowujemy obiekt aktualnie zalogowanego pracownika. Java nie pozwala na następującą konstrukcję: <%=session.getattribute("zalogowany").getpesel() %> W tym przypadku niezbędne jest wykonanie rzutowania: <%=((Pracownik)session.getAttribute("zalogowany")).getPesel() %>
Język EL pozwala na pobieranie różnego rodzaju informacji (pochodzących np. z obiektów żądania, odpowiedzi, sesji) w krótki i prosty sposób. Powyższy przykład wygląda następująco: ${sessionscope.zalogowany.pesel}
Do najważniejszych obiektów zaliczyć można: pagescope - mapa atrybutów o zasięgu strony requestscope - mapa atrybutów o zasięgu żądania sessionscope - mapa atrybutów o zasięgu sesji applicationscope - mapa atrybutów o zasięgu kontekstu aplikacji
cookie - mapa ciasteczek header - mapa nagłowków żądania headervalues - mapa nagłówków żądania, która zwraca tablice łańcuchów. Przydatna w przypadku, gdy wiemy, że dany nagłówek może mieć kilka wartości param - mapa parametrów żądania paramvalues - mapa parametrów żądania, która zwraca tablice łańcuchów. Przydatna w przypadku, gdy wiemy, że dany parametr może mieć kilka wartości initparam - mapa parametrów kontekstu
W wyrażeniach języka EL (poza standardowymi obiektami) można bezpośrednio korzystać z nazw atrybutów. Poprawy jest zapis ${zalogowany.pesel} Takie podejście wiąże się jednak z koniecznością przeszukiwania wszystkich możliwych zasięgów, czyli strony, żądania, sesji i kontekstu aplikacji. Jeśli ta sama nazwa występuje w więcej, niż jednym zasięgu, to wybrany zostanie atrybut o najmniejszym zasięgu.
Dostęp do obiektów języka EL Jak zostało wspomniane wcześniej, do obiektów możemy się odwoływać poprzez kropkę, jak w zwykłym języku Java. Problem pojawia się, gdy nazwa elementu, który chcemy wyświetlić, zawiera znaki specjalne, np. minus (np. Content-Type ). Do tego elementu nie odwołamy się używając konstrukcji ${header.content-type} Poprawne odwołanie jest następujące: ${header["content-type"]}
Ćwiczenie 1 Wykorzystując technologię JSP i język wyrażeń EL proszę napisać aplikację webową umożliwiającą pobieranie z formularza wartości ciasteczka i ustawianie ciasteczka.
Ćwiczenie 2 Proszę stworzyć: interfejs Osoba zawierający metodę pobierającą i ustawiającą nazwisko; klasę Pracownik implementującą interfejs Osoba zawierającą metody pobierające i ustawiające nazwisko oraz pole Adres ustawiające adres; klasę Adres zawierającą metodę pobierającą i ustawiającą adres. Powyższe składowe projektu należy umieścić we wspólnym pakiecie (innym, niż domyślny).
Wykorzystując technologię JSP przy pomocy różnych konstrukcji języka EL proszę wypisać: nazwisko osoby wykorzystując (.) dane użytkownika ustawione metodą set.attribute o zasięgu aplikacji wykorzystując [] adres pracownika pochodzący z sesji nazwisko wpisane do listy wykorzystując listę wyrażeń dowolny nagłówek (np. Accept-Encoding) wartość utworzonego ciasteczka.
Java Bean Java Bean jest jedną z najważniejszych konstrukcji występujących w technologiach javowych, nienależąca do standardu języka. Ziarnem Javy może być każda klasa, która: zawiera publiczny konstruktor bezargumentowy. Klasa ta może zawierać oczywiście inne konstruktory. nie powinna udostępniać pól bezpośrednio. Powinna natomiast zawierać metody set i get, dzięki którym pola mogą być modyfikowane. powinna być serializowana. Zauważmy, że powyższe wytyczne nie są związane ze standardem języka. Ich niestosowanie nie spowoduje błędu kompilacji. Jeśli jednak decydujemy się na utworzenie ziarna, a nie zwykłej klasy, to należy trzymać się powyższych zasad.
Przykład: class Pracownik implements Serializable { private String nazwisko; private String pesel;... public Pracownik(){} public String getnazwisko(){return nazwisko;} public String getpesel(){return pesel;} public void setnazwisko(string v){ this.nazwisko=v; } public void setpesel(string v){ this.pesel=v; }... }
Każde ziarno Javy składa się z trzech elementów: właściwości metod zdarzeń
Właściwości Właściwości są publicznymi atrybutami ziarna, które zwykle są reprezentowane przez niepubliczne parametry instancji. Przykład. Niech ziarnem Javy będzie obiekt graficzny, który może mieć określony kolor, np. domyślnie zielony. Wówczas w klasie ziarna powinna pojawić się deklaracja parametru private Color kolor=color.green Ponieważ kolor jest właściwością ziarna, to należy jeszcze dostarczyć metody do manipulacji tą własnością: public Color getkolor() { return kolor; } public void setkolor(color nowykolor) { kolor=nowykolor; repaint(); }
Akcja jsp:usebean Akcja jsp:usebean znajduje lub tworzy ziarno Javy oraz pozwala załadować JavaBean w celu użycia na stronie JSP. Jest to bardzo użyteczna właściwość, ponieważ pozwala wykorzystywać ponownie klasy Javy bez utraty wygody, którą daje JSP w porównaniu do serwletów. Najprostsza składnia określająca użycie ziarna Javy jest następująca: <jsp:usebean id="nazwa" class="pakiet.klasa"} />
Powyższa akcja ładuje ziarna Javy po to, aby można było użyć akcji jsp:setproperty oraz jsp:getproperty w celu określenia i pobrania właściwości JavaBean. Jednakże istnieją dwie inne opcje. Pierwszą z nich jest możliwość użycia jej w formie kontenera, a mianowicie: <jsp:usebean...> zawartość </jsp:usebean> W tym przypadku zawartość powinna być wykonana tylko wtedy, gdy ziarno Javy jest po raz pierwszy wywoływane, a nie kiedy istniejące JavaBean jest znalezione i użyte. Drugą opcją jest to, że oprócz id i class istnieją jeszcze trzy atrybuty, które mogą być użyte: scope, type oraz beanname.
id - zawiera nazwę zmiennej, która wskazuje ziarno Javy class - wyznacza pełną nazwę pakietu JavaBean type - określa typ zmiennej, która odwołuje się do obiektu beanname - nadaje nazwę ziarnu Javy
scope - określa kontekst, w którym ziarno Javy może być dostępne. Dostępne są cztery wartości: page - udostępnia ziarno Javy na bieżącej stronie request - udostępnia ziarno Javy tylko dla bieżącego wywołania klienta session - udostępnia ziarno Javy dla wszystkich stron, które znajdują się w bieżącej sesji application - udostępnia ziarno Javy dla wszystkich stron, które znajdują się w tym samym kontekście serwletu
Przy tworzeniu, bądź też odwoływaniu się do ziarna Javy, należy się zastosować do kilku reguł: Gdy chcemy jedynie uzyskać referencję do ziarna Javy (bez jego tworzenia), to nie trzeba określać atrybutów type oraz class. Można jedynie podać atrybut type, ale musi on wówczas określać jedną z klas bazowych klasy, z której ziarno zostało utworzone. Gdy chcemy utworzyć ziarno Javy, trzeba określić przynajmniej atrybut class. Określa on bowiem klasę, która posłuży do utworzenia ziarna. Klasa ta musi spełniać warunki klasy JavaBean.
Akcja jsp:setproperty Akcja jsp:setproperty określa właściwość ziarna Javy. Ziarna Javy nie są obiektami oderwanymi od rzeczywistości, co więcej - bardzo często reprezentują istniejące w świecie realnym obiekty, np. mogą zostać użyte do ustawiania własności pól ziarna pobranych z formularza. Składnia może wyglądać następująco: <jsp:setproperty name="nazwa" property="właściwość" value="${requestscope.wartość}" />
Takie rozwiązanie wymaga jednak podania wyrażenia EL. Nie jest to kwestia skomplikowana, jednak powyższe rozwiązanie można zapisać następująco: <jsp:setproperty name="nazwa" property="właściwość" param="wartość" /> Atrybut param określa nazwę parametru żądania, czyli informacji pochodzącej np. z pól formularza, którego wartość ma zostać wstawiona do właściwości wartość ziarna Javy.
Rzadko jednak zdarza się, że chcemy modyfikować jedną właściwość ziarna Javy. Z reguły operacje takie wykonywane są jednocześnie dla wielu (czy nawet wszystkich) właściwości ziarna. W takim przypadku stosuje się konstrukcję: <jsp:setproperty name="nazwa" property="*"/> Serwer próbuje wówczas dopasować wszystkie parametry żądania do właściwości ziaren.
Akcja ta może być użyta w dwóch kontekstach: <jsp:usebean id="nazwa"... />... <jsp:setproperty name="nazwa" property="właściwość"... /> lub <jsp:usebean id="nazwa"... >... <jsp:setproperty name="nazwa" property="właściwość"... /> </jsp:usebean>
Dostępne atrybuty: name - określa nazwę własności property - określa własność własności value - określa wartość własności param - określa parametry własności
Akcja jsp:getproperty Akcja jsp:getproperty pobiera wartość właściwości ziarna Javy, konwertuje do typu łańcuchowego, po czym wysyła właściwość ziarna Javy na wyjście. Posiada dwa wymagane atrybuty: name - czyli nazwę ziarna Javy, która została określona przez jsp:usebean property - czyli własność, której wartość należy pobrać Najprostsza składnia jest następująca: <jsp:getproperty name="nazwa" property="własciwosc" />
Ćwiczenie 1 Wykorzystując akcję jsp:usebean proszę odczytać informację pochodzącą z klasy, natomiast wykorzystując akcje jsp:setproperty oraz jsp:getproperty proszę wypisać informację pochodzącą z ziarna Javy.
Ćwiczenie 2 Wykorzystując ziarna Javy proszę wyświetlić informacje pobrane z formularza (np. login i e-mail).
Ćwiczenie 3 Wykorzystując model MVC (Model-View-Controller) i ziarna Javy proszę napisać aplikację umożliwiającą logowanie. Po poprawnym zalogowaniu należy wyświetlić login użytkownika, natomiast w przypadku błędnych danych należy jedynie wyświetlić stosowny komunikat. W tej aplikacji kontrolerem ma być serwlet, widokiem - JSP, natomiast modelem ziarno Javy.
Ćwiczenie 4 Wykorzystując ziarna Javy proszę napisać aplikację umożliwiającą pobieranie adresu e-mail i loginu oraz zapisywanie tych informacji w bazie danych.