Serwlety i JSP na platformie Java EE Damian Makarow Przebieg prezentacji Serwlety Serwlety a aplikacje Java EE Sesje Ciasteczka JSP Cykl życia Znaczniki Scope JSTL Serwlety+JSP Serwlety i JSP na platformie Java EE 2 Serwlety Wprowadzenie Serwlety i JSP na platformie Java EE 3 Co to jest serwlet? kawałek kodu w Javie po stronie serwera HTTP rozszerza możliwośći serwera CGI, w Javie, wzbogacone o biblioteki ułatwiające życie programiście (np. utrzymywanie sesji, wpólne zasoby serwletów, ciasteczka, obsługa GET/POST/PUT) serwlety mogą korzystać ze standardowych klas Javy (z VM), klas wchodzących w skład Servlet API: javax.servlet.* i javax.servlet.http.* oraz ewentualnie z dodatkowych bibliotek zainstalowanych na serwerze. serwlety nie mają interfejsu użytkownika, komunikują się z przeglądarką (za pośrednictwem serwera WWW wspierającego serwlety) za pomocą protokołu HTTP Serwlety i JSP na platformie Java EE 4 Do czego służy serwlet? Do wyświetlania dynamicznych stron WWW (alternatywa do popularnego PHP) przetwarzanie formularzy forwarding wyświetlania wyników zapytań do b. d. (tu zaleca się strony JSP) Serwlety i JSP na platformie Java EE 5 Serwlety Miejsce serwletów w aplikacjach J2EE Serwlety i JSP na platformie Java EE 6 Miejsce serwletów w aplikacjach J2EE serwlety to rozszerzenie serwera WWW blisko interfejsu użytkownika: zorientowane na żądanie/odpowiedź (request/response) serwlety działają w odpowiedzi na żadania klienta są interfejsem do serwera aplikacyjnego/bazy danych/EJB pełnią rolę kontrolera w schemacie Model-View-Controller, za widok odpowiedzialne są strony JSP, model to EJB w serwletach zaleca się umieszczanie tylko lekkich funkji biznesowych, ale w małych aplikacjach cała logika może być w serwletach i JSP Serwlety i JSP na platformie Java EE 7 Model J2EE Serwlety i JSP na platformie Java EE 8 Kontenery w modelu J2EE Serwlety i JSP na platformie Java EE 9 Komunikacja z serwerem przedefiniowanie metod doGet, doPost, doPut, doDelete. Te metody są wywoływane przez metodę service zdefiniowaną w Servlet przy każdym żądaniu do serwera dotyczącym serwletu. dane od klienta (przeglądarki) są w obiekcie HttpServletRequest. dane do klienta symbolizuje obiekt HttpServletResponse Serwlety i JSP na platformie Java EE 10 Ważne metody obiektu request: getParameter - zwraca parametr, np. z formularza getCookies - daje ciasteczka getSession - podaje obiekt sesji getReader (dla danych tekstowych) getInputStream (dla danych binarnych) Serwlety i JSP na platformie Java EE 11 Ważne metody obiektu response: getWriter (dane tekstowe) getOutputStream (dane binarne) Serwlety i JSP na platformie Java EE 12 Serwlet Java Serwlet musi: dziedziczyć po klasie HttpServlet obsługiwać jedną z metod: doGet(HttpServletRequest request, HttpServletResponse response) doPost(HttpServletRequest request, HttpServletResponse response) opcjonalnie (wywoływane tylko raz!): public void init(ServletConfig config) public void destroy() Serwlety i JSP na platformie Java EE 13 Serwlety Cykl życia serwletu Serwlety i JSP na platformie Java EE 14 Cykl życia serwletu init() doGet/doPost() destroy() Serwlety i JSP na platformie Java EE 15 Cykl życia serwletu Cykl życia serwletu Java przebiega według następujących kroków: 1. Klient HTTP przekazuje żądanie HTTP do serwera HTTP. Żądanie jest kierowane do serwera aplikacji Java EE. 2. Serwer aplikacji analizuje adres URL żądania HTTP, pobiera z dysku klasę wskazanego serwletu i tworzy jej obiekt (tzw. obiekt serwletu). 3. Serwer aplikacji wywołuje metodę init() obiektu serwletu. 4. Serwer aplikacji wywołuje metodę doGet() obiektu serwletu. Dokument będący wynikiem działania metody doGet() jest przekazywany klientowi HTTP. Obsługa żądania została zakończona. Serwlety i JSP na platformie Java EE 16 Cykl życia serwletu na początku system woła metodę init(), w niej można np. połączyć się z bazą danych jeżeli coś pójdzie nie tak to należy rzucić wyjątek UnavailableException można wołać metodę getInitParameter, interpretowaną przez serwer (kontener), np. jako init-param z pliku web.xml w Tomcat'cie. W takim parametrze może być zapisany np. URL do bazy danych. gdy serwer zdecyduje wyrzucić serwlet z pamięci to wywołuje metodę destroy. Uwaga! Jeżeli metoda do[Get|Post] wykonuje się długo, to trzeba zadbać o jej zakończenie. Jeżeli serwlet uruchamiał wątki, to też trzeba je przerwać. Serwlety i JSP na platformie Java EE 17 Wzmianka o wielowątkowości Serwlety wykonują się w środowisku wielowątkowym, więc może się zdarzyć, że wiele kopii serwletu będzie działać naraz. A może być tak, że będzie jedna instancja serwletu, ale wiele wątków wykonujących metodę service. Jeżeli w serwlecie jest odwołanie do zasobu, który wymaga wyłączności to: trzeba zapewnić wykluczanie ręcznie, np. używając zmiennych/metod synchronized zadeklarować, że serwlet implementuje interfejs SingleThreadModel, wtedy serwer uruchomi jednocześnie tylko jedną instancję metody service, np. public class ReceiptServlet extends HttpServlet implements SingleThreadModel. Ten interfejs nie zawiera żadnych metod, jest tylko znacznikiem dla kontenera. Serwlety i JSP na platformie Java EE 18 Serwlety Sesje i ciasteczka Serwlety i JSP na platformie Java EE 19 Utrzymywanie stanu (session tracking) To jedna z najważniejszych zalet serwletów. Nie ma tego w CGI. Cechy: Obiekty nie są nigdzie składowane, tylko istnieją w pamięci kontenera. Metody operują na referencjach. Po odczytaniu referencji metodą getAttribute operujemy już na oryginalnym (jedynym!) obiekcie. Po odczytaniu atrybutu trzeba sprawdzić czy jest równy null, jeżeli tak to trzeba utworzyć nowy obiekt (uwaga na wielowątkowość). Sesje działają standardowo na ciasteczkach. W ciasteczku jest tylko id sesji, reszta siedzi w pamięci kontenera. Jeżeli przeglądarka nie obsługuje ciasteczek to trzeba używać metody encodeURL(). Sesje nie są związane z jednym serwletem, różne serwlety korzystają z tej samej sesji Serwlety i JSP na platformie Java EE 20 Sesje Problem: protokół HTTP jest bezstanowy Emulacja sesji Każda sesja otrzymuje identyfikator Stan sesji przechowywany przez serwer aplikacji Stan sesji usuwany po wygaśnięciu czasu ważności Serwlety i JSP na platformie Java EE 21 Sesje przykład HttpSession session = request.getSession(true); (czytanie/pisanie) Klasa ref_obiektu1 = new Klasa(); (pisanie) session.putAttribute("dluga.nazwa_atr", ref_obiektu1); (pisanie) Klasa ref_obiektu2 = (Klasa) session.getAttribute("dluga.nazwa_atr"); (czytanie) Serwlety i JSP na platformie Java EE 22 Ciasteczka Zmienne Cookies reprezentowane w postaci obiektów klasy Cookie Wysyłanie zmiennych Cookies: response.addCookie() Odczyt zmiennych Cookies: request.getCookies() Serwlety i JSP na platformie Java EE 23 Ciasteczka Wysyłanie String wartosc = „wartosc"; Cookie ciacho = new Cookie("Nazwa", wartosc); response.addCookie(ciacho); Odbieranie Cookie[] cookies = request.getCookies(); String wartosc; for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("Nazwa")) wartosc = thisCookie.getValue(); } Serwlety i JSP na platformie Java EE 24 HTTPSession czy Cookies? Oba mechanizmy pozwalają przechowywać stan sesji Cookies wymaga przesyłania obiektów stanu w nagłówkach HTTP HTTPSession obsługuje dowolne typy obiektów stanu Bezpieczeństwo Serwlety i JSP na platformie Java EE 25 Java Server Pages Wprowadzenie Serwlety i JSP na platformie Java EE 26 Co to jest JSP? Technologia Java Server Pages (JSP) to technologia szablonów umożliwiających łatwe łączenie statycznego kodu HTML lub XML z dynamiczną zawartościągenerowaną przez kod Java. Rozszerzenie technologii serwletów umożliwia osadzanie kodu Javy w dokumencie html Podstawowe narzędzie tworzenia warstwy prezentacji w architekturze Java EE Skryptlet- kod osadzony w dokumencie html za pomocą znaczników jsp Serwlety i JSP na platformie Java EE 27 JSP-Cykl życia jspInit() załadowanie zasobów _jspService() Przetwarzanie żądań jspDestroy() Zwolnienie zasobów Serwlety i JSP na platformie Java EE 28 Java Server Pages Znaczniki i ich zastosowanie Serwlety i JSP na platformie Java EE 29 Dyrektywy Kontrolują sposób translacji JSP do serwletu Dyrektywy umieszczone są w znacznikach <%@%> Dostępne są trzy dyrektywy: <%@ include %>: włączenie zewnętrznego pliku <%@ page %>: ustawienia strony <%@ taglib %>: wskazanie na bibliotekę znaczników <%@page contentType="text/html" pageEncoding="UTF-8"%> Serwlety i JSP na platformie Java EE 30 Deklaracje Pozwalają na deklarowanie metod i składowych serwletu wynikowego Mogą zawierać inicjalizację Wprowadzane przez znaczniki <%! %> <%! int licznik = 0; %> <%! int a, b, c; %> <%! Array mojaTablica = new Array(); %> Serwlety i JSP na platformie Java EE 31 Wyrażenia Znaczniki XML umożliwiające wartościowanie wyrażenia Wartość konwertowana do łańcucha znaków i włączana do wynikowego kodu HTML lub XML Wprowadzane przez znaczniki <%= %> <%! Calendar today = new GregorianCalendar(); %> <P>Dzisiejsza data to <%= today.get(Calendar.DAY_OF_MONTH) %>, <%= today.get(Calendar.MONTH) %>, roku <%= today.get(Calendar.YEAR) %> </p> Serwlety i JSP na platformie Java EE 32 Skryptlety Znaczniki XML umożliwiające osadzanie kodu Java Mogą generować kod HTML lub XML za pomocą predefiniowanego obiektu out Wprowadzane przez znaczniki <% %> <% Calendar dzis = new GregorianCalendar(); int godzina = dzis.get(Calendar.HOUR_OF_DAY); out.println("<B>jest godzina " + godzina + "</B>"); %> Serwlety i JSP na platformie Java EE 33 Znaczniki jsp - akcje Znaczniki XML wywołujące akcje serwera aplikacji Dostępne akcje <jsp:include>: włączenie zewnętrznego kodu <jsp:forward>: przekazanie sterowania <jsp:param>: zdefiniowanie parametru <jsp:plugin>: obsługa apletów Java <jsp:fallback>: gdy klient nie obsługuje apletów i znaczniki do obsługi komponentów JavaBean Serwlety i JSP na platformie Java EE 34 Strona JSP a dokument JSP Strony JSP nie są poprawnymi dokumentami XML Standard JSP 1.2 wprowadza tzw. dokumenty JSP znacznik <jsp:root xmlns:jsp=adres> skryptlety, deklaracje i wyrażenia posiadająodpowiadające im znaczniki XML: <jsp:directive> <jsp:declaration> <jsp:expression> <jsp:scriptlet> <jsp:text> Serwlety i JSP na platformie Java EE 35 Java Server Pages Scope-zasięg obiektów Serwlety i JSP na platformie Java EE 36 Scope scope - zasięg zmiennych przekazywanych między kolejnymi cyklami request-response page, request, session, application Serwlety i JSP na platformie Java EE 37 Scope-omówienie Page Podstawowy, domyślny scope. Oznacza, że obiekt z nim powiązany będzie istniał tylko w obrębie danej instancji strony Request Obiekt istnieje w obrębie jednego zapytania. Jedno zapytanie może być obsługiwane przez wiele stron Session Obiekt istnieje w obrębie całej sesji i jest dostępny z poziomu różnych stron Application Scope globalny dla całej aplikacji Serwlety i JSP na platformie Java EE 38 Java Server Pages JSTL kilka słów o standardzie Serwlety i JSP na platformie Java EE 39 JSTL-co to jest? JSTL (Java Standard Tag Library) to standardowa biblioteka znacznikow Javy ulatwajaca pisanie stron JSP, tj. sprawiajaca ze strona JSP staje się „bardziej czysta” Korzystajac z JSTL-a bardzo czesto korzystamy rownież z Jezyka Wyrazeń (EL - Expression Language), który to wraz z szablonami był swego czasu alternatywą dla technologii JSP. Serwlety i JSP na platformie Java EE 40 JSTL - znaczniki Podstawowe <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> Formatujące <%@ taglib prefix="fmt“ uri="http://java.sun.com/jsp/jstl/fmt" %> XML <%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %> SQL <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> Funkcje <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> Serwlety i JSP na platformie Java EE 41 Serwlet + JSP Zastosowanie Serwlety i JSP na platformie Java EE 42 MVC – Model View Controller Serwlety i JSP na platformie Java EE 43 MVC przebieg cyklu request-response Przeglądarka wysyła żądanie. Aplikacja jest tak skonfigurowana, że każde żądanie jest kierowane do serwletu – kontrolera. 2. Serwlet – kontroler analizuje żądanie i tworzy wymagane przez żądany widok obiekty klas zewnętrznych. Interakcja kontrolera z modelem może pociągać za sobą interakcję z bazą danych. 3. Serwlet przekazuje sterowanie do odpowiedniego widoku strony JSP. 4. JSP pobiera dane z obiektów modelu przygotowanych przez kontroler. Obiekty te mogą udostępniać dane pobrane z bazy danych. 5. JSP generuje wynikowy dokument HTML przesyłany do przeglądarki. 1. Serwlety i JSP na platformie Java EE 44 Zalety Ogromną zaletą tego podejścia jest wykorzystanie mocnych stron każdej z technologii i uniknięcie ich słabości. W JSP niewygodne jest pisanie bardziej skomplikowanych programów, ale za to łatwo jest generować kod strony. Z kolei w serwletach jest na odwrót. Serwlety i JSP na platformie Java EE 45 Przydatne linki http://docs.oracle.com/javaee/ http://tomcat.apache.org/tomcat-4.0-doc/servletapi/ http://www.tutorialspoint.com/jsp/jsp_standard_tag_li brary.htm Serwlety i JSP na platformie Java EE 46 Dziękuję za uwagę Serwlety i JSP na platformie Java EE 47