laboratorium 1
Transkrypt
laboratorium 1
AUI Laboratorium 1. Architektury Usług Internetowych Laboratorium 1. Servlety Wstęp Celem laboratorium jest zapoznanie się z modelem klient-serwer (żądanie-odpowiedź) 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 wykonywanie 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 Minimum Java Version 3.0/2.2 7.0.x 7.0.30 1.6 2.5/2.1 6.0.x 6.0.35 1.5 2.4/2.0 5.5.x 5.5.35 1.4 Integracja z NetBeans IDE Najnowsza wersja NetBeans IDE (7.2) może być zainstalowana już z zintegrowanym Apache Tomcat 7.0.27. 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 exists”. © 2010 - 2012 Michał Wójcik 1 AUI Laboratorium 1. Przygotowanie projektu Aby przygotować aplikację webową w środowisku NetBeans jako typ nowego projektu należy wybrać Java Web/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. Resztę ustawień można pozostawić bez zmian. Ustawienia dotyczące serwera można później modyfikować we właściwościach projekt w zakładce run. Struktura stworzonego projektu jest następująca: • 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; • Source Packages – źródła projektu, • Libraries – wszystkie dodatkowe biblioteki: ◦ Apache Tomcat – biblioteki serwera na którym będzie uruchamiana aplikacja, zawierają również standardowe biblioteki dla Java web. Struktura serwletu public class Repository extends HttpServlet { @Override public void init() throws ServletException { super.init(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // } } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // } Podstawowe metody serwletu: • init – inicjalizacja serwletu, wywoływana przy jego pierwszym uruchomieniu, © 2010 - 2012 Michał Wójcik 2 AUI Laboratorium 1. • 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. Sesja 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. Wysyłanie żądania do serwletu Przykładowe wywołanie serwletu za pomocą formularza html: <form action="adres_serwletu"> <input type="text" name="param1" /> <input type="text" name="param2" /> <input type="submit" value="send" /> </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 getParameter(). Konfiguracja Dla wersji 3.0 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="Repository", urlPatterns="/Repository") public class Repository extends HttpServlet { } Parametry name i urlPatterns określają kolejno nazwę serwleta oraz adresy pod którymi jest on dostępny. © 2010 - 2012 Michał Wójcik 3 AUI Laboratorium 1. Dla wersji 2.5 i 2.4 Serwlet należy zdefiniować w pliku WEB-INF/web.xml poprzez wpis: <servlet> <servlet-name>Repository</servlet-name> <servlet-class>pl.gda.pg.eti.kask.aui.servlets.Repository</servlet-class> </servlet> <servlet-mapping> <servlet-name>Repository</servlet-name> <url-pattern>/Repository</url-pattern> </servlet-mapping> Sekcja <servlet> określa klasę i nazwę serwletu, natomiast <servlet-mapping> określa adres pod, którym będzie znajdował się serwlet. Dla wersji … Przykład Przykład pozwala użytkownikom na zapisywanie notatek na czas trwania sesji oraz usunięcie wszystkich notatek (usunięcie sesji). W ramach laboratorium można wykorzystać gotowy projekt NetBeans dołączony do instrukcji. form.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> </head> <body> <form action="Repository" method="POST"> <input type="hidden" name="action" value="add" /><br /> id:<input type="text" name="id" /><br /> content:<input type="text" name="content" /><br /> <input type="submit" value="add note" /> </form> <form action="Repository" method="POST"> <input type="hidden" name="action" value="clean" /><br /> <input type="submit" value="delete" /> </form> <form action="Repository" method="GET"> <input type="hidden" name="action" value="display" /><br /> <input type="submit" value="display" /> </form> </body> </html> © 2010 - 2012 Michał Wójcik 4 AUI Laboratorium 1. Trzy formularze pozwalające na działanie na notatkach. Dodawanie pojedynczej notatki, usunięcie wszystkich notatek oraz wyświetlenie notatek. Każdy z formularzy ma ten sam parametr action określający akcję, którą powinien wykonać serwlet oraz dodatkowe parametry jeśli potrzebne. Notes.java: public class Notes implements Serializable { private Map<Integer,String> notes; public Notes() { this.notes = new HashMap<Integer,String>(); } public Map<Integer, String> getNotes() { return notes; } } public void setNotes(Map<Integer, String> notes) { this.notes = notes; } Repository.java: protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); try { String action = request.getParameter("action"); if (action == null) { } } else if (action.equals("clean")) { request.getSession().invalidate(); out.write(display(request.getSession())); } else if (action.equals("display")) { out.write(display(request.getSession())); } else if (action.equals("add")) { int id = Integer.parseInt(request.getParameter("id")); String content = request.getParameter("content"); add(request.getSession(), id, content); out.write(display(request.getSession())); } } finally { out.close(); } © 2010 - 2012 Michał Wójcik 5 AUI Laboratorium 1. Główna metoda serwletu (wywoływana przez metody doPost i doGet) realizująca określone akcje w zależności od wartości parametry action. Wynik zostaje wysłany na wyjście odpowiedzi i zostaje wyświetlona w przeglądarce. © 2010 - 2012 Michał Wójcik 6