Serwlety. Co to jest serwlet? Przykładowy kod serwletu. Po co są serwlety?



Podobne dokumenty
Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 09

Serwlety i JSP na platformie Java EE. Damian Makarow

Piotr Laskowski Krzysztof Stefański. Java Servlets

Java wybrane technologie spotkanie nr 4. Serwlety c.d.

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

1 Wprowadzenie do J2EE

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Aplikacje internetowe i rozproszone - laboratorium

Java wybrane technologie spotkanie nr 3. Serwlety

prepared by: Programowanie WWW Servlety

CGI i serwlety. Plan wykładu. Wykład prowadzi Mikołaj Morzy. Przykład: serwlety vs. szablony. Implementacja logiki prezentacji

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Elementy JEE. 1. Wprowadzenie. 2. Prerekwizyty. 3. Pierwszy servlet. obsługa parametrów żądań 4. JavaServer Pages.

Java EE: Serwlety i filtry serwletów

Architektury Usług Internetowych. Laboratorium 1. Servlety

Serwlety Java: zagadnienia zaawansowane. Data Sources. Data Sources. Przykład pliku data-sources.xml

Wzorce prezentacji internetowych

In»ynieria systemów informacyjnych - Adam Krechowicz

Serwery aplikacji. mgr Radosław Matusik. Wydział Matematyki i Informatyki Uniwersytetu Łódzkiego radmat radmat@math.uni.lodz.

Java Database Connectivity


Serwlety i JSP. Autor: Marek Zawadka deekay@gazeta.pl

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Wprowadzenie do J2EE. Maciej Zakrzewicz.

JavaServer Pages. Konrad Kurdej Karol Strzelecki

Architektury Usług Internetowych. Laboratorium 1 Servlety

Wprowadzenie do JSP. Marcin Apostoluk, Tadeusz Pawlus, Wojciech Walczak. Technologie Biznesu Elektronicznego, 7 marzec 2006

Aplikacje WWW - laboratorium

mgr inż. Michał Paluch

Programowanie w Sieci Internet filtry oraz web.xml. Kraków, 11 stycznia 2013 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Aplikacje WWW - laboratorium

Przegląd technologii JSP

Projektowanie aplikacji J2EE w architekturze Model-View-Controller

Komunikacja między serwletami

Java Enterprise Edition spotkanie nr 3. Serwlety c.d.

prepared by: Programowanie WWW Model-View-Controller

Programowanie w języku Java

Serwery aplikacji. dr Radosław Matusik. radmat

Programowanie w Sieci Internet JSP ciąg dalszy. Kraków, 9 stycznia 2015 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Testowanie aplikacji Java Servlets

TIN Techniki Internetowe Lato 2005

Wybrane działy Informatyki Stosowanej

Aplikacje Internetowe, Servlety, JSP i JDBC

Java wybrane technologie spotkanie nr 5. Java Server Pages

Programowanie obiektowe zastosowanie języka Java SE

Serwery aplikacji. dr Radosław Matusik. radmat

Wstęp Budowa Serwlety JSP Podsumowanie. Tomcat. Kotwasiński. 1 grudnia 2008

Przekazywanie danych. Dane zewnętrzne mogą pochodzić z róŝnych źródeł:

Wywoływanie metod zdalnych

Zaawansowane aplikacje internetowe

Aktywne i dynamiczne strony WWW. Elementy projektowania stron WWW. Część 3. Formularze HTML przykład. Formularze HTML. dr inŝ.

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Bezpieczeństwo frameworków WEBowych Java na przykładzie ataku CSRF

Java w Internecie - czy to ma sens? ;)

Enterprise JavaBeans

PaaS technologie i standardy. Paulina Adamska tiia@pjwstk.edu.pl

Wywoływanie metod zdalnych

b) Jako nazwę projektu wpisz SerwletyJSPJSTL. Nie zmieniaj wartości pozostałych opcji. Kliknij przycisk Next >.

Wybrane działy Informatyki Stosowanej

Analiza porównawcza technologii tworzenia aplikacji internetowych dla baz danych Oracle

JAX-RS czyli REST w Javie. Adam Kędziora

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Ćwiczenie 1. Przygotowanie środowiska JAVA

Nowe mechanizmy w wersji 3 Java Card. Mateusz LESZEK (138775)

Aplikacje WWW - laboratorium

OpenLaszlo. OpenLaszlo

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie komponentowe 5

Wzorce projektowe warstwy aplikacji

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Aplikacje RMI

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Java i XML. Wydanie III

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie rozproszone w języku Java

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Tworzenie aplikacji J2EE w technologii Struts

Remote Method Invocation 17 listopada 2010

Enterprise JavaBeans (EJB)

