You are on page 1of 40

Head First Servlets & JSP.

Edycja polska. Wydanie II


Autor: Bryan Basham,
Kathy Sierra, Bert Bates
Tumaczenie: Mikoaj Szczepaniak
ISBN: 978-83-246-1814-9
Tytu oryginau: Head First
Servlets and JSP, 2 ed.
Format: 200x230, stron: 920
Wykorzystaj innowacyjne metody nauki
i zacznij tworzy dynamiczne aplikacje internetowe!
Jak korzysta z technologii JSP?
Jak dziaaj serwlety?
Jak zastosowa wzorzec projektowy MCV?
Statyczna strona internetowa dzi ju nikogo nie zachwyca. Czas na zmian!
Pora sprawi, aby tworzone przez Ciebie aplikacje stay si wyjtkowo dynamiczne,
elastyczne i interaktywne. Poznaj i wykorzystaj w tym celu nowoczesn technologi
serwletw i stron JSP. Dziki niej zbudujesz zoony serwis z zastosowaniem jzyka
Java wplecionego w kod HTML danej strony oraz serwletu, ktry przetwarza informacje
otrzymane z serwera, aby dostarczy uytkownikowi gotowy obraz witryny.
Aby Twoja aplikacja dziaaa idealnie, potrzebujesz jeszcze tylko zabezpiecze,
kontenerw serwletw i modelu MCV. Jak to wszystko zoy i uruchomi?
Tego dowiesz si wanie z naszego nowatorskiego podrcznika!
Ksika Head First Servlets & JSP. Edycja polska. Wydanie II napisana zostaa
w oparciu o innowacyjne metody przekazywania wiedzy, polegajce na wczaniu
w proces nauki elementw zabawy oraz oddziaywaniu na wiele zmysw. To pomaga
szybko zrozumie t technologi i osign biego w tworzeniu dynamicznych stron
oraz aplikacji. Z bogato ilustrowanego i napisanego lekkim jzykiem podrcznika
dowiesz si m.in., co to jest serwlet, kontener i protok HTTP, do czego su strony JSP
oraz jak tworzy rodowisko wdroeniowe aplikacji i zabezpiecza przesyane informacje.
Architektura aplikacji internetowej nie bdzie ju miaa przed Tob adnych tajemnic!

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Przegld technologii serwletw i stron JSP


Architektura aplikacji internetowej
Wdraanie aplikacji internetowej
Strony bezskryptowe
Znaczniki niestandardowe
Zabezpieczenia serwletw
Filtry
Korporacyjne wzorce projektowe
Protok HTTPS
Ksika przygotowuje do najnowszej wersji egzaminu SCWCD z platformy J2EE 1.5!

Spis treci

Spis treci (skrcony)


Wprowadzenie

15

1.

Do czego su serwlety i strony JSP? Wprowadzenie i przegld


najwaniejszych zagadnie

29

2.

Architektura aplikacji internetowej. Bardziej szczegowy przegld zagadnie

65

3.

Minipodrcznik MVC. Omwienie MVC

95

4.

By serwletem. danie i odpowied

121

5.

By aplikacj internetow. Atrybuty i obiekty nasuchujce

175

6.

Stan konwersacyjny. Zarzdzanie sesjami

251

7.

By stron JSP. Stosowanie technologii JSP

309

8.

Strony bezskryptowe. Bezskryptowe strony JSP

371

9.

Potga znacznikw niestandardowych. Stosowanie biblioteki JSTL

467

10.

Kiedy JSTL nie wystarcza. Tworzenie znacznikw niestandardowych

527

11.

Jak wdroy aplikacj internetow? Wdraanie aplikacji internetowych

629

12.

Zachowaj to w tajemnicy, ukryj w bezpiecznym miejscu. Bezpieczestwo


aplikacji internetowych

677

13.

Potga filtrw. Filtry i opakowania

729

14.

Korporacyjne wzorce projektowe. Wzorce i Struts

765

Dodatek A Kocowy egzamin prbny

819

Skorowidz

893

Spis treci

Wprowadzenie
Twj mzg koncentruje si na serwletach. W tym rozdziale Ty prbujesz si czego nauczy,
a Twj mzg robi Ci przysug i nie przykada si do zapamitywania zdobytej wiedzy. Twj mzg
myli sobie: Lepiej zachowam miejsce na bardziej istotne informacje, na przykad: jakich dzikich
zwierzt naley unika bd czy jazda nago na snowboardzie jest dobrym pomysem. Jak
w takim razie mona przekona swj mzg, e nasze ycie zaley od opanowania serwletw?
Dla kogo jest ta ksika?

16

Wiemy, co sobie myli Twj mzg

17

Metapoznanie

19

Zmu swj mzg do posuszestwa

21

Czego potrzebujesz, aby skorzysta z tej ksiki?

22

Zdajemy egzamin certyfikujcy

24

Redaktorzy techniczni

26

Podzikowania

27

Spis treci

Do czego su serwlety i strony JSP?


Aplikacje internetowe s super. Ile tradycyjnych aplikacji z graficznym interfejsem uytkownika
uywanych przez miliony osb na caym wiecie potrafisz wymieni? Jako programista aplikacji
internetowych moesz uwolni si od problemw wdraania bdcych udziaem wszystkich
standardowych aplikacji i udostpnia swoje aplikacje kademu, kto dysponuje przegldark
internetow. Bdziesz jednak potrzebowa serwletw i stron JSP. Bdziesz ich potrzebowa,
poniewa zwyke, statyczne strony HTML byy dobre w latach 90. ubiegego wieku. Zatem
dowiedz si, jak przeksztaci witryn WWW w aplikacj internetow.
Kluczowe
elementy
dania
strumien
:
ia
h metod
a HT
naley po TP (akcja, ktr
dj),
h docelow
a strona
(adres UR
h param
L),
etry form
ularza
argumen
ty danej me (np.
tody).

danie HTTP
Przegldarka
internetowa

Odpowied HTTP

Klient

nia
Kluczowe elementy strumie
odpowiedzi:
h kod stanu (okrelajcy,
czy dane danie zostao
pomylnie przetworzone),

Serwer

Cele egzaminu

30

Czym zajmuje si serwer WWW i klient oraz jak si ze sob porozumiewaj?

32

Dwuminutowy kurs jzyka HTML

35

Czym jest protok HTTP?

38

Anatomia da GET i POST oraz odpowiedzi protokou HTTP

44

Lokalizacja stron WWW przy uyciu adresw URL

48

Serwery WWW, strony statyczne i CGI

52

Serwlety bez tajemnic: pisanie, wdraanie i uruchamianie serwletw

58

Technologia JSP jest efektem wprowadzenia jzyka Java do kodu HTML

62

h typ zawartoci (tekst, obraz,


HTML itp.),
h zawarto (waciwy kod
HTML, obraz itp.).

Architektura aplikacji internetowej


Serwlety potrzebuj pomocy. Kiedy do naszej aplikacji dociera danie, kto musi utworzy obiekt
serwletu lub przynajmniej wtek, ktry to danie obsuy. Kto musi wywoa metod doPost()
lub doGet() serwletu. Kto musi przekaza danie do serwletu oraz odebra to, co serwlet
wygeneruje w odpowiedzi. Kto musi decydowa o yciu, mierci i zasobach niezbdnych do pracy
serwletu. W tym rozdziale przyjrzymy si koncepcji kontenera i po raz pierwszy zwrcimy uwag na
wzorzec projektowy MVC.

Serwlet

Kontroler

JSP

Stara
dobra
Java

Widok

class Foo {
void bar()

{
}

doBar();

Model
BD

Cele egzaminu

66

Czym jest kontener oraz co nam daje?

67

Jak to wszystko wyglda w kodzie (co sprawia, e serwlet jest serwletem)?

72

Okrelanie nazw serwletw i kojarzenie ich z adresami URL


w deskryptorze wdroenia

74

Opowiadanie: Bob buduje witryn swatajc


(wprowadzenie do wzorca MVC)

78

Oglne informacje i przykad wzorca model-widok-kontroler (MVC)

82

Dziaajcy deskryptor wdroenia (DD)

92

Jaka w tym wszystkim jest rola platformy J2EE?

93

Spis treci

Minipodrcznik MVC
Tworzenie i wdraanie aplikacji internetowych MVC. Nadszed czas, aby utrudzi nasze donie
pisaniem formularzy HTML, kontrolerw serwletw, modeli (zwykych, tradycyjnych klas Javy),
deskryptorw wdroenia w formacie XML oraz widokw opartych na stronach JSP. Najwysza
pora zbudowa, wdroy i przetestowa tak aplikacj. Najpierw jednak musimy przygotowa
odpowiednie rodowisko wytwarzania aplikacji. Nastpnie musimy przygotowa rodowisko
wdraania, postpujc przy tym zgodnie ze specyfikacj serwletw i JSP oraz wymaganiami
Tomcata. Owszem tworzymy ma aplikacj, jednak niemal adna aplikacja nie jest na tyle maa,
by nie mona w niej byo wykorzysta wzorca MVC.

tomcat

tomcat

Katalogi waciwe dla Tomcata


Nazwa tego katalogu jednoczenie
reprezentuje
katalog gwny kontekstu wykorzyst
ywany
przez Tomcata podczas odnajdywa
wskazywanych przez adresy URL. nia zasobw
Bardziej
szczegowo zajmiemy si tym zagadnien
iem
w rozdziale powiconym wdraaniu
aplikacji
internetowych.

webapps

Piwo-w1

<html>
<body>
...
</body>
</html>

WEB-INF

<%
...
%>

wynik.jsp

form.html

Cz specyfikacji serwletw

lib

classes

<webapp>
.
.
</webapp>

Ten plik web.xml


MUSI si znajdowa
w katalogu WEB-INF

web.xml

com

Ta struktura pakietu niczym nie


si od struktury, ktrej uylimy rni
w przygotowanym wczeniej rodowisk
u
wytwarzania aplikacji. Jeli nie
skadujesz
swoich klas w plikach JAR (omwimy
te pliki w dalszej czci tej ksiki),
koniecznie MUSISZ umieci struktur
katalogw pakietu bezporednio
pod
katalogiem WEB-INF/classes.

Katalogi waciwe
dla danej aplikacji

example

web

model

0010 0001
1100 1001
0001 0011
0101 0110

0010 0001
1100 1001
0001 0011
0101 0110

97

Tworzenie rodowisk wytwarzania i wdraania aplikacji

100

Tworzenie i testowanie kodu HTML pocztkowej strony formularza

103

Tworzenie deskryptora wdroenia (DD)

105

Tworzenie, kompilacja, wdraanie i testowanie serwletu kontrolera

108

Projektowanie, tworzenie i testowanie komponentu modelu

110

Rozszerzenie kontrolera o wywoania modelu

111

Tworzenie i wdraanie komponentw widoku (to wanie JSP)

115

Rozszerzenie serwletu o wywoanie strony JSP

116

By serwletem
Serwlety potrzebuj pomocy. Zadaniem serwletu jest obsuga da klientw i odsyanie do
klienta waciwych odpowiedzi. danie moe by zupenie proste, np. przelij mi stron powitaln,
lub znacznie bardziej skomplikowane, np. wygeneruj zamwienie na podstawie zawartoci mojego
koszyka. danie obejmuje kluczowe dane, a kod Twojego serwletu musi wiedzie, jak naley te dane
odszuka i jak ich uy. Co wicej, kod serwletu musi wiedzie, jak odesa odpowied. A jeli nie


)DEMPOTENCJA
TONIC
WSTYDLIWEGOb

Serwlet wykorzystuje dane doczone


do dania POST do zaktualizowania
bazy danych.

83/ZYa^K\dKVXO
POST

...
...

Serwlet
HTTP/1.1 200
OK
<html>
<head>
...
</head>
<body>
<img src=...>
</body>
</html>

96

Zbudujmy aplikacj internetow MVC; pierwszy projekt

EkspertPiwny.class

WyborPiwa.class

Klient

Cele egzaminu

DB

Serwlet odsya odpowied


z wygenerowanym kodem strony HTML.

Cele egzaminu

122

ycie serwletu w kontenerze

123

Inicjalizacja i wtki serwletu

129

FAKTYCZNYM celem serwletu jest obsuga da GET i POST

133

Historia pewnego niepowtarzalnego dania

140

Co sprawia, e przegldarka wysya albo danie GET, albo danie POST?

145

Wysyanie i stosowanie parametrw

147

Dobrze, wiemy ju, do czego suy klasa Request


przyjrzyjmy si teraz klasie Response

154

Moesz ustawia nagwki odpowiedzi,


moesz dodawa nagwki odpowiedzi

161

