laboratorium 1
Transkrypt
laboratorium 1
AUI – laboratorium Laboratorium 1 Architektury usług internetowych Laboratorium 1. Serwlety Wstęp Celem laboratorium jest zapoznanie się z modelem klient-serwer (żądanie-odpowiedź) na przykładzie serwletów. 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, • 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, © 2010 Michał Wójcik 1 AUI – laboratorium • Laboratorium 1 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 input definiują nazwy za pomocą, których będzie można pobrać z obiektu żądania za pomocą metody getParameter(). Konfiguracja Serwlet należy zdefiniować w pliku WEB-INF/web.xml poprzez wpis: <servlet> <servlet-name>Repository</servlet-name> <servlet-class>aui.servlet.RepositoryServlet</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. © 2010 Michał Wójcik 2 AUI – laboratorium Laboratorium 1 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ć gotową aplikację znajdującą się w Apache Tomcat, servlets-examples. • Katalog aui należy umieścić w katalogu servlets-examples/WEB-INF/classes/. • Klasy należy skompilować z katalogu WEB-INF/classes poleceniem: ◦ javac -cp servlet-api.jar aui/servlet/Notes.java ◦ javac -cp servlet-api.jar aui/servlet/RepositoryServlet.java • Należy zmodyfikować plik web.xml według wzoru podanego w sekcji konfiguracja. • Plik form.html należy skopiować do servlets-examples/. • Testowanie: https://localhost:8080/servlet-examples/form.html. 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="http://localhost:8080/servlets-examples/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="http://localhost:8080/servlets-examples/Repository" method="POST"> <input type="hidden" name="action" value="clean" /><br /> <input type="submit" value="delete" /> </form> <form action="http://localhost:8080/servlets-examples/Repository" method="GET"> <input type="hidden" name="action" value="display" /><br /> <input type="submit" value="display" /> </form> </body> </html> 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>(); } © 2010 Michał Wójcik 3 AUI – laboratorium Laboratorium 1 public Map<Integer, String> getNotes() { return notes; } public void setNotes(Map<Integer, String> notes) { this.notes = notes; } } RepositoryServlet.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(); } } 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 Michał Wójcik 4