Komunikator internetowy w C#

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Java Enterprise Edition spotkanie nr 4. Java Server Pages c.d.

Programowanie obiektowe

Java jako j zyk programowania serwerów WWW / aplikacji Webowych servlety

5.14 JSP - Przykład z obiektami sesji Podsumowanie Słownik Zadanie... 86

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII

Przykłady tworzenia aplikacji komponentowych w technologii JavaServer Faces 2.1 na podstawie

Podejście obiektowe do budowy systemów rozproszonych

J2EE wzorce projektowe. Alicja Truszkowska

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Zaawansowane aplikacje internetowe laboratorium

Wybrane działy Informatyki Stosowanej

Aplikacje WWW - laboratorium

Serwery aplikacji. dr Radosław Matusik. radmat

Transkrypt:

Serwlety 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) coś jak aplet: róŝni się miejscem wykonywania oraz dostępnymi bibliotekami 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 Przykładowy kod serwletu import java.io.ioexception; import java.io.printwriter; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; public class SimpleServlet extends HttpServlet { public void doget (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; response.setcontenttype("text/html"); out = response.getwriter(); out.println("<html><head><title>"); out.println("hello world servlet"); out.println("</title></head><body>"); out.println("<h1>" + title + "</H1>"); out.println("<p>this is output from SimpleServlet."); out.println("</body></html>"); out.close(); Po co są serwlety? Zasadniczo: do wyświetlania dynamicznych stron WWW.

przetwarzanie formularzy forwarding wyświetlania wyników zapytań do b. d. (tu zaleca się strony JSP) są częścią J2EE 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 (czyli kod Javy imieszczony w pliku html), 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 Rysunek 1. Warstwy w modelu J2EE (obrazek z J2EE Tutorial)

Rysynek 2. Kontenery w modelu J2EE (obrazek z J2EE Tutorial) Komunikacja z klientem 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. service to tablica rozdzielcza. dane od klienta (przeglądarki) są w obiekcie HttpServletRequest. WaŜne metody obiektu request: o getparameter - zwraca parametr, np. z formularza o getcookies - daje ciasteczka o getsession - podaje obiekt sesji o getreader (dla danych tekstowych) o getinputstream (dla danych binarnych) dane do klienta symbolizuje obiekt HttpServletResponse WaŜne metody obiektu response: o o getwriter (dane tekstowe) getoutputstream (dane binarne) szczegóły i pozostałe metody: javadoc do javax.servlet.http.* Przykład komunikacji z klientem <html> <head><title>formularz</title></head> <body> <form action="/karolb/test" method="post"> Podaj tekst: <input type="text" name="tekst" value=""> </form> </body>

</html> zadziała następujący serwlet: import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; String tekst; response.setcontenttype("text/html"); out = response.getwriter(); out.println("<html><head><title>wyniki z formularza"); out.println("</title></head><body>"); tekst = request.getparameter("tekst"); if (tekst!= null) out.println("z formularza otrzymalem: " + tekst); else out.println("brak danych z formularza"); out.println("</body></html>"); out.close(); public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out; String tekst; response.setcontenttype("text/html"); out = response.getwriter(); out.println("<html><head><title>uwaga</title>"); out.println("</head><body>"); out.println("ten serwlet nie obsluguje metody GET!"); out.println("</body></html>"); out.close(); Wielowątkowość 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. Cykl Ŝycia serwletu na początku system woła metodę init(), w niej moŝna np. połączyć się z bazą danych o jeŝeli coś pójdzie nie tak to naleŝy rzucić wyjątek UnavailableException o 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ć.. Szczegóły w Servlet Tutorial na stronach Sun'a. Utrzymywanie stanu (session tracking) To jedna z najwaŝniejszych zalet serwletów. Nie ma tego w CGI. Schemat: 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) Cechy: Wkładanie i wyjmowanie obiektów z sesji nie ma nic wspólnego z interfejsem serializable. 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(). Gdy serwlet ma wyświetlić link do drugiego serwletu to w metodzie doget() trzeba umieścić: String wartosc = "abc"; out.println("link do drugiego serwletu z parametrem: " +... "<a href=\"" + response.encodeurl("/drugi_serwlet?param=" + wartosc) + "\">" +...);

Takie wywołanie dorzuci do parametrów w adresie identyfikator sesji. Sesje nie są związane z jednym serwletem, róŝne serwlety korzystają z tej samej sesji Przykład uŝycia sesji Wkładanie i wyjmowanie z sesji import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DodajProdukt extends HttpServlet { public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getsession(true); Koszyk koszyk = (Koszyk) session.getattribute("pl.zakupy.koszyk"); if (koszyk == null) { koszyk = new Koszyk(); session.setattribute("pl.zakupy.koszyk", koszyk); koszyk.dodaj(request.getparameter("produkt")); RequestDispatcher dispatcher = getservletcontext().getrequestdispatcher( "/wyswietl_koszyk.jsp"); if (dispatcher!= null) dispatcher.forward(request, response); Uwaga: po modyfikacji koszyka nie trzeba go specjalnie zapisywać do sesji. W skrypcie /wyswietl_koszyk.jsp wyświetlam zawartość koszyka. Ciasteczka (Cookies) Schemat uŝycia: Wysyłanie String wartosc = "byle-co"; 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(); Lepiej jednak uŝywać sesji. Dzielenie zasobów między serwlety (ServletContext) Schemat (podobny do tego przy obsłudze sesji): ServletContext context = getservletcontext(); (czytanie/pisanie) Klasa ref_obiektu1 = new Klasa(); (pisanie) context.setattribute("dluga.nazwa_atr", ref_obiektu1); (pisanie) Klasa ref_obiektu2 = context.getattribute("dluga.nazwa_atr"); (czytanie) Przechowywanie jest podobne do tego związanego z sesjami, ale te same obiekty są dostępne dla wszystkich serwletów na serwerze (w kontenerze). Dlatego trzeba szczególnie uwaŝać na nazwy atrybutów, Ŝeby się nie zdarzyło, Ŝe dwie róŝne apliacje chcą korzystać z tego samego atrybutu. Przykład uŝycia kontekstu public class WyswietlDane extends HttpServlet { public synchronized void init() throws ServletExcpetion { BazaDanych bd = (BazaDanych) getservletcontext().getattribute("pl.sklep.bd.baza"); if (bd == null) { bd = new BazaDanych("http://pulsar", "scott", "tiger"); getservletcontext().setattribute("pl.sklep.bd.baza", bd);...

Inne moŝliwości serwletów ServletDispatcher - umoŝliwia przekierowywanie do innego serwletu (metoda forward, patrz wyŝej) i włączanie wyjścia innego serwletu we własne wyjście (metoda include). filtry - klasa Filter. Filtrów uŝywa się do modyfikowania komunikatów między klientem a docelowym serwletem na serwerze. Filtry moŝna łączyć w łańcuchy. Przykładowe zastosowania filtrów to: autentykacja, szyfrowanie, kompresja. Szczegóły w J2EE Tutorial i JavaDocu. Przykład z J2EE Tutorial: public final class HitCounterFilter implements Filter { private FilterConfig filterconfig = null; public void init(filterconfig filterconfig) throws ServletException { this.filterconfig = filterconfig; public void destroy() { this.filterconfig = null; public void dofilter(servletrequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if (filterconfig == null) return; StringWriter sw = new StringWriter(); PrintWriter writer = new PrintWriter(sw); Counter counter = (Counter)filterConfig. getservletcontext(). getattribute("hitcounter"); writer.println(); writer.println("==============="); writer.println("the number of hits is: " + counter.inccounter()); writer.println("==============="); // Log the resulting string writer.flush(); filterconfig.getservletcontext(). log(sw.getbuffer().tostring());... chain.dofilter(request, wrapper);... Instalowanie serwletów na Tomcat'cie Najpierw trzeba zainstalować Tomcata. Tomcat to serwer http napisany w Javie przez Apache Software Group. MoŜe działać jako samodzielny serwer (domyślnie na porcie 8080) lub zintegrować się z Apachem. Kompilacja serwletu: javac -classpath $TOMCAT_HOME/lib/servlet.jar Test.java

Plik Test.class ma trafić do katalogu $TOMCAT_HOME/webapps/test_kat/WEB- INF/classes Trzeba utworzyć plik $TOMCAT_HOME/webapps/test_kat/WEB-INF/web.xml, o treści: <?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"> <web-app> <servlet> <servlet-name> test_serw </servlet-name> <servlet-class> Test </servlet-class> </servlet> <servlet-mapping> <servlet-name> test_serw </servlet-name> <url-pattern> /test </url-pattern> </servlet-mapping> </web-app> Jak widać najpierw nazwa serwletu (test_serw) jest wiązana z klasą (Test.class), a potem nazwa serwletu jest przypisywana do ścieŝki (w obrębie kontekstu). Do pliku $TOMCAT_HOME/conf/server.xml trzeba dopisać: <Context path="/test_kat" docbase="webapps/test_kat" reloadable="true"/> wewnątrz znacznika <ContextManager>. W tym pliku określa się jak z zewnątrz adresować dany kontekst, tu kontekst z katalogu webapps/test_kat będzie widziany jako katalog test_kat. Teraz moŝna do serwletu odwoływać się poprzez localhost:8080/test_kat/test.