Kurs WWW
1
Paweł Rajba
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
text/html
Connection
keep-alive | close
Location
index2.html
Expires
<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