Przekierowania kontra przydzia da

164

Przegld klasy HttpServletResponse

168

Spis treci

5
Atrybuty kontekstu

By aplikacj internetow
aden serwlet nie dziaa samodzielnie. We wspczesnych aplikacjach internetowych osiganie
zamierzonego celu jest moliwe dziki wsppracy wielu komponentw. Stosujemy komponenty
modelu, widoku oraz kontrolera. Wykorzystujemy take rozmaite klasy pomocnicze. Jednak w jaki
sposb naley czy wszystkie te elementy, aby tworzyy jedn aplikacj internetow? W jaki
sposb komponenty mog korzysta z tych samych informacji? Jak ukrywa pewne informacje?
Jak zapewnia bezpieczestwo informacji podczas przetwarzania wielowtkowego? Od odpowiedzi
na te pytania moe zalee Twoja praca.

serwlet

wia

usta

ustawia
Adres poczty
administratora

BD
Poczenie
z baz
danych

po
bi
er
a

er
on
tex isten
tL

Uytkownicy
pracujcy
rwnoczenie

foo@wickedlysmart.com

42

usta

serwlet

pob
iera
<html>
<body>
<jsp:setProperty
name=foo
property=bar>
</body>
</html>

pob
ier
a

wia

serwlet

pobier
a

Dostp do tych atrybutw ma kady


skadnik aplikacji.

JSP

Atrybuty sesji
serwlet

Ko
p
szy
kZaku

Serwlet A

iera
pob

serwlet

pobiera

ustawia

ustawi

<html>
<body>
<jsp:setProperty
name=foo
property=bar>
</body>
</html>

Widok JSP

Serwlet B

Dostpne tylko dla komponentw z dostpem


do okrelonego obiektu HttpSession

Atrybuty DANIA

serwlet

ustawia

"RekomendacjaPiwosza"
"Moose Drool"

Kontroler

Widok JSP
Dostpne tylko dla komponentw z dostpem
do okrelonego obiektu ServletRequest

pobiera

<html>
<body>
<jsp:setProperty
name=foo
property=bar>
</body>
</html>

Cele egzaminu

176

Wybawieniem s parametry inicjalizacji i obiekt ServletConfig

177

Jak strona JSP moe uzyska dostp do parametrw


inicjalizacji serwletu?

183

Wybawieniem s parametry inicjalizacji kontekstu

185

Porwnanie obiektw ServletConfig oraz ServletContext

187

Chcemy obiektu ServletContextListener

194

Przewodnik: prosty obiekt ServletContextListener

196

Kompilacja, wdraanie i testowanie obiektu nasuchujcego

204

Kompletna historia obiekt nasuchujcy kontekstu

206

Osiem obiektw nasuchujcych nie tylko zdarze kontekstu

208

Czym dokadnie jest atrybut

213

Interfejs API atrybutw ciemna strona atrybutw

217

Zasig kontekstu nie zapewnia bezpieczestwa wtkw!

220

Analiza tego problemu w zwolnionym tempie...

221

Prba synchronizacji

223

Czy atrybuty sesji gwarantuj bezpieczestwo


przetwarzania wielowtkowego?

226

Interfejs SingleThreadModel

229

Tylko atrybuty dania i zmienne lokalne zapewniaj bezpieczn


wielowtkowo!

232

Atrybuty dania i przydzia da

233

Spis treci

Stan konwersacyjny
Serwery WWW nie maj pamici krtkotrwaej. Zaraz po odesaniu do nas odpowiedzi
serwery WWW zapominaj, kim jestemy. Kiedy wysyamy kolejne danie, docelowy serwer
WWW ju nas nie rozpoznaje. Innymi sowy, serwery WWW nie pamitaj ani tego, czego
dalimy w przeszoci, ani tego, co do nas wysay w ramach odpowiedzi. Zupenie nic! Jednak
czasami przechowywanie informacji o stanie konwersacji z klientem i korzystanie z nich podczas
obsugi wielu da jest konieczne. Koszyk w sklepie internetowym nie mgby dziaa, gdyby
uytkownik musia wybiera wszystkie towary i realizowa zamwienie w ramach jednego dania.

Ciasteczka
Oto Twoje
ciasteczko
z identyfikatorem sesji
w rodku

prostu kolejnym
"Set-Cookie" jest po w ramach
nagwkiem wysyanym
odpowiedzi.

HTTP/1.1 200 OK
AB6C8DE415
Set-Cookie: JSESSIONID=0A
Content-Type: text/html
Content-Length: 397
GMT
Date: Wed, 19 Nov 2003 03:25:40
Server: Apache-Coyote/1.1
Connection: close
<html>
...
</html>

Odpowied HTTP

Dobrze, oto moje


ciasteczko odsyane
z kolejnym daniem.

Cele egzaminu

252

To bdzie dusza konwersacja, czyli jak dziaaj sesje

254

Identyfikatory sesji, ciasteczka i pozostae podstawy dziaania sesji

259

Przepisywanie adresw URL, sposb rozwizania problemu

265

Kiedy sesje staj si nieaktualne eliminowanie zbdnych sesji

269

Czy ciasteczka mog mie take zastosowania inne ni obsuga sesji?

278

Najwaniejsze momenty w yciu obiektu HttpSession

282

POST /wybor/wybierzSmakPiwa2.do HTTP/1.1

Nie zapominaj o interfejsie HttpSessionBindingListener

284

Cookie: JSESSIONID=0AAB6C8DE415

Migracja sesji

285

Przykady klas nasuchujcych

289

"Cookie" jest kolejnym nagwkiem


wysyanym w ramach dania HTTP.

Host: www.wickedlysmart.com
User-Agent: Mozilla/5.0

