Architektury Usług Internetowych Laboratorium 1 Servlety Wstęp Celem laboratorium jest zapoznanie się z modelem klient-serwer (żądanieodpowiedź) na przykładzie serwletów. Kontener webowy Kontener webowy (kontener sevletu) jest to komponent serwera webowego zajmujący się interakcją z servletami i potencjalnie stronami JSP (dynamiczne strony tłumaczone i wykonywane jako servlety). Istnieje kilka kontenerów webowych, gdzie do najpopularniejszych należą: Apache Tomcat http:tomcat.apache.org/, Jetty http:jetty.codehaus.org/jetty/. Na zajęciach wykorzystywany będzie serwer Apache Tomcat, który ze względu na kompatybilność dostępny jest w trzech utrzymywanych wersjach: Servlet/JSP Spec Apache Tomcat version Actual release revision 3.1/2.3 8.0.x 8.0.14 1.7 3.0/2.2 7.0.x 7.0.56 1.6 2.5/2.1 6.0.x 6.0.41 1.5 Integracja z NetBeans IDE Minimum Java Version Najnowsza wersja NetBeans IDE (8.0.1) może być zainstalowana już z zintegrowanym Apache Tomcat 8.0.9. Ponadto każdy z powyżej wymienionych wersji może być ręcznie zintegrowana z IDE. Zarządzanie serwerami odbywa się poprzez zakładkę services w zakładce servers. Można stamtąd dodawać/usuwać oraz uruchamiać/zatrzymywać serwery. W przypadku dodawania nowego serwera należy wybrać typ serwera Apache Tomcat i nadać mu odpowiednią nazwę. Następnie należy podać katalog gdzie zostały rozpakowane pliki serwera oraz nazwę użytkownika i hasło (np. netbeans/netbeans) pamiętając o zaznaczeniu pola Create user if does not exist. 2010-2014 Michał Wójcik 1
Przygotowanie projektu Aby przygotować aplikację webową w środowisku NetBeans jako typ nowego projektu należy wybrać Maven/Web application. Po określeniu nazwy i lokalizacji projekty należy wybrać serwer na którym będzie uruchamiany oraz obowiązującą wersję Java EE (Java EE 7 Web). Resztę ustawień można pozostawić bez zmian. Ustawienia dotyczące serwera można później modyfikować we właściwościach projektu w zakładce run. Struktura stworzonego projektu jest następująca (niektóre pozycje mogą nie występować w nowo stworzonym projekcie): Web Pages strony HTML aplikacji: META INF: contex.xml deskryptor konfiguracji aplikacji specyficzny dla serwera Apache Tomcat; WEB INF: web.xml standardowy deskryptor aplikacji webowej; Remote Files zdalne pliki, do których odwołania pojawiaja się na stronach HTML, Source Packages źródła projektu, Other sources niekompilowalne źródła projektu (np. pliki properties): src/main/resources zasoby: META INF; Dependencies zależności projektu, zewnętrzne biblioteki: javaee web api 7.0.jar biblioteka zawierająca interfejsy i klasy zdefiniowane w standardzie Java EE; Java Dependencies środowisko uruchomieniowe, Project Files pliki konfiguracyjne: pom.xml plik konfiguracyjny nardzędzia budowania projektu Apache Maven. Struktura serwletu public class MyServlet extends HttpServlet { @Override protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { 2010-2014 Michał Wójcik 2
@Override protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { Podstawowe metody serwletu: doget obsługa żądań GET, dopost obsługa żądań POST. Parametry żądania i odpowiedzi: HttpServletRequest dostarcza informacje na temat żądania: String getparameter(string name) zwraca wartość parametru żądania, HttpServletResponse dostarcza informacje na temat odpowiedzi. Zasięg sesji W ramach aplikacji webowej, można umieszczać obiekty w zasięgu sesji. Takie obieky będą dostępne z poziomu rządań wysyłanych w ramach jednej sesji użytkownika. Z poziomu servletu sesja jest obiektem klasy HttpSession. Może zostać pobrana np. poprzez wywołanie odpowiedniej metody na obiekcie żądania: request.getsession(). Podstawowe operacje na obiekcie sesji: Object getattribute(string name) pobranie obiektu z sesji, void setattribute(string name, Object obj) dodanie obiektu do sesji, void invalidate() - zniszczenie obiektu sesji, void removeattribute(string name) usunięcie obiektu z sesji. Zasięg aplikacji W ramach aplikacji webowej, można umieszczać obiektu w zasięgu aplikacji. Takie obiekty będą dostępne z poziomu dowolnego żądania. 2010-2014 Michał Wójcik 3
Z poziomu servletu zasięg aplikacji jest obiektem klasy ServletContext. Może zostać pobrany np. Poprzez wywołanie odpowiedniej metody servletu: getservletcontext(). Podstawowe operacje na obiekcie kontekstu: Object getattribute(string name) pobranie obiektu z zasięgu aplikacji, void setattribute(string name, Object obj) dodanie obiektu do zasięgu aplikacji, void removeattribute(string name) usunięcie obiektu z zasiegu aplikacji. Konfiguracja Dla wersji 3.0 i 3.1 Serwlet można zdefiniować poprzez adnotację WebServlet na klasie implementującej dziedziczącej po HttpServlet. Sposoby konfiguracji z poprzednich wersji są nadal dostępne. @WebServlet(name="MyServlet", urlpatterns="/myservlet") public class MyServlet extends HttpServlet { Parametry name i urlpatterns określają kolejno nazwę serwleta oraz adresy pod którymi jest on dostępny. Dla wersji 2.5 Serwlet należy zdefiniować w pliku WEB INF/web.xml poprzez wpis: <servlet> <servlet name>myservlet</servlet name> <servlet class>myservlet</servlet class> </servlet> <servlet mapping> <servlet name>myservlet</servlet name> <url pattern>/myservlet</url pattern> </servlet mapping> Sekcja <servlet> określa klasę i nazwę serwletu, natomiast <servletmapping> określa adres pod, którym będzie znajdował się serwlet. Wysyłanie żądania do serwletu Przykładowe wywołanie serwletu za pomocą formularza HTML: 2010-2014 Michał Wójcik 4
<form action="myservlet" method="post"> <input type="text" name="nazwa" value="wartosc"/> <input type="submit" value="wyslij"/> </form> Wartości name dla kolejnych elementów w input definiują nazwy za pomocą, których będzie można pobrać z obiektu żądania za pomocą metody request.getparameter(). Przykładowe wywołanie serwletu za pomocą JavaScript + jquery: <script> $.getjson('myservlet', {'nazwa': 'wartosc', function (data) { </script> Wartości w tablicy będącej drugim argumentem funkcji getjson będzie mozna pobrać z obiektu żądania za pomocą metody request.getparameter(). Elementy przykładu Strony HTML: index.html po prostu index, list_books.html wyświetlanie biblioteki i książek oznaczonych do przeczytania, edit_book.html edycja istniejącej lub nowej ksiązki. Klasy: BooksContext obiekt przechowujący ksiązki, pozwalający na ich wyszukiwanie i zapisywanie, powinien być umieszczony w zasięgu aplikacji, Book reprezentacja ksiązki, ServletListener logowanie zdarzeń związanych z kontenerem servletu, CoverServlet servlet generujący okładki książek, BookServlet sevlet zarządzający książkami odpowiadajacy na żądania wysłane z formularza, BookAjaxServlet servlet zarządzający książkami odpowiadający na żądania wysłane przez JavaScript. 2010-2014 Michał Wójcik 5
Przykład pozwala na wyświetlanie listy książek wraz z ich okładkami zapisanymi w zasięgu całej aplikacji (w beanie BooksContext). Zapisane książek w zasięgu aplikacji powoduje że wszelkie zmiany na liście książek (dodanie nowej lub edycja istniejącej) będą widoczne w ramach wszystkich aktywnych i nowych sesji użytkownika. Strona index.html zawiera jedynie odnośnik przekierowujący do strony list_books.html zawierającą listę książek. Strona list_books.html wyświetla dwie tabelki (lista wszystkich książek i lista książek oznaczonych do przeczytania). Zawartość strony jest ściągana z servletu BookAjaxServlet (dostępnego pod adresem books/ajax) i wrzucana do dynamicznie stworzonych tabel za pomocą kodu JavaScript. Dla każdej książki wyświetlany jest jej opis, okładka (pobierana z servletu CoverServlet dostępnego pod adresem cover) oraz przyciski pozwalające na edycja oraz oznaczenie książki do przeczytania. Do przycisku oznaczającego książkę podpięta jest asynchroniczna akcja wysyłana do sevletu BookAjaxServlet i aktualizująca drzewo komponentów. Przycisk edycji przenosi na stronę edit_book.html przekazując w parametrze adresu identyfikator książki do edycji. Strona edit_book.html pozwala na edycję istniejącej lub dodanie nowej książki. Dane wprowadzone przez użytkownika są wysyłane do servletu BookServlet (dostępnego pod adresem books) za pomocą zwykłego formularza. W przypadku edycji istniejącej książki, jej szczegóły są pobierane asynchronicznie zaraz po załadowaniu strony za pomocą kodu JavaScript z servletu BookAjaxServlet. Książki oznaczone do przeczytania są zapisywane w sesji w obiekcie ArrayList stworzonym w servlecie BookAjaxServlet. Należy pamiętać że obiekty przechowywane w zasięgu aplikacji i sesji powinny być serializowalne (powinny implementować interfejs Serializable). Przykładowe zadania W ramach laboratorium należy skonfigurować środowisko (Apache Tomcat) oraz uruchomić na nim przykładową aplikację. Następnie należy wprowadzić modyfikację wybraną przez prowadzącego. Modyfikacje mogą dotyczyć dodania obsługi nowej komendy do servletu (wraz odpowiednimi wywołaniami z poziomu JavaScript lub HTML), zmiany lub dodanie obiektów przechowywanych w zasięgu sesji lub aplikacji oraz zmiany istniejących funkcjonalności servletów (np. przez zmianę parametrów przez nie obsługiwanych). Po oddaniu zadania należy usunąć wszystkie swoje zmiany (ręcznie zainstalowany server Apache Tomcat lub stworzony prywatny katalog instancji serwera oraz projekt). 2010-2014 Michał Wójcik 6