Kurs WWW 1 Paweł Rajba pawel@ii.uni.wroc.pl 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 programy i skrypty (.sh lub.bat) /conf pliki konfiguracyjne (najważniejszy: server.xml) /logs 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 fragmenty kodu w Javie, które generuja kod HTML, XHTML, itd. Elementy akcji 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: Elementy deklaracji nie generują żadnych napisów Zmienne i metody utworzone w elemencie deklaracji są globalne Składnia <%! 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 Stała w JSP 200 OK SC_OK 204 No Content SC_NO_CONTENT 301 Moved Permanently SC_MOVED_PERMANENTLY 302 Moved Temporarily SC_MOVED_TEMPORARILY 401 Unauthorized SC_UNAUTHORIZED 403 Forbidden SC_FORBIDDEN 404 Not Found SC_NOT FOUND 500 Internal Server Error SC_INTERNAL_SERVER_ERROR 503 Service Unavailable 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