Accept: text/xml.application/xml.application/xhtml+
xml,text/
html;q=0.9,text/plain;q=0.8,video/x-msg,im
age/png,image/
jpeg,image/gif;q=0.2,*/*;q=0.1
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate

danie HTTP

7
pisze

<html>
<body>
<jsp:setProperty
name=foo
property=bar>
</body>
</html>

MojJSP.jsp

By stron JSP
Strona JSP staje si serwletem. Serwletem, ktrego nie musisz tworzy. Kontener przeglda
kod Twojej strony JSP, tumaczy go na kod rdowy jzyka programowania Java i kompiluje tak
przetumaczony kod na posta penowartociowej klasy serwletu Javy. Warto jednak wiedzie,
co dzieje si w czasie konwertowania Twojego kodu strony JSP na kod Javy. W ramach kodu JSP
mona co prawda umieszcza kod Javy, ale czy na pewno powinnimy to robi? A jeli w kodzie
stron JSP nie umiecimy adnych wyrae Javy, co znajdzie si w kodzie naszego serwletu?
Przyjrzymy si szeciu rodzajom elementw JSP z ktrych kady ma swoje przeznaczenie
i, niestety, odmienn skadni. Dowiesz si, co i dlaczego mona umieszcza w kodzie stron JSP.
Dowiesz si take, czego nie powiniene umieszcza w tym kodzie.

package headrst;

jest tumaczony na

ko

pi

ow

y
an

0010 0001
1100 1001
0001 0011
0101 0110

MojJSP_jsp.class

import javax.
servlet.
HttpServlet.*;

MojJSP_jsp.java

jest wczytywany
i inicjalizowany jako

obiekt
serwletu
Serwlet MojJSP_jsp

Cele egzaminu

310

Tworzymy prost stron JSP wykorzystujc zmienn out


i dyrektyw page

311

Wyraenia, zmienne i deklaracje JSP

316

Czas zapozna si z wygenerowanym serwletem

324

Zmienna out nie jest jedynym obiektem domylnym

326

Cykl ycia i inicjalizacja stron JSP

334

Skoro ju poruszylimy ten temat porozmawiajmy o trzech dyrektywach

342

Czy skryptlety mona uzna za niebezpieczne? Oto EL

345

Ale zaczekaj nie widzielimy jeszcze akcji

351

Spis treci

Strony bezskryptowe
Porzu skrypty. Czy wsppracujcy z Tob projektanci stron internetowych naprawd musz
zna Jav? Czy sami oczekuj od programistw Javy, aby byli jednoczenie np. grafikami? A jeli
nawet przyjmiemy, e jeste jedynym czonkiem zespou, czy rzeczywicie chciaby umieszcza
rozbudowane fragmenty kodu Javy w swoich stronach JSP? Czy nie nasuwa Ci si okrelenie
koszmar konserwacji oprogramowania? Pisanie stron bezskryptowych jest nie tylko moliwe,
ale stao si znacznie prostsze i bardziej elastyczne dziki nowej specyfikacji JSP 2.0, a przede
wszystkim wskutek wprowadzenia nowego jzyka wyrae (EL). Poniewa jzyk EL bazuje na
jzykach JavaScript i XPATH, projektanci stron mog go stosowa bez najmniejszych problemw;
zreszt take Ty go polubisz (kiedy ju si do niego przyzwyczaisz). Jednak EL stwarza te pewne
puapki. Jego wyraenia wygldaj co prawda jak wyraenia Javy, jednak w rzeczywistoci nimi nie
s. Niektre wyraenia EL dziaaj nawet inaczej ni wyraenia Javy o identycznej skadni, zatem
warto mie si na bacznoci!

Nie oczekuj
ode MNIE odrzucania
wszystkich nadmiarowych
znacznikw otwierajcych
i zamykajcych.

Plik nagwka (Naglowek.jsp)


<img src=images/Web-Services.jpg > <br>
<em><strong>Wiemy jak uatwi stosowanie protokou SOAP.</strong></em> <br>

Kontakt.jsp
<html><body>
<%@ include file="Naglowek.jsp"%>

<br>

Zwr uwag na fakt


usunicia z doczanych
plikw wszystkich
znacznikw HTML
i BODY.

<em>Moemy pomc.</em> <br><br>


Skontaktuj si z nami: ${initParam.glownyEmail} <br>
<%@ include file="Stopka.html"%>
</body></html>
3

Plik stopki ("Stopka.jsp")


<a href="index.html">strona domowa</a>

Uwaga: przedstawiona idea


odrzucania otwierajcych
i zamykajcych znacznikw
dotyczy OBU mechanizmw
doczania standardowej
akcji <jsp:include> oraz
dyrektywy include.

1
2
3

10

Cele egzaminu

372

Ktre atrybuty s komponentami JavaBean?

373

Standardowe akcje: useBean, getProperty oraz setProperty

377

Czy mona tworzy polimorficzne referencje do komponentw?

382

Rozwizaniem jest uycie atrybutu param

388

Konwersja waciwoci

391

Uratowa nas jzyk wyrae (EL)

396

Stosowanie operatora kropki (.) do uzyskiwania dostpu


do waciwoci i map wartoci

398

Operator [] stwarza dodatkowe moliwoci (listy, tablice)

400

Wicej szczegw o operatorach kropki (.) oraz []

404

Obiekty domylne jzyka EL

413

Funkcje jzyka EL i obsuga wartoci null

420

Szablony wielokrotnego uytku dwa rodzaje doczania

430

Standardowa akcja <jsp:forward/>

444

Ona nie wie jeszcze o znacznikach JSTL (zapowied)

445

Przegld standardowych akcji i wyrae doczania

446

Spis treci

9
<table>

Potga znacznikw niestandardowych


Czasami potrzebujemy czego wicej ni tylko jzyka wyrae (EL) i akcji standardowych.
Co bdzie, jeli zechcesz uy ptli do przeszukania danych skadowanych tablicy i wywietlenia
po jednym elemencie w kadym wierszu generowanej dynamicznie tabeli HTML? Oczywicie
doskonale zdajesz sobie spraw z moliwoci byskawicznego skonstruowania odpowiedniej ptli
w skryptlecie. Z drugiej strony, staramy si nie uywa kodu skryptowego. To aden problem. Kiedy
jzyk wyrae (EL) i akcje standardowe okazuj si niewystarczajce, zawsze mona wykorzysta
znaczniki niestandardowe. Ich stosowanie w kodzie stron JSP jest rwnie proste jak korzystanie
z akcji standardowych. Co wicej, znaczniki, ktrych najprawdopodobniej bdziesz potrzebowa,
kto ju napisa i umieci w standardowej bibliotece znacznikw JSP (ang. JSP Standard Tag
Library, w skrcie JSTL). W tym rozdziale dowiesz si, jak uywa znacznikw niestandardowych,
a w nastpnym jak tworzy wasne znaczniki.

typu ArrayList
Atrybut dania

<c:forEach var=elementListy items=${filmy} >


a
ptl ntrzna
<c:forEach var=film items=${elementListy} >
wew

<td>${film}</td>
</c:forEach>
</c:forEach>

ptla
zewn
tr

zna

</table>

Z pierwszej tablicy
typu String[]

Z drugiej tablicy
typu String[]

Jedna z tablic acuc


hw, ktra
zostaa przypisana do
"var" zewntrznej ptli.atrybutu

Cele egzaminu

468

Ptle bez skryptw, <c:forEach>

474

Kontrola warunkowa z uyciem znacznikw <c:if> oraz <c:choose>

479

Zastosowanie znacznikw <c:set> i <c:remove>

483

Znacznik <c:import>, czyli trzeci sposb doczania treci

488

Modyfikowanie doczanej zawartoci

490

Realizacja tego samego zadania za pomoc znacznika <c:param>

491

Znacznik <c:url> jako narzdzie realizacji wszystkich zada


zwizanych z obsug hiperczy

493

Tworzenie wasnych stron o bdach

496

Znacznik <c:catch>, ktry jest jak konstrukcja try-catch

500

Co bdzie, jeli uznamy za niezbdne uycie znacznika


SPOZA biblioteki JSTL?

503

Zwr uwag na element <rtexprvalue>

508

Co moe si znale w ciele znacznika

510

Klasa obsugujca znacznik, deskryptor TLD i strona JSP

511

Podelement <uri> elementu taglib jest tylko nazw, nie lokalizacj

512

Kiedy strona JSP wykorzystuje wicej ni jedn bibliotek znacznikw

515

11

Spis treci

10

Kiedy JSTL nie wystarcza


Czasami JSTL i standardowe akcje nie wystarczaj. Kiedy trzeba zrobi co niestandardowego,
a nie chcesz ucieka si do stosowania skryptu, moesz stworzy wasne procedury obsugi
znacznikw. Dziki temu projektanci stron bd mogli uywa w projektowanych stronach Twoich
znacznikw, a ca czarn robot bdzie, w niewidoczny sposb, realizowa Twoja klasa obsugujca.
Z drugiej strony, takie rozwizanie wymaga od Ciebie sporo nauki, poniewa wasne, niestandardowe
znaczniki mona tworzy na a trzy rne sposoby. Dwa spord nich (chodzi o znaczniki proste oraz
pliki znacznikw) wprowadzono z myl o naszej wygodzie dopiero w specyfikacji JSP 2.0.

Nie wiedziaem
o istnieniu znacznikw
niestandardowych Mylaem, e
mog uywa tylko JSTL, a adne znaczniki
nalece do JSTL nie pozwalay na zrobienie
tego, czego da szef. Och gdybym tylko
wtedy wiedzia, e mog tworzy wasne
znaczniki teraz jest ju dla mnie
za pno. Pamitaj o tym
i ratuj siebie

Ale dlaczego?
Dlaczego mu nie
powiedziae, e moesz
to zrobi?

11
Odwoania do komponentu lokalnego
<ejb-local-ref>

JVM

Serwlet

<ejb-ref-type>Entity</ejb-ref-type>
<local-home>com.bardzosprytni.KlientHome</local-home>
<local>com.bardzosprytni.Klient</local>

Komponent LOKALNY oznacza, e klient


(w tym przypadku jest nim serwlet) oraz
komponent musz dziaa na tej samej
wirtualnej maszynie Javy (JVM).

Odwoania do zdalnego komponentu


<ejb-ref>

JVM

<ejb-ref-name>ejb/KlientLokalny</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<home>com.bardzosprytni.KlientHome</home>
<remote>com.bardzosprytni.Klient</remote>
</ejb-ref>

12

Serwlet

530

Gdzie kontener szuka plikw znacznikw?

537

Proste klasy obsugujce znaczniki

541

Prosty znacznik z zawartoci

542

Co zrobi, jeli w zawartoci znacznika pojawia si wyraenie?

547

Wci musimy zna klasyczne klasy obsugujce znaczniki niestandardowe

557

Bardzo prosta, klasyczna klasa obsugi znacznika niestandardowego

559

Cykl ycia znacznika klasycznego zaley od zwracanych wartoci

564

Interfejs IterationTag pozwala na wielokrotne


przetwarzanie zawartoci znacznika

565

Wartoci domylne zwracane przez metody klasy TagSupport

567

Interfejs DynamicAttributes

584

Interfejs BodyTag udostpnia dwie kolejne metody

591

A co, jeli znaczniki wsppracuj ze sob?

595

Interfejs programowy PageContext dla klas obsugi znacznikw

605

W kocu Twoja aplikacja jest gotowa. Strony zostay dopracowane w najdrobniejszych


szczegach, kod jest przetestowany i zoptymalizowany, a termin min dwa tygodnie temu.
Ale gdzie to wszystko naley umieci? Jest tyle rnych katalogw, tyle niezrozumiaych regu.
Jak powiniene nazwa swoje katalogi? Jakich nazw uyby klient? Do jakich zasobw tak naprawd
bdzie si odwoywa klient i skd kontener ma wiedzie, gdzie naley ich szuka?

Nazwa uywana
w kodzie, ktra
bdzie poszukiwana
przy uyciu JNDI.

To musi by w peni kwalifikowa


na
nazwa udostpnionego interfejsu
komponentu.

528

Pliki znacznikw podobnie jak znacznik include, tylko lepiej

Wdraanie aplikacji internetowych

<ejb-ref-name>ejb/Klient</ejb-ref-name>

</ejb-local-ref>

Cele egzaminu

JVM

Cele egzaminu

630

Podstawowe zagadnienia zwizane z wdraaniem


rnych elementw aplikacji

631

Pliki WAR

640

Jak NAPRAWD dziaaj odwzorowania serwletw?

644

Konfiguracja plikw powitalnych w deskryptorze wdroenia

650

Konfiguracja stron bdw w deskryptorze wdroenia

654

Konfigurowanie inicjalizacji serwletu w deskryptorze wdroenia

656

Tworzenie stron JSP zgodnych z zasadami konstrukcji


dokumentw XML: dokumenty JSP

657

Spis treci

12

Zachowaj to w tajemnicy, ukryj w bezpiecznym miejscu


Twoja aplikacja internetowa jest w niebezpieczestwie. Problemy czyhaj w kadym
zakamarku sieci. Nie chcesz chyba, aby ci li faceci podsuchiwali transakcje realizowane w Twoim
sklepie internetowym i przechwytywali podawane numery kart kredytowych? Nie chcesz te, by
byli w stanie przekona Twj serwer, i tak naprawd s Bardzo Wanymi Klientami Liczcymi Na
Bardzo Due Upusty. I w kocu nie chcesz, by ktokolwiek (niezalenie od zamiarw) mia dostp
do poufnych informacji o pracownikach. Czy Janek z dziau marketingu naprawd musi wiedzie,
e Lucyna z dziau technicznego zarabia trzy razy wicej od niego?

Dziesi najwaniejszych powod


w
przemawiajcych za deklaratywnym
okrelaniem bezpieczestwa
10

Cele egzaminu

Kt z nas nie potrzebuje wicej praktyki


w pracy
z dokumentami w jzyku XML?

Czsto mona w naturalny sposb odwzorow


a
stanowiska zajmowane przez poszczeg
lne osoby
w dziale informatycznym firmy.

To wietnie wyglda w yciorysie zawodowy

Pozwala na bardziej elastyczne wykorzyst


ywanie
ju napisanych serwletw.

m.

Te zagadnienia pojawiaj si na egzaminie.

Dziki temu programici zajmujcy si tworzeniem


aplikacji mog wielokrotnie uywa serwletw
bez koniecznoci dostpu do ich kodu rdoweg
o.

Bo tak jest fajnie!

Takie rozwizanie pozwala ograniczy koszty


utrzymania rozwijanej aplikacji.

Jest to czynnik, ktrym mona wytumacz


y
i usprawiedliwi wysok cen kontenera
.

Takie rozwizanie jest zgodne z ide programow


ania
z wykorzystaniem komponentw.

13

678

Wielka Czwrka wiata zabezpiecze serwletw

681

Jak realizowa uwierzytelnianie w wiecie protokou HTTP?

684

Dziesi najwaniejszych powodw przemawiajcych


za deklaratywnym okrelaniem bezpieczestwa

687

Kto implementuje zabezpieczenia aplikacji internetowej?

688

Autoryzacja: role i ograniczenia

690

CZTERY typy uwierzytelniania

705

Zabezpieczanie przesyanych informacji


protok HTTPS pieszy z pomoc

710

Jak naley wybirczo i deklaratywnie implementowa


poufno i integralno danych?

712

Potga filtrw
Filtry umoliwiaj przechwytywanie da. A skoro mona przechwyci danie, mona
take kontrolowa odpowied. Ale najlepsze w tym wszystkim jest to, e serwlet nie ma o tym
najmniejszego pojcia. Serwlet nigdy nie wie, czy co si zdarzyo w czasie dzielcym odebranie
dania przez kontener od wywoania metody service() serwletu. Co to oznacza dla Ciebie?
Dusze wakacje. Poniewa czas, ktry musiaby powici na modyfikowanie tylko jednego
z istniejcych serwletw, moesz powici na napisanie i skonfigurowanie filtra, ktry bdzie mia
wpyw na wszystkie Twoje serwlety. Moe chciaby doda opcj ledzenia da we wszystkich
serwletach tworzcych aplikacj? Nie ma adnego problemu. A moe chciaby w okrelony sposb
modyfikowa wyniki generowane przez wszystkie serwlety wchodzce w skad aplikacji? To take
aden problem. A co najlepsze nie musisz przy tym w aden sposb modyfikowa kodu serwletw.

SerwletA
service()
Filtr7
doFilter(z,o,l)

Filtr7
doFilter(z,o,l)

Filtr7
doFilter(z,o,l)

Filtr3
doFilter(z,o,l)

Filtr3
doFilter(z,o,l)

Filtr3
doFilter(z,o,l)

Filtr3
doFilter(z,o,l)

Stos

Stos

Stos

Stos

Stos

Filtr3
doFilter(z,o,l)

W momencie
odebrania
dania kontener
wywouje metod
doFilter()
ltra Filtr3;
metoda ta jest
wykonywana a
do momentu
wywoania
metody lancuch.
doFilter().

Kontener
umieszcza
wywoanie
metody
doFilter()
ltra Filtr7 na
wierzchoku
stosu, metoda ta
jest wykonywana
a do momentu
wywoania
metody lancuch.
doFilter().

Kontener
umieszcza na
wierzchoku
stosu metod
service()
serwletu
SerwletA,
metoda ta jest
wykonywana a
do momentu jej
zakoczenia,
po czym jest
usuwana ze
stosu.

Kontener
przekazuje
sterowanie do
ltra Filtr7,
ktry koczy
wykonywanie
swojej metody
doFilter(); po
zakoczeniu
metoda ta jest
usuwana ze
stosu.

Kontener
przekazuje
sterowanie do
ltra Filtr3,
ktry koczy
wykonywanie
swojej metody
doFilter(); po
zakoczeniu
metoda ta jest
usuwana ze
stosu. Wraz
z zakoczeniem
wykonywania tej
metody kontener
koczy obsug
dania.

Cele egzaminu

730

Tworzenie filtra ledzcego dania

735

Cykl ycia filtrw

736

Deklarowanie i okrelanie kolejnoci filtrw

738

Kompresja wynikw przy wykorzystaniu filtra operujcego na odpowiedzi

741

Opakowania s wietne!

747

Prawdziwy kod filtra kompresji odpowiedzi

750

Kod opakowania kompresji odpowiedzi

752

13

Spis treci

14
<xml>
<validate>
...
</validate>
<mapping>
...
</mapping>
</xml>

1a

2a

Korporacyjne wzorce projektowe


Kto to ju wczeniej zrobi. Jeli wanie zaczynasz tworzy aplikacje internetowe w jzyku Java,
masz duo szczcia. Moesz czerpa z wiedzy dziesitek tysicy programistw, ktrzy od dawna
si tym zajmuj i maj ju swoje firmowe koszulki. Wykorzystujc wzorce projektowe, zarwno te
zwizane z platform J2EE, jak i wszelkie inne, moesz uproci swj kod i swoje ycie. W wiecie
aplikacji internetowych najwaniejszym wzorcem projektowym jest MVC, ktry zastosowano
midzy innymi w bardzo popularnym frameworku Struts (stworzonym z myl o wsparciu
programistw tworzcych elastyczne i atwe w utrzymaniu kontrolery frontonw serwletw).
Wykorzystanie pracy innych jeste winien samemu sobie, dziki temu bdziesz mg powici
wicej czasu na waniejsze sprawy.

XML
deklarujcy
odwzorowania
Komponent
werykacji
formularza
3a

1b
2c

2b

danie

Kontroler

3b

Komponent
akcji dania

Model

Widok

A
S
14

Cele egzaminu

766

Sprztowe i programowe argumenty na rzecz wzorw projektowych

767

Przegld zasad zwizanych z projektowaniem oprogramowania

772

Wzorce wspomagaj zdalne komponenty modelu

773

JNDI oraz RMI krtka prezentacja

775

Delegat biznesowy jest obiektem poredniczcym

781

Czas pozna wzorzec Transfer Object?

787

Wzorce warstwy biznesowej krtki przegld

789

Nasz pierwszy wzorzec po raz wtry MVC

790

Tak! To Struts (i wzorzec Front Controller) w zarysie

795

Przystosowanie aplikacji piwnej do korzystania z frameworku Struts

798

Przegld wzorcw projektowych

806

BAR
KAWOWY
Kocowy Egzamin Prbny Baru Kawowego. To jest to. 69 pyta. Charakter, zagadnienia
i poziom trudnoci jest niemal taki sam jak na prawdziwym egzaminie. Moesz nam wierzy.

Skorowidz

Kocowy egzamin prbny

819

Odpowiedzi

856

893

2. Bardziej szczegowy przegld zagadnie

Architektura aplikacji internetowej


Poznaj potg
mojego kontenera nawet
tysic jednoczesnych
uderze nie powali mnie
na kolana.

Hm kolejna
ofiara gorczki
J2EE.

Serwlety potrzebuj pomocy. Kiedy danie HTTP dociera do serwera WWW, kto musi
jeszcze stworzy egzemplarz serwletu lub przynajmniej utworzy nowy wtek obsugujcy to
danie. Kto musi przecie wywoa metod doPost() lub doGet() serwletu. Warto te
pamita o otrzymywaniu przez wspomniane metody dwch kluczowych argumentw obiektw
reprezentujcych danie i odpowied protokou HTTP. Kto te obiekty musi oczywicie przekaza
do serwletu. Kto musi zarzdza yciem, mierci i zasobami serwletu. Tym kim jest kontener
(ang. container). W tym rozdziale przyjrzymy si zasadom funkcjonowania aplikacji internetowych
w ramach kontenerw i rzucimy okiem na struktur aplikacji internetowych budowanych
z wykorzystaniem wzorca projektowego MVC (ang. Model View Controller).

to jest nowy rozdzia 

65

Cele oficjalnego egzaminu firmy SUN

Wysokopoziomowa architektura
aplikacji internetowych
1.1. Dla kadej z metod przesyania da protokou
HTTP (takich jak GET, POST, HEAD itp.) opisz jej
przeznaczenie i charakterystyki techniczne, wymie
czynniki, ktre mog decydowa o wyborze danej
metody przez klienta (zazwyczaj przegldark
internetow), oraz zidentyfikuj metod HttpServlet,
ktra odpowiada danej metodzie protokou HTTP.

1.4. Opisz znaczenie i sekwencj zdarze skadajcych si


na cykl ycia serwletu: (1) zaadowanie klasy serwletu,
(2) konkretyzacja serwletu, (3) wywoanie metody
init(), (4) wywoanie metody service() oraz (5)
wywoanie metody destroy().

2.1. Skonstruuj struktur plikw i katalogw dla aplikacji


internetowej zawierajcej (a) statyczn tre, (b)
strony JSP, (c) klasy serwletw, (d) deskryptor
wdroenia, (e) biblioteki znacznikw, (f) pliki JAR
oraz (g) pliki klas Javy. Opisz techniki ochrony plikw
zasobw przed dostpem za porednictwem protokou
HTTP.

2.2. Opisz przeznaczenie i semantyk kadego


z wymienionych dalej elementw deskryptora
wdroenia: egzemplarz serwletu, nazwa serwletu, klasa
serwletu, parametry inicjalizacji serwletu, adres URL
nazwanego odwzorowania serwletu.

66

Rozdzia 2.

Uwagi wyjaniajce:
Wszystkie cele wymienione w tym podrozdziale
zostan dogbnie przeanalizowane w pozostaych
rozdziaach, zatem niniejszy rozdzia naley traktowa
jak pierwsze spojrzenie na podstawy tego, czym
szczegowo zajmiemy si w kolejnych czciach.
Innymi sowy, nie powiniene si przejmowa, jeli
po przeczytaniu tego rozdziau nie bdziesz potrafi
odpowiedzie na postawione tutaj pytania (lub jeli
nie bdziesz tych pyta nawet pamita).
Na kocu tego rozdziau nie bdziemy analizowali
adnych przykadowych pyta egzaminacyjnych,
poniewa ich analiza bdzie moliwa dopiero po
zapoznaniu si z bardziej szczegowym materiaem
zawartym w kolejnych rozdziaach.
Ciesz si z prostego, wprowadzajcego materiau,
pki moesz!
PAMITAJ JEDNAK, e prezentowane w tym
rozdziale zagadnienia bd nam potrzebne
w kolejnych rozdziaach. Jeli masz ju pewne
dowiadczenie w kwestii serwletw, prawdopodobnie
moesz ten rozdzia jedynie przekartkowa (najlepiej
analizujc tylko najwaniejsze rysunki i wykonujc
wiczenia) i przej do rozdziau 3.

Architektura wysokopoziomowa

Czym jest kontener?


Serwlety nie zawieraj metody main(). Serwlety s
kontrolowane przez inn aplikacj Javy nazywan
kontenerem.
Przykadem kontenera (ang. container) jest Tomcat. Kiedy nasza aplikacja serwera
WWW (np. Apache) otrzymuje danie dotyczce serwletu (w przeciwiestwie np. do
przestarzaej, paskiej, statycznej strony HTML), serwer nie przekazuje tego dania
bezporednio do wskazywanego serwletu, tylko do kontenera, w ktrym ten serwlet
wczeniej umieszczono. Od tej pory to kontener odpowiada za przekazanie do serwletu
obiektw dania i odpowiedzi protokou HTTP oraz za wywoanie waciwych metod
serwletu (takich jak doPost() lub doGet()).

komputer serwera WWW

danie
GET

GET

...
...

...
...

Przegldarka
internetowa

aplikacja serwera
WWW

Klient

GET

...
...

kod Javy

serwlet
aplikacja
kod Javy
kontenera WWW

komputer serwera WWW


HTTP/1.1 200
............... OK
.....
<html>
<head>
...
</head>
<body>

Przegldarka
internetowa

<img src=..
.>

</body>
</html>

aplikacja serwera
WWW
odpowied

Klient

<html>
<head>
</head>
<body>
...
</body>
</html>

<html>
<head>
</head>

aplikacja
kontenera
WWW

<body>
...
</body>
</html>

serwlet

jeste tutaj 

67

ycie bez serwletw

Co zrobi, jeli mam odpowiedni kod Javy,


ale nie mam ani serwletw, ani kontenerw?
Jakie rozwizanie naley zastosowa w sytuacji, gdy musimy napisa
program Javy, ktry ma obsugiwa dynamiczne dania przychodzce do
aplikacji serwera WWW (np. Apachea), ale bez dodatkowego kontenera
(takiego jak wspominany ju Tomcat)? Innymi sowy, wyobramy sobie,
e nie istnieje pojcie serwletu i e dysponujemy jedynie standardowymi
bibliotekami J2SE. W takim przypadku naley oczywicie przyj, e
mamy moliwo takiego skonfigurowania aplikacji
serwera WWW, by wywoywa nasz aplikacj
napisan w Javie. Stosowanie takiego rozwizania
byoby uzasadnione, gdyby nie bya nam znana
koncepcja kontenera. Wystarczy sobie wyobrazi
sytuacj, w ktrej musimy stworzy aplikacj
internetow, dysponujc tylko klasyczn Jav.

Prawdziwy
wojownik nigdy nie ucieka
si do stosowania kontenerw.
Taki wojownik napisaby wszystko
goymi rkami, korzystajc
wycznie z klas J2SE.

Wymie kilka funkcji, ktre musielibymy zaimplementowa w aplikacji J2SE,


gdybymy nie mogli korzysta z aplikacja kontenera WWW:
* Stwrz gniazdo poczenia z serwerem i odpowiedni obiekt nasuchujcy (odbiornik) dla nowego gniazda.

Moliwe odpowiedzi: stwrz obiekt zarzdzajcy wtkami, zaimplementuj


techniki zabezpiecze, co do filtrowania takich elementw jak zapisy dziennika,
obsuga JSP (o Boe!), zarzdzanie pamici

68

Rozdzia 2.

Architektura wysokopoziomowa

Co daje nam kontener?


Wiemy ju, e to wanie kontener uruchamia serwlety i nimi zarzdza, ale waciwie dlaczego tak si
dzieje? Czy warto wprowadza dodatkow warstw i godzi si na zwizane z tym opnienia?

Obsuga komunikacji Kontener zapewnia prosty mechanizm


komunikacji pomidzy naszymi serwletami a serwerem WWW. Dziki
kontenerom nie musimy budowa gniazd serwera, nasuchiwa
komunikacji na porcie, tworzy strumieni itp. Kontener zna odpowiedni
protok porozumiewania si z serwerem WWW, zatem nasze serwlety
nie musz si martwi o zapewnienie interfejsu API pomidzy np.
serwerem Apache a kodem naszej aplikacji internetowej. W tej sytuacji
programista aplikacji internetowej musi jedynie zadba o logik
biznesow umieszczon w serwlecie (odpowiedzialn na przykad
za przyjmowanie i przetwarzanie zamwie skadanych w sklepie
internetowym).

Zarzdzanie cyklem ycia Kontener jest panem ycia i mierci


naszych serwletw. Wanie kontener odpowiada za wczytywanie
niezbdnych klas, tworzenie egzemplarzy i inicjalizacj serwletw,
wywoywanie ich metod oraz przystosowywanie serwletw do wsppracy
z mechanizmami odmiecania pamici. Dziki kontenerom nie musimy
traci naszego cennego czasu na zarzdzanie zasobami.

Obsuga wielowtkowoci Kontener automatycznie tworzy nowy


wtek Javy dla kadego otrzymanego dania dotyczcego serwletu.
Kiedy serwlet koczy wykonywanie metody obsugujcej przysane przez
klienta danie HTTP, odpowiedni wtek jest zamykany (zabijany).
Nie oznacza to jednak, e programista jest zwolniony z obowizku
zapewniania bezpieczestwa wtkw nadal musi pamita o ich
waciwej synchronizacji. Z drugiej strony, samo przejcie przez serwer
odpowiedzialnoci za tworzenie i zarzdzanie wtkami obsugujcymi
rwnoczenie wiele da pozwala mu zaoszczdzi mnstwo pracy.

Dziki kontenerowi MOESZ


si w wikszym stopniu
skoncentrowa na wasnej
logice biznesowej, zamiast
martwi si pisaniem kodu
zarzdzajcego wtkami,
zapewniajcego bezpieczestwo
oraz obsugujcego
komunikacj sieciow.
Moesz skupi ca swoj energi
na opracowaniu bajecznego
sklepu internetowego z foli
z bbelkami i pozostawi
usugi pracujce w tle (w tym
zapewnianie bezpieczestwa
oraz przetwarzanie stron JSP)
kontenerowi.
Teraz, zamiast pisania
caego kodu dziaa
realizowanych przez kontener,
musz si martwi wycznie
o to, jak sprzeda moj foli
z bbelkami jej mionikom.

Bezpieczestwo deklaratywne Korzystanie z kontenera wie si ze


stosowaniem deskryptora wdroenia (w formacie XML), ktry konfiguruje
(i modyfikuje) mechanizmy zabezpiecze bez koniecznoci trwaego
umieszczania odpowiednich instrukcji w kodzie klasy serwletu (lub kodzie
dowolnej innej klasy Javy). A trudno w to uwierzy! Moesz zarzdza
i wprowadza zmiany w zabezpieczeniach bez koniecznoci modyfikowania
i ponownego kompilowania swojego kodu rdowego Javy.

Obsuga JSP

Wiesz ju, jak wygodne s strony JSP. Kto Twoim


zdaniem zajmuje si tumaczeniem kodu JSP do postaci waciwego kodu
jzyka programowania Java? To oczywiste kontener.

jeste tutaj 

69

Kontener

Jak kontener obsuguje danie HTTP?


Co prawda najsmakowitsze kski pozostawimy sobie na kolejne rozdziay tej ksiki, jednak
warto ju teraz dokona krtkiego przegldu sposobu funkcjonowania kontenerw:
danie HTTP
GET

Przegldarka
internetowa

...
...

serwlet

kontener

Uytkownik klika cze zawierajce


adres URL serwletu (zamiast adresu
URL wskazujcego na statyczn
stron WWW).

Klient

Przegldarka
internetowa

Klient

serwlet

kontener

Kontener widzi, e danie jest


kierowane do serwletu, zatem
tworzy dwa niezbdne obiekty:
1. HttpServletResponse

danie

2. HttpServletRequest

odpowied

Przegldarka
internetowa

kontener

Klient

serwlet
danie
odpowied

wtek

70

Rozdzia 2.

Kontener odnajduje odpowiedni


serwlet na podstawie adresu URL
doczonego do dania, tworzy
lub przydziela pami dla wtku
obsugujcego to danie oraz
przekazuje do nowego wtku
serwletu obiekty reprezentujce
danie i odpowied.

Architektura wysokopoziomowa

Przegldarka
internetowa

serwlet

kontener

Klient

danie
odpowied

Przegldarka
internetowa

serwlet

kontener

Klient

odpowied
<html>
<head>
</head>
<body>
...
</body>
</html>

service()

Przegldarka
internetowa

service()

<html>
<head>
</head>
<body>
...

kontener

serwlet

Klient
Odpowied
HTTP

danie

W tym przypadku zakadamy,


e do kontenera dotaro danie
protokou HTTP typu GET.

Metoda doGet() generuje


dynamiczn stron HTML
i umieszcza j w obiekcie
odpowiedzi. Pamitaj, e kontener
cay czas utrzymuje referencj do
obiektu odpowiedzi!

doGet()

HTTP header
info

</body>
</html>

Kontener wywouje metod


service() serwletu. W zalenoci
od typu dania metoda
service() wywouje albo metod
doGet(), albo metod doPost().

brak
wtku

Dziaanie wtku si koczy,


kontener przeksztaca obiekt
odpowiedzi w odpowied protokou
HTTP, odsya t odpowied do
klienta, po czym usuwa obiekty
dania i odpowiedzi.

odpowied

jeste tutaj 

71

Kod serwletu

Jak to wszystko wyglda w kodzie


(co sprawia, e serwlet jest serwletem)?
ywistym 99,9%
W wiecie rzecz w nadpisuje
let
rw
se
h
kic
st
wszy
bd metod
metod doGet()
doPost().

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

Zwr uwag na
main(). Metody brak metody
zw
ycia serwletu (w izane z cyklem
wywoywane prze tym doGet()) s
z kontener.

99,9999% serwletw
dziedziczy wanie po
klasie HttpServlet.

public class Ch2Servlet extends HttpServlet {

W tym miejscu nasz serwlet otrzymuje


referencje do utworzonych przez
kontener obiektw reprezentujcych
danie i odpowied.

public void doGet(HttpServletRequest request,


HttpServletResponse response)
throws IOException {
PrintWriter out = response.getWriter();
java.util.Date dzisiaj = new java.util.Date();
out.println(<html> +
<body> +
<h1 style=\text-align:center> +
Nasz drugi serwlet: Ch2Servlet</h1> +
<br> + dzisiaj +
</body> +
</html>);
}

r
Obiekt klasy PrintWrite
moemy uzyska za
u
porednictwem obiekt
ego
odpowiedzi przekazan ez
naszemu serwletowi przriter
kontener. Obiekt PrintW
suy do zapisywania
w obiekcie odpowiedzi
te
tekstu HTML (mona
uy innych obiektw wanie
umoliwiajcych zapisy
,
zamiast tekstu HTML
w).
az
obr
np.

Nie ma

niemdrych pyta

P:

Pamitam o metodach doGet() oraz doPost(), ale


na poprzedniej stronie bya przecie mowa o metodzie
service(). Skd si wzia ta metoda?

O:

Twj serwlet odziedziczy j po klasie HttpServlet, ktra


z kolei odziedziczya t metod po klasie GenericServlet, ktra
odziedziczya j po zreszt, hierarchi klas opiszemy wyczerpujco
w rozdziale By serwletem, wic musisz si wykaza odrobin
cierpliwoci.

72

Rozdzia 2.

P: Do tej pory unikae wyjanienia, skd kontener wie,


gdzie szuka waciwego serwletu i jak adres URL jest
odwzorowywany na odpowiedni serwlet. Czy uytkownik
musi podawa kompletn ciek i nazw pliku klasy
serwletu?

O:

Dobre pytanie, ale odpowied brzmi nie. Poruszye jednak


bardzo istotny problem (odwzorowywania serwletu oraz wzorcw
URL), ktrym krtko zajmiemy si na kolejnych kilku stronach
i ktry dogbnie omwimy w rozdziale powiconym wdraaniu
aplikacji internetowych.

Architektura wysokopoziomowa

Zastanawiasz si pewnie, jak kontener


znajduje odpowiedni serwlet
Adres URL, ktry dociera do serwera WWW jako cz dania klienta, jest w jaki
sposb odwzorowywany na odwoanie do konkretnego serwera. Takie odwzorowywanie
adresw URL na serwlety moe si odbywa na wiele rnych sposobw i jest jednym
z kluczowych problemw, przed ktrymi stajemy w procesie wytwarzania aplikacji
internetowych. danie uytkownika musi zosta przeksztacone w prawidowe
odwoanie do konkretnego serwletu zrozumienie i (czsto) konfiguracja tego typu
odwzorowa naley do programisty aplikacji internetowej. Co o tym mylisz?

WYT UMYS
Jak kontener powinien odwzorowywa serwlety
na adresy URL?
Kiedy uytkownik robi co w swojej przegldarce (klika cze, naciska przycisk Wylij
zapytanie, wpisuje adres URL itp.), naley podj jakie kroki, ktre spowoduj wysanie
dania do konkretnego serwletu (lub innego zasobu aplikacji internetowej, np. strony JSP).
Jak to dziaa w praktyce?
Wymie zalety i wady kadego z poniszych rozwiza.
1

Zapisanie odwzorowania na stae w kodzie strony HTML. Innymi sowy,


klient wykorzystuje dokadn ciek i nazw pliku (klasy) serwletu:
ZALETY:
WADY:

Wykorzystanie do odwzorowania narzdzia dostarczonego przez producenta kontenera:


ZALETY:
WADY:

Uycie swoistej tabeli waciwoci reprezentujcej odwzorowania:


ZALETY:
WADY:

jeste tutaj 

73

Odwzorowanie adresw URL na serwlety

Serwlet moe mie a TRZY nazwy


Serwlet musi oczywicie mie nazw cieki do pliku klasy (np. classes/registration/
SignUpServlet.class), czyli ciek do faktycznego pliku klasy. Twrca oryginalnej
klasy serwletu wybiera jej nazw (i nazw pakietu, ktra definiuje odpowiedni cz
struktury katalogw), natomiast pena nazwa cieki jest uzaleniona od pooenia
pliku klasy na serwerze. Kada osoba wdraajca serwlet na serwerze WWW moe mu
dodatkowo nada specjaln nazw wdroenia. Nazwa wdroenia jest po prostu poufn
nazw wewntrzn, ktra nie musi by taka sama jak nazwa klasy lub nazwa pliku.
Nazwa wdroenia moe co prawda odpowiada nazwie klasy serwletu (registration.
SignUpServlet) lub wzgldnej ciece do pliku klasy (classes/registration/
SignUpServlet.class), ale te moe by zupenie inna (np. EnrollServlet).
I wreszcie, serwlet ma publiczn nazw URL nazw znan klientowi. Publiczn
nazw URL koduje si w jzyku HTML, dziki czemu w chwili kliknicia przez
uytkownika cza wskazujcego nasz serwlet mona t nazw wysa na serwer wraz
z daniem HTTP.
1

Klikn cze do
serwletu register/
registerMe.

Mam zamiar
wywoa serwlet
EnrollServlet.

classes

registration
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

SignUpServlet.class

Znana klientowi nazwa URL Znana wdroeniowcowi


poufna nazwa wewntrzna

Faktyczna nazwa pliku

Klient widzi adres URL serwletu (zakodowany


w jzyku HTML), ale nie wie, jak ta nazwa
serwletu zostanie w praktyce odwzorowana
na rzeczywiste katalogi i pliki skadowane na
serwerze. Publiczna nazwa URL jest swoist
podrbk stworzon specjalnie dla klientw.

Opracowana przez programist klasa


serwletu ma w peni kwalifikowan
nazw, ktra obejmuje zarwno
nazw klasy, jak i nazw pakietu.
Plik klasy serwletu ma oczywicie
rzeczywist ciek i swoj nazw
(zalen od miejsca skadowania
struktury katalogw pakietu na
serwerze WWW).

74

Rozdzia 2.

Wdroeniowiec moe stworzy nazw,


ktra bdzie znana tylko jemu i innym
uytkownikom pracujcym w rzeczywistym
rodowisku operacyjnym. Take ta nazwa
jest faszywk stworzon wycznie na
potrzeby procesu wdraania serwletu. Poufna
nazwa wewntrzna nie musi odpowiada
ani wykorzystywanej przez klienta publicznej
nazwie URL, ani rzeczywistej nazwie pliku czy
cieki do klasy serwletu.

Architektura wysokopoziomowa

Czy to nie dziwne, e kady moe


swobodnie wyraa swoj kreatywno
i definiowa wasn nazw dla tego
samego skadnika aplikacji internetowej?
W czym tkwi problem? Dlaczego nie moemy
po prostu korzysta z jednej, prawdziwej
i jednoznacznej nazwy pliku?

Odwzorowywanie nazw serwletw


poprawia elastyczno i bezpieczestwo
naszych aplikacji internetowych
Przemyl to.
Przyjmijmy, e trwale zakodowae rzeczywist ciek i nazw
pliku w swoich stronach JSP i pozostaych stronach HTTP
korzystajcych z danego serwletu. wietnie. Co w takim razie
naleaoby zrobi w razie koniecznoci reorganizacji aplikacji
i by moe przeniesienia niektrych jej skadnikw
do innej struktury katalogw? Czy naprawd chcesz wymusi
na wszystkich uytkownikach swojego serwletu znajomo
(i konieczno nieustannej weryfikacji) tej samej struktury
katalogw?
Jeli zamiast zapisywania w kodzie rdowym rzeczywistej
nazwy pliku i cieki zastosujemy mechanizm odwzorowa,
bdziemy mogli swobodnie przenosi skadniki aplikacji
bez koniecznoci koszmarnie czasochonnego wyszukiwania
i aktualizowania kodu klienta, ktry sztywno odwouje si do
starej lokalizacji plikw serwletu.
A co z bezpieczestwem? Czy naprawd zaley nam na
tym, aby klient dokadnie zna struktur plikw i katalogw
w naszym serwerze? Czy chcemy, by na przykad prbowa
bezporednio przeglda pliki serwletw bez kontroli
zapewnianej przez waciwe strony lub formularze? Nie ma
wtpliwoci, e uytkownik kocowy dysponujcy wiedz
o rzeczywistej ciece do pliku klasy serwletu bdzie mg
t ciek wpisa w swojej przegldarce, aby przynajmniej
sprbowa uzyska bezporedni dostp do tego serwletu.

jeste tutaj 

75

Odwzorowywanie serwletw w deskryptorze wdroenia

Odwzorowania adresw URL na serwlety


za porednictwem deskryptora wdroenia
Podczas wdraania naszego serwletu w kontenerze WWW musimy opracowa stosunkowo prosty dokument XML
nazywany deskryptorem wdroenia (ang. Deployment Descriptor DD), ktry na potrzeby kontenera okrela sposb,
w jaki naley wykonywa nasze serwlety i (lub) strony JSP. Deskryptory wdroenia nie su co prawda wycznie
odwzorowywaniu nazw, ale zawieraj dwa elementy jzyka XML odpowiedzialne wanie za definiowanie odwzorowa
adresw URL na serwlety jeden odwzorowuje znan klientowi publiczn nazw URL na nasz nazw wewntrzn, drugi
odwzorowuje nasz nazw wewntrzn do postaci w peni kwalifikowanej nazwy klasy.

Dwa elementy deskryptora wdroenia wykorzystywane


do odwzorowywania adresw URL:
1

<servlet>
odwzorowuje nazw wewntrzn do postaci w peni kwalifikowanej nazwy klasy

<servlet-mapping>
odwzorowuje nazw wewntrzn w publiczn nazw URL
netowa
Ta aplikacja inter h
c
skada si z dw
serwletw.

<web-app ...>

Element <servlet> mwi


kontenerowi, ktre pliki klas
s czci tej konkretnej
aplikacji internetowej.

Element <servletmapping> naley traktowa


jak rdo wiedzy
dla kontenera, ktry
w momencie otrzymania
dania pyta deskryptor
wdroenia: Ktry serwlet
powinienem wywoa dla
danego adresu URL?.

<servlet>
<servlet-name>Nazwa wewntrzna 1</servlet-name>
<servlet-class>foo.Servlet1</servlet-class>
</servlet>
<servlet>
<servlet-name>Nazwa wewntrzna 2</servlet-name>
<servlet-class>foo.Servlet2</servlet-class>
</servlet>
...................................................

Rozdzia 2.

Element <servlet-name>
jest wykorzystywany
do wizania elementu
<servlet> z konkretnym
elementem <servletmapping>. Uytkownik
kocowy aplikacji NIGDY
nie widzi tej nazwy,
poniewa definiujemy j
wycznie na potrzeby
innych elementw tego
deskryptora wdroenia.
W tym miejscu umieszczamy
w peni kwalifikowan nazw
klasy (nie stosujemy jednak
rozszerzenia .class).

<servlet-mapping>
<servlet-name>Nazwa wewntrzna 1</servlet-name>
<url-pattern>/Public1</url-pattern>
Wanie ta nazwa jest
widoczna dla klienta klient
</servlet-mapping>
j do uzyskania
wykorzystuje

dostpu do serwletu, chocia


<servlet-mapping>
nazwa ta jest sztuczna i (poza
<servlet-name>Nazwa wewntrzna 2</servlet-name> deskryptorem wdroenia)
niezwizana z rzeczywist
<url-pattern>/Public2</url-pattern>
nazw klasy serwletu.
</servlet-mapping>
W elemencie <url-

</web-app>

76

Znacznik otwierajcy <web-app> definiuje


ZNACZNIE wicej danych, ktrych jednak
nie chcemy przedstawia i omawia ju
teraz (odpowiedni przykad znajdziesz na
kocu tego rozdziau).

pattern> istnieje
stosowania symboli wieloznaczny moliwo
ch wicej informacji
na ich temat i na temat cieek
znajdziesz w dalszej
czci tego rozdziau.

Architektura wysokopoziomowa

Zaczekaj! W deskryptorze wdroenia


moemy zrobi znacznie wicej
Poza definiowaniem odwzorowa adresw URL na rzeczywiste
nazwy serwletw, deskryptory wdroenia mona wykorzystywa do
dostosowywania do naszych potrzeb take innych aspektw aplikacji
internetowej, jak role bezpieczestwa, strony o bdach, biblioteki
znacznikw, informacje o konfiguracji pocztkowej czy wrcz (jeli
korzystamy z penowartociowego serwera J2EE) deklaracje dostpu do
konkretnych komponentw Enterprise JavaBeans (EJB).
Nie przejmuj si na razie szczegami. Pki co zasadnicze znaczenie ma
dla nas moliwo deklaratywnego modyfikowania naszej aplikacji na
poziomie deskryptora wdroenia zamiast wprowadzania zmian w kodzie
rdowym (i ponownego kompilowania tego kodu)!
Pomyl tylko oznacza to, e nawet osoby niebdce programistami
Javy mog dostosowywa do swoich potrzeb napisane w tym jzyku
aplikacje internetowe bez koniecznoci zawracania nam gowy
i zakcania wakacji w tropikach.

Deskryptor wdroenia (DD)


oferuje nam mechanizm
deklaratywnego
dostosowywania aplikacji
internetowych do potrzeb
uytkownika bez koniecznoci
modyfikowania ich kodu
rdowego!

Nie ma

niemdrych pyta

P:

Mam kopot. W przedstawionym deskryptorze wdroenia


nadal nie widz niczego, co mogoby wskazywa na rzeczywist
nazw cieki do serwletu! Deskryptor wspomina tylko o nazwie
klasy. Nadal nie ma wic odpowiedzi na pytanie, w jaki sposb
kontener wykorzystuje t nazw do odnajdywania konkretnych
plikw klas serwletw. Moe istnieje gdzie INNE odwzorowanie,
ktre okrela, e taka i taka nazwa klasy jest odwzorowywana na
taki i taki plik w takiej i takiej lokalizacji?

O:

Wiedziaem, e zwrcisz na to uwag. Masz racj w elemencie


<servlet-class> w deskryptorze wdroenia umieszczamy jedynie nazw klasy
(w peni kwalifikowan, a wic z nazw pakietu). Wynika to z faktu, i kontener
dysponuje okrelonym miejscem, w ktrym odnajduje wszystkie te serwlety, dla
ktrych w deskryptorze wdroenia zdefiniowano odpowiednie odwzorowania.
W praktyce kontener stosuje wyszukany zbir regu do odnajdywania
pasujcych do siebie adresw URL (pochodzcych z da klienta)
i rzeczywistych klas Javy (przechowywanych gdzie w serwerze). Omwimy
to zagadnienie bardziej szczegowo w dalszej czci tej ksiki (w rozdziale
powiconym wdraaniu aplikacji internetowych). Na razie w zupenoci
wystarczy, jeli zapamitasz, e definiowanie tego typu odwzorowa nie
wymaga adnych dodatkowych czynnoci.

Zalety deskryptorw
wdroenia

Minimalizuj liczb operacji na kodzie


rdowym, ktry przeszed ju niezbdne testy.
Umoliwiaj nam dostosowywanie moliwoci
naszej aplikacji, nawet jeli nie mamy dostpu
do kodu rdowego.
Daj moliwo przystosowywania naszej
aplikacji do korzystania z rnych zasobw
(np. baz danych) bez koniecznoci ponownego
kompilowania i testowania kodu rdowego.
Uatwiaj zarzdzanie dynamicznymi reguami
bezpieczestwa, w tym listami kontrolnymi
i rolami bezpieczestwa.
Osobom niebdcym programistami
umoliwiaj modyfikowanie i wdraanie
naszych aplikacji internetowych w czasie, gdy
my moemy si koncentrowa na ciekawszych
zajciach (np. na doborze najlepszych ciuchw
przed wyjazdem nad morze).

jeste tutaj 

77

Witryna randkowa Boba

Opowiadanie: Bob buduje witryn swatajc


Umawianie si na randki jest w dzisiejszych czasach dosy trudne. Kto ma na to czas, skoro zawsze
jest jaki dysk do zdefragmentowania? Bob, ktry chce wej w interes dot.com (zamy na chwil,
e rynek tego typu witryn nie jest jeszcze nasycony), wierzy, e stworzenie specjalnej witryny
randkowej dla pasjonatw informatyki bdzie jego przepustk do wielkiej kariery i ostatecznego
porzucenia dotychczasowej roli komiksowego Dilberta.
Problem w tym, e Bob by menederem projektw informatycznych tak dugo, e nie jest ju
zbyt biegy we wspczesnych technikach inynierii oprogramowania. Zna jednak kilka trudnych
poj oraz niektre konstrukcje Javy; powici te troch czasu na pobien lektur materiaw
o serwletach, zatem byskawicznie opracowa niezbdny projekt i przystpi do kodowania...

Chc stworzy elastyczn


witryn randkow, na ktrej informatycy
bd mogli si spotyka i czy w pary.
Poniewa nie kademu udaje si
zainstalowa Linuksa

Podaj swj stan


Zajcie

Randki
78% naszych transakcji koczy si zatwierdzeniem
(poleceniem COMMIT).

Wiek
OS
Atrybuty
Wyjtki

Zczenie

Deklaracja typu

Wstaw

Zapytanie DQL
Dostosuj mj profil

Zapytanie
Skonstruuj swj acuch randkowego jzyka
zapyta (Dating Query Language DQL):

Wyniki zapytania DQL

Dostosuj mj profil
Zmodyfikuj swj profil

Dalej

Popraw

78

Rozdzia 2.

Wicej

Architektura wysokopoziomowa

Bob przystpi do tworzenia garci serwletw


po jednym dla kadej strony
Bob rozwaa zastosowanie tylko jednego serwletu penego niezbdnych wyrae
warunkowych, ale ostatecznie zdecydowa, e podzia funkcjonalnoci pomidzy wiele
osobnych serwletw bdzie rozwizaniem waciwszym kady serwlet powinien
odpowiada za generowanie i obsug pojedynczej strony (strony zapytania, strony
zapisywania do serwisu, strony wynikw wyszukiwania itp.).
Kady serwlet obejmuje kompletn logik biznesow niezbdn do zmodyfikowania
lub odczytania zawartoci bazy danych oraz zapisania w strumieniu odpowiedzi
(a wic odesania do klienta) odpowiedniego kodu HTML.

Nareszcie mam
prawdziwie obiektowy
projekt aplikacji. Kady
z moich serwletw bdzie
realizowa dokadnie jedno
zadanie.

// polecenia importowania
public class DatingServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
// w tym miejscu jest zakodowana logika biznesowa
// biecego serwletu; wykonywany kod zaley od zakresu
// dziaa danego serwletu (zapis w bazie danych,
// wykonanie zapytania itp.)
PrintWriter out = response.getWriter();
// wygeneruj dynamiczn stron HTML
out.println(w tym miejscu znajduje si co naprawd okropnego);
}
}

komputer serwera WWW


101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputDQLServlet
DoDQLQueryServlet

SignupServlet

BD

serwer
WWW/kontener
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

MainPageServlet

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

AcceptSignupServlet
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

Serwlet podejmuje wszystkie


dziaania niezbdne do
przetworzenia otrzymanego
dania (jak wstawienie
rekordu do bazy danych
lub jej przeszukanie), po
czym zwraca stron HTML
za porednictwem obiektu
reprezentujcego odpowied
protokou HTTP.
Caa logika biznesowa ORAZ
odpowied ze stron HTML
dla klienta znajduje si
wewntrz kodu serwletu.

AcceptProfileChangesServlet

InputProfileChangesServlet

jeste tutaj 

79

Bob dodaje strony JSP

Po jakim czasie okazao si jednak, e taki model


bdzie niepraktyczny, zatem Bob doda kilka stron JSP
Te irytujce wywoania metody println(), ktre zapisyway wynikow stron
HTML w obiekcie odpowiedzi, byy na tyle nieporczne, e Bob zdecydowa si
Ten projekt ze
poczyta troch o stronach JSP i przemodelowa swoj aplikacj. Od tej pory kady
stronami JSP jest zdecydowanie lepszy.
Kod serwletu jest teraz bardziej
serwlet bdzie realizowa odpowiedni fragment logiki biznesowej (wykonywa
przejrzysty kady serwlet realizuje
zapytanie na bazie danych, wstawia lub aktualizowa rekord bazy danych itp.),
wycznie pewien wycinek logiki biznesowej,
po czym bdzie przekazywa danie do odpowiedniej strony JSP, ktra wygeneruje
po czym wywouje okrelon stron JSP, ktra
stron HTML dla klienta. W ten sposb Bob oddzieli logik biznesow od
obsuguje zadania zwizane z generowaniem
prezentacji a poniewa czyta troch o projektowaniu oprogramowania, dobrze
dla klienta kodu HTML wysyanego
w odpowiedzi HTTP. Tym samym skutecznie
wie, e podzia odpowiedzialnoci jest dobrym posuniciem.
oddzieliem logik biznesow od
prezentacji.

// polecenia importowania
public class DatingServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws IOException {
//
//
//
//

w tym miejscu jest zakodowana logika biznesowa


biecego serwletu; wykonywany kod zaley od zakresu
dziaa danego serwletu (zapis w bazie danych,
wykonanie zapytania itp.)

// przeka danie do konkretnej strony JSP


// zamiast prbowa samodzielnie zapisywa kod
// HTML w strumieniu wyjciowym
}
}
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputSignupServlet

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

AcceptSignupServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputProfileChangesServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputSignupJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

AcceptProfileChangesServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

AcceptSignupJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

MainPageServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputProfileChangesJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputDQLServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

AcceptProfileChangesJSP

MainPageJSP

Przegldarka
internetowa

POST: DoDQLQuery

Klient

80

Rozdzia 2.

uery

DoDQLQ

Odpowied HTML
serwer
WWW/kontener

Select
Wyniki
zapytania DQL

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

DoDQLQueryServlet

Odpowie

d HTM

wynik

DoDQlQueryServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputDQLJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

BD

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

DoDQLQueryJSP

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

DoDQLQueryJSP

Klient wypenia formularz


zapytania DQL i klika przycisk
Dalej. W efekcie wysyane jest
danie POST protokou HTTP
dla serwletu DoDQLQuery.
Serwer WWW wywouje dany
serwlet, ktry z kolei na bazie
otrzymanych danych wykonuje
odpowiednie zapytanie
i przekazuje danie dalej
do odpowiedniej strony JSP.
Strona JSP buduje dokument
HTML i odsya go z powrotem
do klienta.

Architektura wysokopoziomowa

Ale dopiero wtedy kolega zapyta go:


STOSUJESZ wzorzec projektowy MVC, prawda?
Kim chcia wiedzie, czy usuga umawiania na randki bdzie dostpna z poziomu aplikacji
z graficznym interfejsem uytkownika (GUI) opartym na komponentach Swing.
Bob odrzek: No c, nie mylaem o tym. Wwczas Kim odpowiedzia:
Nie przejmuj si, to aden problem pewnie zastosowae wzorzec MVC
Co zrobisz, kiedy
niewiadomie, wic bdziemy mogli bez trudu stworzy klienta Swing
zaistnieje potrzeba zastosowania
GUI, ktry uzyska dostp do Twoich klas logiki biznesowej.
dla Twojej usugi randkowej aplikacji
Bob przekn lin.
Kim odpowiedzia: Tylko nie mw, e nie stosowae MVC?.

z graficznym interfejsem uytkownika


opartym na komponentach Swing; aplikacji,
ktra bdzie korzystaa z tej samej
logiki biznesowej?

Bob powiedzia: C, oddzieliem prezentacj od logiki biznesowej.


Kim odrzek: To dopiero pocztek ale, niech zgadn pewnie umiecie ca logik
biznesow w serwletach!?.
Bob nagle uwiadomi sobie, dlaczego na pewnym etapie swojej kariery zrezygnowa
z programowania na rzecz zarzdzania.
Jest jednak na tyle zdeterminowany by doprowadzi swoj aplikacj do waciwego koca,
e poprosi Kima o byskawiczny przegld tajemniczego wzorca MVC.

Stosowanie wzorca projektowego MVC oznacza, e logika


biznesowa jest nie tylko oddzielona od prezentacji
logika biznesowa nie powinna nawet wiedzie,
e ISTNIEJE jaka prezentacja.
Istot wzorca MVC (ang. Model View Controller) jest nie tylko oddzielenie logiki
biznesowej od prezentacji, ale take umieszczenie czego pomidzy nimi, dziki czemu
moliwe bdzie utrzymywanie logiki biznesowej w samodzielnej klasie Javy wielokrotnego
uytku, ktra nie musi dysponowa adn wiedz o dziaaniach widoku.
Bob by cakiem blisko, poniewa sam wpad na pomys rozdzielenia logiki biznesowej
i prezentacji, ale w jego aplikacji logika biznesowa pozostawaa w cisym zwizku
z widokiem. Innymi sowy, Bob wczy logik biznesow do serwletu i tym samym
wykluczy moliwo ponownego wykorzystania tego kodu z innym widokiem
(np. aplikacj Swing GUI czy nawet aplikacj mobiln). Jego logika biznesowa utkna
w serwletach, a powinna si znale w osobnych klasach Javy, ktrych Bob mgby uywa
w przyszoci.

jeste tutaj 

81

Wzorzec projektowy MVC

Rozwizaniem zaistniaego problemu jest zastosowanie


wzorca projektowego model-widok-kontroler (MVC)
Gdyby Bob zna i rozumia wzorzec projektowy MVC, wiedziaby, e logika
biznesowa nie powinna by osadzana w ramach serwletu bd serwletw.
Zdawaby sobie spraw, e umieszczanie logiki biznesowej w kodzie serwletu
powoduje ogromne komplikacje w razie koniecznoci uzyskania dostpu do
serwisu randkowego z poziomu innej aplikacji (np. aplikacji z interfejsem GUI
opartym na komponentach Swing). Wzorcowi projektowemu MVC (i innym
wzorcom) powicimy co prawda znacznie wicej uwagi w dalszej czci tej
ksiki, jednak teraz powiniene przej krtki kurs na ten temat, poniewa
na kocu tego rozdziau zaprezentujemy przykadow aplikacj zbudowan
wanie w oparciu o wzorzec MVC.
Jeli znasz ju wzorzec projektowy MVC, zapewne wiesz, e wzorzec ten
nie dotyczy wycznie serwletw i stron JSP jednoznaczne oddzielenie
logiki biznesowej od prezentacji jest rwnie istotne we wszelkiego
rodzaju aplikacjach. Okazuje si jednak, e wanie w przypadku aplikacji
internetowych taki podzia jest szczeglnie istotny, poniewa nie mona
zakada, e nasza logika biznesowa bdzie udostpniana wycznie za
porednictwem stron WWW! Jestemy przekonani, e Twoje dowiadczenie
w pracy programisty w zupenoci wystarczy, aby rozumie, e jedynym pewnym
aspektem procesu wytwarzania oprogramowania jest stale modyfikowana
specyfikacja.

Wzorzec projektowy MVC


w wiecie serwletw i stron JSP

KONTROLER
Serwlet

82

Rozdzia 2.

Wyodrbnia z dania dane wejciowe uytkownika


i okrela, co te dane oznaczaj dla biecego Modelu.
Nakazuje Modelowi samoaktualizacj i sprawia,
e stan nowego Modelu jest dostpny dla widoku
(w tym przypadku strony JSP).

WIDOK
Odpowiada za
prezentacj. Otrzymuje
od Kontrolera stan Modelu
(przekazywanie stanu
nie odbywa si jednak
bezporednio Kontroler
umieszcza dane Modelu
w miejscu, z ktrego
Widok moe je odczyta).
Widok jest take t
czci aplikacji, ktra
pobiera dane wejciowe
uytkownika (przekazywane
nastpnie Kontrolerowi).

Model*Widok*Kontroler
(MVC) wyciga logik
biznesow poza serwlet
i umieszcza j w Modelu,
czyli tradycyjnych,
zwykych klasach Javy
wielokrotnego uytku.
Model jest kombinacj
danych biznesowych (np.
stanu koszyka z zakupami)
i metod (regu), ktre na
tych danych operuj.

Kontroler

MODEL
Zawiera waciw logik biznesow i stan
aplikacji. Innymi sowy, zna reguy uzyskiwania
i aktualizowania tego stanu.

JSP

Stara
dobra
Java

Widok

Czci Modelu we wzorcu projektowym MVC


bdzie np. zawarto koszykw z zakupami
(wraz z reguami okrelajcymi moliwe
dziaania na tej zawartoci).

class Foo {
void bar()
{
doBar();
}
}

Model
BD

Model jest jedyn czci systemu


wsppracujcym z baz danych (chocia
w wielu przypadkach wykorzystuje inny
obiekt do faktycznej komunikacji z baz
danych omwienie tego wzorca zostawimy
sobie jednak na pniej).

Architektura wysokopoziomowa

Stosowanie wzorca projektowego MVC


dla aplikacji internetowej Boba
Bob wie ju, co musi zrobi. Powinien oddzieli logik biznesow
od serwletw i dla kadego z nich stworzy zwyk klas Javy
klasy te bd tworzyy Model.
Po wprowadzeniu tych zmian oryginalny serwlet bdzie peni
funkcj Kontrolera, nowa klasa logiki biznesowej bdzie
wystpowaa w roli Modelu, a uyte strony JSP bd tworzyy
Widok aplikacji.
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputSignupModel
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputSignupServlet

AcceptSignupModel

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

AcceptSignupServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputSignupJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputProfileChangesModel

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputProfileChangesServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

AcceptSignupJSP

j aplikacji Bob
Dla kadej strony swojetem (Kontroler),
wle
ser
dysponuje teraz
z stron JSP
klas Javy (Model) ora
k).
ido
(W

AcceptProfileChangesServlet

InputProfileChangesJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

MainPageServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

AcceptProfileChangesJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

MainPageModel

AcceptProfileChangesModel
101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

MainPageJSP

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputDQLModel

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

InputDQLServlet

DoDQLQueryModel

101101 101101
10101000010
1010 10 0
01010 1
1010101
10101010
1001010101 1
0 1 10 10

DoDQLQueryServlet

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

InputDQLJSP

<html>
<body>
Refactor
<%= new Foo() %>
<% // more here %>
more here
</body>
</html>

DoDQLQueryJSP

Jak mylisz: jestem


dobry, czy jeszcze lepszy?
Na tym wanie polega
perfekcyjny projekt MVC.

jeste tutaj 

83

No dobrze, ale czy ten projekt jest dobry?

Ale wtedy na ca aplikacj rzuci okiem jego przyjaciel Kim


Kim odwiedzi Boba, spojrza na jego aplikacj i stwierdzi, e JEST to co prawda
projekt MVC, ale jego architektura jest zupenie nieprzemylana. To fakt, logika
biznesowa zostaa wyodrbniona i umieszczona w Modelu, a serwlety peni funkcj
Kontrolerw dziaajcych pomidzy Modelami a Widokami, zatem Modele
teoretycznie mog nie mie pojcia o istnieniu Widokw. Taki podzia jest
oczywicie podany, warto jednak zwrci uwag na wszystkie te mae serwlety.
Co tak naprawd te serwlety robi? Skoro logika biznesowa znajduje si ju
w bezpiecznej odlegoci od serwletw (Kontrolerw) w osobnych klasach
tworzcych Model same serwlety nie maj zbyt wiele do roboty poza ogln obsug
aplikacji i (tak, pamitam o tym) aktualizacj Modelu i wywoywaniem stron Widoku.

W yciu nie widziaem


tak beznadziejnego projektu!
Spjrz na ten powielany kod
we wszystkich serwletach. Musisz
doda jeden wsplny kod aplikacji
(np. dotyczcy bezpieczestwa),
ktry bdzie wykorzystywany we
wszystkich serwletach.

Zasadnicz wad Twojego rozwizania jest to, e oglna logika aplikacji jest powielana
w kadym z tych cholernych serwletw! Jeli bdziesz musia zmieni cho jeden drobiazg,
odpowiednie modyfikacje bdziesz musia wprowadza we wszystkich serwletach. Konserwacja
tego rodzaju aplikacji jest koszmarem.
No tak, czuem, e z tym powielanym kodem co jest nie tak odpowiedzia Bob ale c
innego mogem w tej sytuacji zrobi? Nie chcesz chyba, ebym jeszcze raz umieszcza wszystko
w jednym serwlecie? Czy takie rozwizanie miaoby w ogle sens?.

No nie NAPRAWD
chcesz, ebym znowu umieci
wszystko w jednym serwlecie?
A co z ide programowania
obiektowego?

84

Rozdzia 2.

Architektura wysokopoziomowa

Czy istnieje rozwizanie?


Czy Bob powinien wrci do jednego
serwletu Kontrolera, aby unikn
powtarzania kodu? Czy takie rozwizanie
bdzie zgodne z koncepcj programowania
obiektowego przecie kady ze stosowanych
do tej pory serwletw w praktyce robi co
innego? Czy Keanu Reeves rzeczywicie
zna Kung Fu?

WYT UMYS
Zostaw ten problemy na pniej my te tak zrobimy.
Jak sdzisz? Czy znasz odpowied? Czy w ogle
ISTNIEJE jedna odpowied? Czy zgodnie
z propozycj Boba pozostawiby istniejce
serwlety, czy moe umieciby ten kod
w jednym serwlecie Kontrolera? A gdyby
faktycznie uy jednego Kontrolera dla
wszystkich dziaa, skd taki Kontroler
wiedziaby, ktry Model i Widok
wywoywa?
To pytanie pozostanie bez odpowiedzi
niemal do samego koca tej ksiki,
zatem nie tra na nie zbyt duo czasu
i przeka je wtkowi pracujcemu w tle
Twojego umysu

jeste tutaj 

85

Refleksja nad rozdziaem 2.

Zaostrz owek

Jeli zastosujemy wzorzec projektowy MVC


w wiecie serwletw i stron JSP, kady z trzech
wykorzystywanych komponentw (strona JSP, klasa
Javy oraz serwlet) bdzie odgrywa jedn z trzech rl
MVC. Oznacz kkami litery M, V i C w zalenoci od
tego, jak funkcj w ramach wzorca MVC odgrywa
dany komponent. Dla kadego komponentu
powiniene oznaczy w ten sposb tylko jedn liter.

M
V
C
JSP

class Foo {
void bar() {
doBar();
}
}

M
V
C

klasa Javy
niebdca
serwletem

serwlet

Ktre elementy wzorca projektowego MVC


reprezentuj poszczeglne litery skadajce si
na akronim MVC?

M oznacza
V oznacza
C oznacza

86

M
V
C

Rozdzia 2.

KLUCZOWE
ZAGADNIENIA
Kontener zapewnia naszej aplikacji internetowej
obsug komunikacji, zarzdzanie cyklem
ycia, obsug przetwarzania wielowtkowego,
bezpieczestwo deklaratywne oraz pen obsug
stron JSP dziki temu moemy si skoncentrowa
na tworzeniu logiki biznesowej tej aplikacji.
Kontener tworzy obiekty dania i odpowiedzi,
ktre mog by wykorzystywane przez serwlety
(i inne skadniki aplikacji internetowej) do
uzyskiwania niezbdnych informacji o daniu
i odsyania odpowiednich danych do klienta.
Typowy serwlet jest klas dziedziczc po klasie
HttpServlet (rozszerzajc klas HttpServlet)
i nadpisujc przynajmniej jedn z metod
odpowiadajcych metodom protokow HTTP
wywoywanym przez przegldark internetow
(doGet(), doPost() itp.).
Wdroeniowiec moe odwzorowa klas serwletu
na odpowiedni adres URL, ktry bdzie dostpny dla
klientw zainteresowanych wysyaniem da do
danego serwletu. Nazwa uyta w adresie URL moe
nie mie nic wsplnego z faktyczn nazw pliku
klasy.

Architektura wysokopoziomowa

Zaostrz owek

Kto za co odpowiada?
Wypenij ponisz tabel. Okrel, czy serwer WWW, kontener, a moe serwlet
odpowiada w najwikszym stopniu za realizacj wymienionych zada. W kilku
przypadkach prawidowa moe by wicej ni jedna odpowied. Jako zadanie
dodatkowe umie w tabeli krtkie komentarze opisujce poszczeglne procesy.

Zadanie

Serwer WWW

Kontener

Serwlet

Tworzenie obiektw dania


i odpowiedzi
Wywoywanie metody service()

Uruchamianie nowych wtkw


obsugujcych przychodzce dania
Konwersja obiektu odpowiedzi do
postaci odpowiedzi protokou HTTP
Znajomo protokou HTTP

Dodawanie kodu HTML do obiektu


odpowiedzi
Utrzymywanie referencji do
obiektw odpowiedzi
Odnajdywanie adresw URL
w deskryptorze wdroenia
Usuwanie obiektw dania
i odpowiedzi
Koordynowanie tworzenia
dynamicznej zawartoci stron
Zarzdzanie cyklami ycia

Posiadanie waciwej dla elementu


<servlet-class> nazwy
z deskryptora wdroenia

jeste tutaj 

87

wiczenie z serwletw i deskryptorw wdroenia

Magnesiki metod
Fragmenty kodu dziaajcego serwletu i odpowiadajcego mu
deskryptora wdroenia wymieszano na drzwiach lodwki. Czy
potrafisz prawidowo poczy te fragmenty, aby z powrotem
otrzyma waciwe listingi serwletu i deskryptora wdroenia,
ktrych adres URL koczy si sowem /Dice? Pamitaj, e
na lodwce mog si znajdowa dodatkowe magnesy, ktrych
w oglne nie bdziesz potrzebowa.

wiczenie

Serwlet
public class

extends HttpServlet {

public void doGet(

throws IOException
{

String d1 = Integer.toString((int)((Math.random()*6)+1));
String d2 = Integer.toString((int)((Math.random()*6)+1));
out.println("<html> <body> " +
"<h1 align=center>Serwlet rzucajcy kostkami do
gry: Ch2Dice</h1>" +
"<p>Wyrzucono liczby " + d1 + " i " + d2 +
"</body> </html>");
}
}

Deskryptor wdroenia
<web-app

...

>

(Pamitaj, e nie jest to kompletny znacznik otwierajcy


<web-app>; prawidowy przykad tego znacznika przedstawimy
na kocu tego rozdziau. Nie ma to oczywicie wpywu na
rozwizanie tego wiczenia.)

C2dice </servlet-name>

</web-app>

88

Rozdzia 2.

Architektura wysokopoziomowa

Magnesiki z kodem, kontynuacja


import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

</url-pattern>
public void service(

C2dice

Ch2Dice

ServletRequest request,

<servlet-name>

PrintWriter out = response.get


Writer();

HttpServletResponse response)

<servlet-mapping>
C2dice

ServletResponse resp
onse,

<servlet-name>
/Dice

</servlet-class>
HttpServletRequest request,

Ch2Dice

<servlet>
/Dice

PrintWriter out
= request.getWri
te

r();

</servlet-name>

<url-pattern>
Ch2Dice

</servlet>

</servlet-mapping>

<servlet-class>

jeste tutaj 

89

Rozwizanie wiczenia z odpowiedzialnoci

ROZWIZANIA
WICZE

Zadanie

Serwer WWW

Kontener

Tworzenie obiektw dania


i odpowiedzi

Bezporednio przed
uruchomieniem wtku.

Wywoywanie metody service()

Metoda service() wywouje


nastpnie metod doGet()
lub doPost().

Uruchamianie nowych wtkw


obsugujcych przychodzce dania

Uruchamia wtek serwletu.


Generuje strumie odpowiedzi
HTTP na podstawie danych
zawartych w obiekcie
odpowiedzi.

Konwersja obiektu odpowiedzi do


postaci odpowiedzi protokou HTTP
Znajomo protokou HTTP

Wykorzystuje protok
HTTP do komunikacji
z przegldark klienta.

Dodawanie kodu HTML do obiektu


odpowiedzi

Przeznaczona dla klienta


dynamiczna tre strony.

Utrzymywanie referencji do
obiektw odpowiedzi

Przekazuje referencj
serwletowi.

Odnajdywanie adresw URL


w deskryptorze wdroenia

W ten sposb odnajduje


serwlet waciwy dla
otrzymanego dania.

Usuwanie obiektw dania


i odpowiedzi

Po zakoczeniu pracy przez


serwlet.

Koordynowanie tworzenia
dynamicznej zawartoci stron
Zarzdzanie cyklami ycia

Przechowywanie waciwej dla


elementu <servlet-class>
z deskryptora wdroenia

90

Rozdzia 2.

Serwlet

Wie, jak przekazywa


odpowiednie dane do
kontenera.

Wykorzystuje referencj do
przekazania odpowiedzi.

Wie, ktry serwlet naley


wywoa.
Wywouje metod service()
(i, jak si przekonamy, nie
tylko).
public class Cokolwiek

Architektura wysokopoziomowa

Serwlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class

extends HttpServlet {

Ch2Dice

public void doGet(

HttpServletRequest request,
HttpServletResponse response)
throws IOException {

PrintWriter out = response.getWriter();


String d1 = Integer.toString((int)((Math.random()*6)+1));
String d2 = Integer.toString((int)((Math.random()*6)+1));
out.println("<html> <body> " +
"<h1 align=center>Serwlet rzucajcy kostkami do gry: Ch2Dice</h1>" +
"<p>Wyrzucono liczby " + d1 + " i " + d2 +
"</body> </html>");
}
}

Deskryptor wdroenia
<web-app

...

>

<servlet>
<servlet-name>

C2dice </servlet-name>
Ch2Dice

<servlet-class>

</servlet-class>

</servlet>
<servlet-mapping>
<servlet-name>
<url-pattern>

C2dice
/Dice

</servlet-name>
</url-pattern>

</servlet-mapping>
</web-app>

jeste tutaj 

91

Dwa obiekty, dwa stosy

Dziaajcy deskryptor wdroenia (DD)


Na razie nie musisz si martwi o rzeczywiste znaczenia poszczeglnych
fragmentw deskryptora wdroenia (w dalszych rozdziaach zdobdziesz
odpowiedni wiedz i zostaniesz z tej wiedzy rozliczony). W tym miejscu
chcemy Ci tylko pokaza deskryptor wdroenia web.xml, ktry faktycznie
dziaa. W pozostaych przykadach prezentowanych w tym rozdziale
pominiemy sporo fragmentw otwierajcego znacznika <web-app>.
(Teraz ju wiesz, dlaczego nie rezygnowalimy z jego kadorazowego
powielania).

Sposb, w jaki czsto przedstawiamy deskryptory


wdroenia w tej ksice:
<web-app ...>

cy znacznik
Uyty tutaj otwieraj pletny.
kom
nie
t
jes
pp>
b-a
<we

<servlet>
<servlet-name>Ch3 Piwo</servlet-name>
<servlet-class>com.example.web.WyborPiwa</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch3 Piwo</servlet-name>
<url-pattern>/WybierzPiwo.do</url-pattern>
</servlet-mapping>
</web-app>

RZECZYWISTA posta deskryptora wdroenia:

znacznikw
h w tym miejscu
adnego z uytycE musisz zapamitywa.
otwierajcych NI ntenera, ktry jest zgodny ze .
Jeli uywasz ko letw w wersji 2.4 (tak jest np
specyfikacj serw era Tomcat 5), wystarczy te
deskryptorw.
w przypadku serw
a i wkleja do
znaczniki kopiow

<web-app xmlns=http://java.sun.com/xml/ns/j2ee
xmlns:xsl=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
version=2.4>
<servlet>
<servlet-name>Ch3 Piwo</servlet-name>
<servlet-class>com.example.web.WyborPiwa</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ch3 Piwo</servlet-name>
<url-pattern>/WybierzPiwo.do</url-pattern>
</servlet-mapping>
</web-app>

92

Rozdzia 2.

Architektura wysokopoziomowa

Jaka w tym wszystkim jest rola platformy J2EE?


Java 2 Enterprise Edition (w skrcie J2EE) jest pewnego rodzaju
superspecyfikacj, poniewa obejmuje wiele innych specyfikacji, wcznie ze
specyfikacj serwletw w wersji 2.4 oraz specyfikacj stron JSP w wersji 2.0
(obie obowizuj kontenery WWW). Warto jednak pamita, e platforma
J2EE 1.4 obejmuje take specyfikacj komponentw Enterprise JavaBeans
(w skrcie EJB) w wersji 2.1, ktra z kolei obowizuje twrcw kontenerw
EJB. Innymi sowy, kontener WWW ma na celu obsug komponentw
WWW (serwletw i stron JSP), natomiast zadaniem kontenera EJB jest
obsuga komponentw biznesowych.
Serwer aplikacji w peni zgodny ze specyfikacj J2EE musi zawiera
zarwno kontener WWW, jak i kontener EJB (a take inne mechanizmy, jak
implementacja standardw JNDI i JMS). Warto pamita, e np. Tomcat
jest jedynie kontenerem WWW! Jego zgodno ze specyfikacj J2EE
dotyczy wycznie elementw skadajcych si na kontener WWW.
Tomcat jest kontenerem WWW, a nie kompletnym serwerem aplikacji
J2EE, poniewa nie oferuje funkcjonalnoci kontenera EJB.

Serwer aplikacji J2EE zawiera


zarwno kontener WWW,
JAK I kontener EJB.
Tomcat jest co prawda
kontenerem WWW, ale NIE
jest kompletnym serwerem
aplikacji J2EE.
Specyfikacja J2EE 1.4
obejmuje specyfikacj
serwletw w wersji 2.4,
specyfikacj stron JSP
w wersji 2.0 oraz specyfikacj
technologii EJB w wersji 2.1.

Serwer aplikacji J2EE


Kontener WWW

Kontener EJB

Serwlet
<html>
<body>
<jsp:setProperty
name=foo
property=bar>
</body>
</html>

Serwlety i strony JSP

P:

Czy fakt, i Tomcat jest samodzielnym kontenerem


WWW, oznacza, e istniej samodzielne (autonomiczne)
kontenery EJB?

O:

W dawnych czasach (powiedzmy, e w roku 2000) istniay


kompletne serwery aplikacji J2EE, samodzielne kontenery WWW
oraz samodzielne kontenery EJB. Obecnie jednak niemal wszystkie
kontenery EJB stanowi elementy skadowe penowartociowych
serwerw J2EE, cho istnieje jeszcze kilka autonomicznych
kontenerw WWW (np. Tomcat i Resin).

BD

Komponenty Enterprise JavaBean

Samodzielne kontenery WWW s zwykle konfigurowane w taki


sposb, aby moliwa bya ich wsppraca z serwerami WWW
wykorzystujcymi protok HTTP (np. z serwerem Apache),
chocia np. Tomcat sam oferuje moliwo funkcjonowania w roli
prostego serwera HTTP. Warto jednak pamita, e funkcjonalno
Tomcata w tym zakresie daleka jest od moliwoci Apachea, zatem
wikszo aplikacji internetowych pozbawionych komponentw
EJB wykorzystuje odpowiednio skonfigurowane serwery Apache
i Tomcat gdzie Apache peni funkcj serwera WWW, natomiast
Tomcat wystpuje w roli kontenera.
Do najbardziej popularnych serwerw J2EE nale: WebLogic firmy
BEA, JBoss AS typu open source oraz WebSphere firmy IBM.

jeste tutaj 

93

You might also like