JavaServer Pages
Transkrypt
JavaServer Pages
Kurs WWW 1 Paweł Rajba [email protected] http://pawel.ii.uni.wroc.pl/ 1 Na podstawie: Hougland, D. i Tavistock A., JSP. Tworzenie stron WWW, RM, Warszawa 2002 Wprowadzenie Technologia po stronie serwera Strony JSP są kompilowane JSP to specyfikacja, a nie produkt – jest kilka implementacji (Tomcat, ...) Jest to jeden z elementów J2EE, czyli jest dostępne wiele elementów z Javy Bezpieczeństwo gwarantowane przez silny system typów Obsługa wyjątków Tomcat Jedna z implementacji JSP, projekt apache.org Struktura katalogów /bin /conf pliki konfiguracyjne (najważniejszy: server.xml) /logs programy i skrypty (.sh lub .bat) pliki dziennika /webapps, /webapps/ROOT aplikacje, domyślna lokalizacja Składnia typu JSP (rekomendowana) <% skrypt %> typu XML <jsp:element >skrypt</jsp:element> Elementy w JSP Wyróżniamy trzy typy elementów Elementy skryptowe Elementy akcji fragmenty kodu w Javie, które generuja kod HTML, XHTML, itd. predefiniowane funkcje; specyfikacja JSP zawiera kilka takich funkcji, a dzięki specyfikacji JSP 1.1 można tworzyć własne znaczniki Dyrektywy określają informacje dodatkową, ogólną, dotyczacą całej strony Elementy skryptowe Elementy skryptletu Składnia <% kod %> <jsp:scriptlet>kod</jsp:scriptlet> Przykład data.jsp Elementy wyrażenia Składnia <%= kod %> <jsp:expression>kod</jsp:expression> Przykład data2.jsp Elementy skryptowe Elementy deklaracji Uwagi: Składnia Elementy deklaracji nie generują żadnych napisów Zmienne i metody utworzone w elemencie deklaracji są globalne <%! kod %> <jsp:declaration>kod</jsp:declaration> Przykład data3.jsp Elementy skryptowe Sterowanie przepływem Instrukcje jak w Javie: if..then..else, while..do, for, try..catch Można ,,wyskakiwać'' z kodu JSP Przykład: dnitygodnia.jsp Komentarze wewnątrz kodu: // ... /* ... */ zewnętrzne: <%-- ... --%> <!-- ... --> Elementy akcji Składnia <jsp:nazwa_akcji atrybut="wartosc" /> Atrybuty: Dla wszystkich elementów akcji dostępne są dwa atrybuty: id – jednoznacznie identyfikuje elementy akcji, a w przypadku, gdy taki element tworzy obiekt, to poprzez id można sie do niego później odwoływać scope – określa czas życia elementu akcji. Moze on przyjmowac nastepujace wartosci: Elementy akcji Atrybuty c.d. scope page – obiekty o tym zasiegu sa dostępne jako część strony i są usuwane po wysłaniu odpowiedzi do klienta lub po przekierowaniu, request – obiekty o tym zasięgu są dostępne ze stron przetwarzających to samo żądanie; podobne do page, ale obiekt bedzie dalej dostepny po przekazaniu żądania do innej strony JSP session – obiekty o tym zasięgu będą dostępne ze stron przetwarzających żądania w takiej samej sesji jak ta, w której zostały utworzone application – obiekty będą dostępne ze stron przetwarzających żądania z tej samej aplikacji jak ta, w której zostały utworzone Elementy akcji Standardowe akcje Zasobów include – dołącza plik forward – przekierowuje do nowej lokalizacji plugin – wstawia na stronę komponent Javy JavaBeans Elementy akcji Akcja include Składnia <jsp:include page="adres" flush="true" /> <jsp:include page="adres" flush="true"> <jsp:param name="param" value="wartosc" /> ... </jsp:include> page="adres" – względny adres zasobu, który ma zostać dołączony flush="true" – określa buforowanie; należy koniecznie ustawić na true Przykłady akcja_include.jsp, tytul.jsp Elementy akcji Akcja forward Składnia <jsp:forward page="adres" /> <jsp:forward page="adres"> <jsp:param name="param" value="wartosc" /> ... </jsp:forward> page="adres" – względny adres zasobu, na który zostaniemy przekierowani Uwaga: w pasku adresu URL pozostanie bez zmian Przykłady: akcja_forward.jsp Elementy akcji Akcja plugin Składnia <jsp:plugin type="bean|applet" code="objectCode" codebase="objectCodebase" align="alignment" height="height" width="width" hspace="hspace" vspace="vspace" title=”title” name="componentName"> <jsp:params> <jsp:param name="name" value=”value" /> ... </jsp:params> <jsp:fallback>Na wypadek awarii</jsp:fallback> </jsp:plugin> Elementy akcji Akcja plugin Przykład <jsp:plugin type="applet" code="gierka.class" codebase="/aplety" width="200" height="200"> <jsp:param name="parametr" value="wartosc jego" /> <jsp:fallback>Nie mozna uruchomic Java Plugin</jsp:fallback> </jsp:plugin> Elementy akcji Model komponentowy, krótkie wprowadzenie do Enterprise JavaBeans (EJB) Komponenty, czyli JavaBeans JavaBean ma zdefiniowane tzw. właściwosci i metody dostępowe, poprzez które komunikuje sie z otoczeniem. JavaBean to zwykła klasa utworzona przy stosowaniu kilku zasad. Elementy akcji Zasady tworzenia bean-a Konstruktor nie moze przyjmowac zadnych argumentów. Własciwosci i metody dostępowe. Dla każdej właściwosci istnieją metody dostępowe i dostęp do nich jest tylko przez te metody. Dla każdej właściwosci powinny być zdefiniowane nastepujące 3 (ewentualnie 2) metody public {Typ obiektu} get{Własciwosc} () public void set{Własciwosc} ({Typ obiektu}) public boolean is{Własciwosc} () Elementy akcji Zasady tworzenia bean-a c.d. Właściwości indeksowane public {Typ obiektu}[] get{Własciwosc} () public void set{Własciwosc} ({Typ obiektu}[]) public {Typ obiektu} get{Własciwosc} (int) public void set{Własciwosc} (int, {Typ obiektu}) Widoczność: poza konstruktorem i metodami dostępowymi nic nie powinno być widoczne. Przykład: ProstyBean.java Elementy akcji Akcja JavaBeans Warte zainteresowania, gdyż całość implementacji może być zawarta JavaBeans, a JSP tylko jej wykorzystanie Wyszukuje obiektu (za pomoca id i scope) lub tworzy jego egzemplarz oraz związuje ten obiekt z niejawnym obiektem utworzonym poprzez atrybut scope. Znacznik useBean może, ale nie musi miec ciała. Elementy akcji Akcja JavaBeans Atrybuty id – identyfikuje obiekt; atrybut wymagany, scope – okresla zasięg, class – definiuje implementację obiektu; jeśli nie podamy class lub beanName, to obiekt musi dostępny w podanym zasięgu, type – typ tworzonej zmiennej skryptowej; domyślnie jest to typ określony w class, beanName – nazwa obiektu bean. Elementy akcji Akcja JavaBeans Składnia, przykład <jsp:useBean id="DataBean" class="org.java.DataBean" /> <jsp:useBean id="newBean" class="org.java.DataBean"> <jsp:setProperty name="newBean" property="border" value="0"> </jsp:useBean> Elementy akcji Akcja JavaBeans, akcja <jsp:setProperty> Ustawia właściwości Bean-a Atrybuty name – nazwa beana, którego wartość ustawiamy, property – nazwa właściwosci, którą chcemy ustawić; jeżeli pominiemy atrybuty value i param, to zostanie przypisana wartość z parametru zadania o tej samej nazwie, param – nazwa parametru zadania, której wartość chcemy przypisac własciwości, value – wartość, która zostanie przypisana danej właściwości; wyklucza sie z param. Elementy akcji Akcja JavaBeans, akcja <jsp:setProperty> Przykłady użycia <jsp:setProperty id="DataBean" property="border" value="30" /> <jsp:setProperty id="DataBean" property="border" param="borderWidth" /> <jsp:setProperty id="DataBean" property="border" /> <jsp:setProperty id="DataBean" property="*" /> Elementy akcji Akcja JavaBeans, akcja <jsp:getProperty> Pobiera wartosc własciwosci bean’a. Atrybuty: name – nazwa ziarnka, którego wartość pobieramy; atrybut wymagany, property – nazwa właściwosci, którą pobieramy; atrybut wymagany. Dyrektywy Składnia Dostępne są dwa rodzaje składni <%@ nazwa_dyrektywy %> <jsp:directive.nazwa_dyrektywy /> Zależy od rodzaju dyrektywy Omówimy dyrektywy page include taglib Dyrektywy Dyrektywa page Określa parametry strony Para atrybut/wartosc może wystąpić tylko raz Atrybuty contentType – określa typ zawartości; domyślnie jest to text/html z kodowaniem ISO-8859-1 errorPage – określamy stronę, która bedzie wyświetlana przy pojawieniu sie wyjątku isErrorPage – strona, która ma być wyświetlana przy pojawianiu się wyjatków musi ten atrybut mieć ustawiony na true; domyślnie jest on oczywiście ustawiany na false Dyrektywy Dyrektywa page Atrybuty c.d. import – umożliwia import pakietów, można podać kilka po przecinku; domyślnie importowane są: javax.Servlet.jsp.*, javax.Servlet.http.*, java.lang.*, javax.Servlet.* atrybut import dostępny jest tylko wtedy, gdy atrybut language jest ustawiony na java language – określa język używany wewnątrz strony JSP; obecnie wartoscią domyślną i jedyną jest java session – określa, czy dana strona powinna uczestniczyc w sesji HTTP; domyslna wartoscia jest true Dyrektywy Dyrektywa page Przykład <%@ page language="java" contentType="text/html;charset=iso-8859-2" %> <%@ page import="java.util.Enumeration" %> <%@ page import="java.util.StringTokenizer" %> Dyrektywy Dyrektywa include Dołącza zawartość zewnętrznego pliku Wstawienie jest w momencie kompilacji dołączenie jest statyczne Atrybut file określa zasób do dołączenia Przykład <% include file="naglowek.html" %> Dyrektywy Dyrektywa taglib Określa bibliotekę, o które można rozszerzyć standardowy zestaw znaczników JSP Atrybuty: uri – określa ścieżkę do biblioteki, prefix – prefix, poprzez który będzie się można odwoływać wewnątrz strony. Przykład <%@ taglib uri="http://www.java.com/taglib/sample.jar" prefix="sample" %> <sample:tagaction>Przykładzik</sample> Żądanie HTTP Wraz żądaniem tworzony jest obiekt klasy HttpServletRequest o nazwie request Metody do obsługi parametrów żądania: String request.getQueryString() BufferedReader request.getReader() ServletInputStream request.getInputStream() String request.getMethod() String request.getParameter(String) Enumeration request.getParameterNames() String[] request.getParameterValues(String) Przykład userinfo.html, userinfo.jsp Żądanie HTTP Metody do pobrania nagłóków HTTP: String request.getHeader(String) zwraca czysty nagłówek int request.getIntHeader(String) j.w., przy czym zwraca int Date request.getDateHeader(String) j.w., przy czym zwraca Date Enumeration request.getHeaderNames() zwraca nazwy pól nagłówków żądania Żądanie HTTP Metody do pobrania nagłóków HTTP c.d.: Enumeration request.getHeaders(String) zwraca wartości dostępne w danym nagłówku String request.getLocale() pobiera kod preferowanego języka zdefiniowanego w Accept-Language Enumeration request.getLocales() pobiera kody wszystkich języków określonych w Accept-Language wg preferencji Żądanie HTTP Do pobrania ciasteczek mamy Cookie[] request.getCookies() Do pobrania informacji o serwerze mamy String application.getServerInfo() Przykład headers.jsp Wysyłanie odpowiedzi Aby zmodyfikować odpowiedź należy użyć metod obiektu HttpServletResponse dostępnego pod nazwę response Do ustawienia kod odpowiedzi mamy metody: void response.sendError(int sc) void response.sendError(int sc, String msg) void response.sendStatus(int sc) void response.sendStatus(int sc, String msg) Wysyłanie odpowiedzi Przykładowe kody odpowiedzi Kod stanu 200 OK 204 No Content 301 Moved Permanently 302 Moved Temporarily 401 Unauthorized 403 Forbidden 404 Not Found 500 Internal Server Error 503 Service Unavailable Stała w JSP SC_OK SC_NO_CONTENT SC_MOVED_PERMANENTLY SC_MOVED_TEMPORARILY SC_UNAUTHORIZED SC_FORBIDDEN SC_NOT FOUND SC_INTERNAL_SERVER_ERROR SC_SERVICE UNAVAILABLE Wysyłanie odpowiedzi Wstawianie nagłówków do odpowiedzi void response.addHeader(String name, String value) void response.setHeader(String name, String value) void response.addIntHeader(String name, int value) void response.setIntHeader(String name, int value) void response.addDateHeader(String name, long date) void response.setDateHeader(String name, long date) Przykładowe nagłówki Content-Type Connection Location Expires text/html keep-alive | close index2.html <data> Wysyłanie odpowiedzi Kilka uwag Do ustawienia nagłówka Content-type jest osobna funkcja void response.setContenttype(String type) response.setContentType("text/xml"); Do sprawdzenia, czy dany nagłówek został wysłany jest metoda boolean response.containsHeader(String name) Dwa przykłady na przekierowanie strony response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); response.setHeader("Location","http://localhost:8080/"); void response.sendRedirect("http://localhost:8080/"); Wysyłanie odpowiedzi Obsługa ciasteczek Ciasteczka sa reprezentowane przez obiekty typu Cookie. Do utworzenia mamy kontruktor public Cookie(String name, String value) Do obsługi obiektu klasy Cookie mamy metody: void Cookie.setMaxAge(int expire) void Cookie.setDomain(String pattern) void Cookie.setPath(String uri) void Cookie.setSecure(boolean flag) String Cookie.getName() String Cookie.getValue() Wysyłanie odpowiedzi Obsługa ciasteczek Do wysłania ciastka mamy metodę void response.addCookie(Cookie cookie) Przykład licznik.jsp Sesje Kilka uwag wstępnych Przekazywanie identyfikatora. Wiele motorów jest „inteligentna”, tzn. przekazują ID przez ciacho, a jak się nie powiedzie, to przez URL. Śledzenie sesji jest właczane domyślnie i automatycznie jest tworzony egzemplarz obiektu HttpSession dostępny pod nazwa session. Jeśli chcemy wyłaczyc śledzenie sesji, musimy to zrobić jawnie poprzez dyrektywę <%@ page session="false" %> Sesje Ważniejsze metody obiektu HttpSession void session.putValue(String key, Object value) wkłada obiekt ewentualnie go nadpisując Object session.getValue(String name) pobiera obiekt lub zwraca null void session.removeValue(String name) usuwa obiekt z sesji String[] session.getValueName() zwraca tablicę kluczy do obiektów sesji Sesje Metody związane z cyklem życia sesji int session.getMaxInactiveInterval() pobiera czas, po jakim sesja wygaśnie void session.setMaxInactiveInterval(int interval) ustawienie czasu, po jakim sesja wygaśnie long session.getCreationTime() moment utworzenia sesji (liczba sekund od 1970-01-01) long session.getLastAccessedTime() moment ostatniego użycia sesji void session.invalidate() - usuwa sesję Sesje Przykład odwiedziny.jsp confirmLogin.jsp login.jsp logout.jsp