Académique Documents
Professionnel Documents
Culture Documents
Od podstaw
Autor: Chris Ullman, Lucinda Dykes
Tumaczenie: Anna Trojan
ISBN: 978-83-246-1287-1
Tytu oryginau: Beginning Ajax
(Programmer to Programmer)
Format: B5, stron: okoo 540
oprawa twarda
Wprowadzenie do technologii Ajax dla webmasterw
Jak tworzy interaktywne aplikacje webowe w technologii Ajax?
Jak pisa i wykorzystywa wzorce projektowe w Ajax?
Dlaczego warto skorzysta z moliwoci Ajaksa?
Cho technologia znana jest od koca ubiegego wieku, uznanie zdobya dopiero par
lat temu, kiedy Google zaczo uywa jej na wiksz skal w swoich projektach.
Wtedy webmasterzy odkryli, jaka sia tkwi w poczonych technologiach, kryjcych si
pod nazw Ajax. Docz do nich i wzboga swoje strony WWW, co sprawi, e stan si
interaktywne bardziej ni kiedykolwiek.
Ajax. Od podstaw to ksika dla twrcw witryn internetowych, ktrzy chc
poszerzy swoje umiejtnoci o niesamowit technologi Ajax. Chris Ullmann i Lucinda
Dykes, autorzy i wspautorzy wielu ksiek o technikach programowania, przekazuj
tu swoje wieloletnie dowiadczenie. Uatwiaj czytelnikowi opanowanie jzyka,
przechodzc od podstawowych do coraz bardziej zoonych przypadkw opartych
na rzeczywistych przykadach. Narracyjny styl ksiki sprawia, e jest przyjazna
czytelnikowi, a usystematyzowany ukad czyni j przejrzyst.
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treci
O autorach ................................................................................................................................................13
Wprowadzenie .........................................................................................................................................15
Rozdzia 1. Wprowadzenie do Ajaksa ..................................................................................................... 23
Czym jest Ajax? ............................................................................................................ 24
Ajax w praktyce ....................................................................................................... 25
flickr ................................................................................................................. 25
Basecamp ......................................................................................................... 27
Amazon (A9.com) ............................................................................................... 28
Google Suggest oraz Google Maps ...................................................................... 29
Inne strony internetowe ...................................................................................... 30
Ze przykady ..................................................................................................... 31
Ajax akronim ...................................................................................................... 32
XHTML oraz CSS ................................................................................................ 33
DOM (Document Object Model) ........................................................................... 34
JavaScript ......................................................................................................... 35
XML, XSLT oraz XPath ........................................................................................ 36
Obiekt XMLHttpRequest ..................................................................................... 37
Technologie po stronie serwera .......................................................................... 39
Model aplikacji opartej na Ajaksie .................................................................................. 39
Dlaczego powinno si uywa Ajaksa? ...................................................................... 41
Czciowe uaktualnianie strony .......................................................................... 41
Niewidoczne pobieranie danych .......................................................................... 42
Cige uaktualnianie .......................................................................................... 42
Jednolite interfejsy ............................................................................................. 42
Prostota i bogactwo moliwoci ........................................................................... 42
Przeciganie i upuszczanie ................................................................................. 42
Kiedy nie naley uywa Ajaksa ................................................................................ 43
Spowolnienie strony ........................................................................................... 43
Zakcenie dziaania przycisku Wstecz w przegldarce .......................................... 43
Zakcanie dziaania zakadek oraz blokowanie indeksw wyszukiwarek ................. 44
Obcienie dla przegldarki ................................................................................ 44
Kto moe bd nie moe uywa Ajaksa? .................................................................. 44
Stwrz swj wasny przykad .......................................................................................... 45
Podsumowanie ............................................................................................................ 55
wiczenia .................................................................................................................... 55
Ajax. Od podstaw
Rozdzia 2. Powtrka z JavaScriptu ..................................................................................................... 57
Jdro JavaScriptu ......................................................................................................... 58
Skadnia ................................................................................................................. 58
Zmienne ................................................................................................................. 58
Podstawowe typy danych .................................................................................... 59
Referencyjne typy danych ................................................................................... 60
Operatory ............................................................................................................... 60
Operator przypisania .......................................................................................... 61
Operatory arytmetyczne ...................................................................................... 61
Operatory porwnania ........................................................................................ 61
Operatory logiczne ............................................................................................. 62
Operatory inkrementacji oraz dekrementacji ......................................................... 63
Instrukcje ............................................................................................................... 63
Instrukcje warunkowe ......................................................................................... 64
Ptle ................................................................................................................. 65
Funkcje .................................................................................................................. 66
JavaScript zorientowany obiektowo ................................................................................ 67
Obiekty wbudowane ................................................................................................ 68
Obiekty przegldarki ................................................................................................ 68
Obiekty zdefiniowane przez uytkownika .................................................................... 69
Konstruktory ...................................................................................................... 70
Prototypy ................................................................................................................ 71
Niszczenie obiektw ........................................................................................... 72
DOM (Document Object Model) ..................................................................................... 74
Dokument jako drzewo potomkw ............................................................................ 75
Dokument jako drzewo wzw ................................................................................. 75
Metody dostpu do obiektw w DOM ........................................................................ 76
Metoda getElementById ..................................................................................... 76
Metoda getElementsByTagName ......................................................................... 77
Tworzenie wzw .................................................................................................... 78
Alternatywne rozwizanie innerHTML .................................................................... 80
JavaScript oraz zdarzenia .............................................................................................. 81
Modele zdarze ...................................................................................................... 82
Rejestracja zdarze ................................................................................................. 82
Model rejestracji zdarze w przegldarce Internet Explorer .................................... 83
Model rejestracji zdarze w DOM z W3C .............................................................. 84
Obiekty zdarze ...................................................................................................... 84
Podsumowanie ............................................................................................................ 88
wiczenia .................................................................................................................... 89
Spis treci
Ajax. Od podstaw
Wykorzystywanie CSS z danymi XML ............................................................................ 183
Wykorzystywanie CSS z dokumentami XML .............................................................. 185
Wykorzystywanie CSS z Ajaksem ............................................................................ 185
Waciwo style ............................................................................................. 185
Waciwo className .................................................................................... 186
Podsumowanie .......................................................................................................... 186
wiczenia .................................................................................................................. 187
Spis treci
10
Ajax. Od podstaw
Rozdzia 9. Wzorce .................................................................................................................................315
Podstawy wzorcw projektowych .................................................................................. 316
Sprawdzanie poprawnoci formularzy ........................................................................... 317
Problem ............................................................................................................... 317
Wzorzec ............................................................................................................... 317
Dodatkowe informacje we wzorcach zwizanych z najedaniem mysz na element ......... 325
Problem ............................................................................................................... 325
Wzorzec ............................................................................................................... 326
Wzorzec odpytywania serwera ..................................................................................... 333
Problem ............................................................................................................... 333
Wzorzec ............................................................................................................... 333
Wzorzec sucy do tworzenia list opartych na przeciganiu oraz upuszczaniu ................. 343
Problem ............................................................................................................... 343
Wzorzec ............................................................................................................... 343
Wzorzec obsugi bdw .............................................................................................. 357
Problem ............................................................................................................... 358
Wzorzec ............................................................................................................... 358
Podsumowanie .......................................................................................................... 364
wiczenia .................................................................................................................. 365
Spis treci
11
92
Ajax. Od podstaw
aplikacje oparte na Ajaksie wsppracuj z kad z trzech przedstawionych technologii,
a take jak dana technologia po stronie serwera moe przekazywa z powrotem do klienta
informacje oraz dane, ktre mog by uyte w aplikacji.
W niniejszym rozdziale omwiono nastpujce zagadnienia:
Q
ASP.NET,
PHP,
serwlety Javy.
Rozdzia 3.
93
Normalnie ASP czy PHP korzystaj z atrybutu action formularza, by przekierowa uytkownika ze strony pocztkowej na stron odpowiedzi. Przetwarzanie wykonywane jest na
serwerze, zanim uytkownik zostanie przekierowany do nowej strony, natomiast nowa
strona uywana jest do wywietlenia danych (rysunek 3.1).
W ASP.NET model ten nieco zmieniono, usuwajc atrybut action i dodajc atrybut RUNAT=
"SERVER". Zamiast przechodzi do innej strony, strona ta przele dane z powrotem do samej
siebie. Ponownie jednak strona dziaa w momencie interwencji uytkownika (rysunek 3.2).
94
Ajax. Od podstaw
Skrypt nie musi oczywicie przesya danych natychmiast. Moe poczeka na spenienie
innych warunkw oraz kryteriw przed przesaniem danych. W tym modelu poniewa
skrypt moe odpowiedzie na zdarzenie natychmiast i nie musi czeka na jawne przesanie
zwracanie danych z serwera nie musi rwnie by natychmiast widoczne dla uytkownika.
Skrypt nie jest ograniczony czekaniem na odpowied.
Od strony serwera
JavaScript wykorzystywany jest do rozpoczcia interakcji pomidzy klientem a serwerem.
Zostawmy na razie ten podzia i skupmy si na tym, co dzieje si z danymi, kiedy docieraj
one do serwera. Poniewa kady etap tego procesu odbywa si osobno, mona podzieli go
na czci i kad z nich omwi niezalenie od pozostaych. Czci te mona sobie wyobrazi
jako czarne skrzynki. Wymagaj one dostarczenia okrelonych danych wejciowych i dostarczaj pewne dane wyjciowe, cho to, co dzieje si w rodku, moe by bardzo rne.
Rozwamy na przykad bankomat. Wkada si do niego kart, wpisuje numer identyfikacyjny (PIN) i oczekuje si, e pienidze (oraz by moe potwierdzenie) zostan wydane przez
maszyn. W caym kraju istniej tysice bankomatw nalecych do wielu rnych bankw.
Rozdzia 3.
95
Niektre pobieraj opaty, inne pozwalaj sprawdzi szczegy zwizane z kontem, a inne
umoliwiaj tylko dostp do gotwki. Bankomaty dziaaj rnie, jednak maj ten sam interfejs, za pomoc ktrego mona si z nimi komunikowa.
Cz transakcji pomidzy klientem a serwerem odbywajca si po stronie serwera
przebiega do podobnie jak w przypadku tej hipotetycznej czarnej skrzynki czy bankomatu. Otrzymuje ona dane z dania HTTP i w kocu, po przetworzeniu owych danych,
musi zwrci je jako odpowied serwera.
Drugi sposb to wykorzystanie metody HTTP POST. W poniszym fragmencie kodu dane
ze zmiennej s kodowane w URI, opakowane w ciao dania i przesyane:
var argument = "value=";
argument += encodeURIComponent(dane);
XMLHttpRequestObject.open("POST", "response.aspx", "true");
xHRObject.send(ciao_dania)
Kod ten pozwala na przesanie wartoci kontrolek HTML oraz danych z formularzy do
serwera w dokadnie taki sam sposb i w tym samym formacie, w jakim przesyano by
stron za pomoc PHP czy ASP.NET.
96
Ajax. Od podstaw
Nie ma zauwaalnej rnicy w otrzymywaniu danych za pomoc formularza HTML bd
z dania pochodzcego ze skryptu w JavaScripcie. Mona na przykad doczy do strony
pole tekstowe o nazwie MyTextbox1 dziki nastpujcemu kodowi na stronie HTML:
<input type="text" id="MyTextbox1" name="MyTextbox1" />
Kiedy wyle si dane z pola za pomoc metody GET i z uyciem jzyka C#, dane pojawi
si w zbiorze QueryString w ASP.NET:
string TextBox = Request.QueryString["MyTextbox1"].ToString();
Dane mog te pojawi si w zbiorze Form, kiedy wysyane s za pomoc metody POST.
string TextBox = Request.Form["MyTextbox1"].ToString();
Aby pobra element o tej nazwie albo ze zbioru QueryString, albo z Form, mona wykorzysta nastpujcy kod:
string TextBox = Request.Params["MyTextbox1"].ToString();
W PHP odpowiednikiem tego bdzie zbir $_REQUEST. Mona na przykad uy nastpujcego kodu:
$TextBox = $_REQUEST["MyTextbox1"];
W PHP mona rwnie pobra wartoci tych zbiorw osobno za pomoc zbiorw $_GET
oraz $_POST, ktre s analogiczne do zbiorw QueryString oraz Form z ASP.NET.
$TextBox = $_GET["MyTextbox1"];
$TextBox = $_POST["MyTextbox1"];
Rozdzia 3.
97
Mona tworzy bardziej skomplikowane struktury (takie jak dokumenty XML), pod warunkiem e bd analizowane skadniowo jako tekst. Mona to zaimplementowa w ASP.NET
w nastpujcy sposb:
XmlDocument XmlDoc = new XmlDocument();
XmlNode versionNode = XmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
XmlNode mainNode = XmlDoc.CreateElement("root");
XmlDoc.AppendChild(mainNode);
XmlNode childNode = XmlDoc.CreateElement("child");
childNode.AppendChild(XmlDoc.CreateTextNode("Dane"));
mainNode.AppendChild(versionNode);
mainNode.AppendChild(childNode);
string strXml = XmlDoc.InnerXml;
Response.Write(strXml);
acuch znakw doczany jest do odpowiedzi HTTP i odsyany z powrotem do klienta jako
gotowy do pobrania. Cho ta cz procesu jest prosta, kiedy odpowied wraca do klienta,
pobranie danych jest nieco bardziej skomplikowane.
Obiekt XMLHttpRequest
Jak zostanie to zaprezentowane w rozdziale 4., obiekt XMLHttpRequest nie jest jedyn metod,
ktr ma si do dyspozycji w wykonywaniu interakcji pomidzy klientem a serwerem w aplikacjach opartych na Ajaksie. Jest jednak metod najczciej uywan.
W niniejszym rozdziale nie omwiono szczegw dziaania tego obiektu, dlatego najlepiej
bdzie go sobie wyobrazi jako kolejn czarn skrzynk, ktra oczekuje na dane wejciowe
z odpowiedzi HTTP.
98
Ajax. Od podstaw
Funkcja zwrotna
Pierwszy krok otrzymywania danych znany jest pod nazw funkcji zwrotnej (ang. callback
function). Jest to po prostu funkcja JavaScriptu, ktra wykonywana jest, kiedy dane zostan
w caoci pobrane z serwera. Mona jej nada do ogln nazw, tak jak na przykad
getData(), a funkcja ta bdzie w wikszoci aplikacji opartych na Ajaksie wygldaa do
podobnie. Wewntrz funkcji zwrotnej pierwszym zadaniem do wykonania jest sprawdzenie,
czy dane s gotowe do pobrania. Wykonuje si to za pomoc sprawdzenia, czy waciwo
readyState obiektu XMLHttpRequest rwna jest 4 (warto ta oznacza ukoczenie). Na razie
typowa funkcja zwrotna bdzie wygldaa nastpujco:
function getData()
{
if (xHRObject.readystate == 4)
{
// Tu nastpuje przetwarzanie
}
}
Po upewnieniu si, e dane s gotowe, mona je pobra za pomoc jednej z dwch waciwoci obiektu XMLHttpRequest:
Q
responseText,
responseXML.
Waciwo responseText
Wykorzystywanie waciwoci responseText jest najczciej stosowanym podejciem do
pobierania danych z odpowiedzi HTTP; jest rwnie najatwiejszym rozwizaniem. Mona
utworzy now zmienn JavaScriptu, ktra przechowa zawarto odpowiedzi i zwrci j
jako acuch znakw:
var text = xHRObject.responseText;
Jeli na stronie w ASP.NET utworzy si poniszy kod, wtedy waciwo responseText dla
data bdzie zawieraa tekst To s nasze dane.:
string data = "To s nasze dane.";
Response.Write(data);
I to wszystko. Mona rwnie pobra w ten sposb kod HTML bd XHTML. Co si jednak
stanie, gdy chce si pobra dane XML? Nadal mona uy metody responseText, zwrci
ona jednak dane XML w postaci acucha znakw. Mona zastanowi si nad poniszym
kodem w ASP.NET:
string data = "<?xml version=\"1.0\" encoding=\"UTF-8\"
standalone=\"yes\"?><root><child>Dane</child></root>";
Response.Write(data);
Rozdzia 3.
99
Waciwo responseXML
Waciwo responseXML na pierwszy rzut oka wyglda, jakby lepiej nadawaa si do sytuacji,
w ktrych chce si przekazywa z powrotem do klienta dokumenty XML. Pozwala ona
traktowa odpowied jako obiekt dokumentu XML i wykonywa iteracje po rnych elementach, atrybutach oraz wzach tekstowych za pomoc DOM. Jak to jednak zwykle bywa
w przypadku Ajaksa, trzeba sobie zdawa spraw z istnienia kilku problemw zwizanych
z korzystaniem z tej waciwoci.
Powiedzmy, e mamy nastpujcy kod po stronie serwera, ktry wczytuje dokument XML:
string data = "<?xml version=\"1.0\" encoding=\"UTF-8\"
standalone=\"yes\"?><root><child>Dane</child></root>";
Response.Write(data);
Jeli oczekuje si, e z powrotem otrzyma si w peni dziaajcy dokument XML, to mona
si srogo zawie. Z powrotem otrzyma si obiekt, jednak bdzie on pusty, bez ladu po
kodzie XML, jaki si przesyao. Dzieje si tak, poniewa ContentType odpowiedzi Response
musi by ustawiony na text/xml przed wypisaniem odpowiedzi.
string data = "<?xml version=\"1.0\" encoding=\"UTF-8\"
standalone=\"yes\"?><root><child>Dane</child></root>";
Response.ContentType = "text/xml";
Response.Write(data);
Niestety, Internet Explorer szczeglnie le to toleruje. Jeli nie ustawi si tego dobrze na
serwerze, nie bdzie mona wykorzystywa responseXML w tej przegldarce. W przegldarce
Firefox moliwe jest uycie w JavaScripcie metody overrideMimeType przed wywoaniem
kodu, dziki czemu mona nadpisa i ustawi typ zawartoci na text/xml po stronie klienta,
jak w poniszym kodzie:
xHRObject.overrideMimeType("text/xml");
xHRObject.send(null);
var document = xHRObject.responseXML;
100
Ajax. Od podstaw
Metody tej nie ma jednak w przegldarce Internet Explorer. Problemy nie kocz si jednak na tym. Jeli popeni si bd w dokumencie XML, tak e nie jest on poprawny skadniowo, w IE otrzyma si ponownie pusty obiekt bez oczywistego komunikatu o bdzie.
Jeli tak nie jest, oznacza to, e odpowied nie zostaa poprawnie przesana przez serwer
i naley sprawdzi kod po stronie serwera. Wysoce prawdopodobne jest jednak, e dane te
s poprawne.
Jeli dane nie s poprawne, kolejnym krokiem bdzie sprawdzenie kodu bdu.
W normalnej sytuacji kod zwracany z przegldarki Internet Explorer powinien by rwny zero.
Jednak, co bardziej prawdopodobne, jeli ContentType na pewno jest ustawiony na text/xml,
a responseXML.xml jest pusty, wtedy kod ten bdzie inny ni zero.
Dalsze informacje na temat znaczenia kodu zwracanego z waciwoci responseXML mona
uzyska w nastpujcy sposb:
var errormessage = xHRObject.responseXML.parseError.reason;
Rozdzia 3.
101
Dodatkowo istnieje rwnie atwy do zainstalowania dodatek Firebug1, ktry pozwala programistom bada ruch XHR w czasie rzeczywistym zarwno dania, jak i odpowiedzi.
Wykorzystywanie danych
Po zwrceniu danych z waciwoci responseXML mona je pobra tak, jakby byy obiektem
DOM. Zamy na przykad, e mamy nastpujcy dokument:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cart>
<book>
<Title>Ajax. Od podstaw.</Title>
<Quantity>1</Quantity>
</book>
</cart>
Istnieje znaczca rnica pomidzy dwoma najwaniejszymi przegldarkami (Internet Explorer oraz Mozilla) w kwestii tego, w jaki sposb zawarto tekstowa zwracana jest z dokumentw XML.
W Internet Explorerze zawarto tekstowa zwracana jest za pomoc waciwoci text,
jak w poniszym kodzie:
var title = book[0].firstChild.text;
// Tytu bdzie rwny "Ajax. Od podstaw."
Firebug, a take inne narzdzia i sposoby usuwania bdw z aplikacji, omwione s w rozdziale 6.
przyp. tum.
102
Ajax. Od podstaw
Nietrudno rwnie zauway, e w Internet Explorerze do pierwszego wza odnosi si
przez book[0], natomiast w przypadku przegldarki Firefox jest to book[1]. Dzieje si tak,
poniewa w Firefoksie book[0] zawiera wze tekstowy ze znakiem nowego wiersza, gdy
przegldarka ta nie opuszcza biaych znakw (ang. whitespace) traktuje je jak osobne
wzy, podczas gdy Internet Explorer tego nie robi.
I znw niezbdne jest uwzgldnienie tych rnic w kodzie, by dostp do danych zwracanych
z serwera dziaa we wszystkich przegldarkach.
ASP.NET
ASP.NET to technologia firmy Microsoft suca tworzeniu dynamicznych stron internetowych. By moga dziaa na komputerze, konieczne jest spenienie dwch warunkw: zainstalowanie platformy .NET Framework oraz posiadanie kompatybilnego serwera WWW,
najczciej IIS (Internet Information Services).
.NET istnieje od 2002 roku, jednak aktualne wiksze wydanie (.NET 3.0) zostao opublikowane w listopadzie 2006 roku. Najnowsz wersj mona pobra ze strony http://update.
microsoft.com. Naley wybra opcj Instalacja niestandardowa, a nie Instalacja ekspresowa,
i szuka w Oprogramowanie opcjonalne.
Serwer IIS jest z kolei dostpny tylko jako cz systemu operacyjnego Windows. W wielu
wersjach systemu Windows domylnie nie jest on zainstalowany i tym samym nie jest dostpny
w Windows XP Home Edition. Mona go jednak doda, przechodzc do Panelu sterowania
i wybierajc Dodaj lub usu programy, a pniej Dodaj/Usu skadniki systemu Windows.
Rozdzia 3.
103
Nastpnie w oknie dialogowym, ktre si pokae, naley klikn przycisk Utwrz, dziki
czemu tworzy si now aplikacj (jak wida na rysunku 3.5).
Pniej w przegldarce przechodzi si do nowej aplikacji (w tym przypadku do http://localhost/
BegAjax/r03), po czym otrzymuje si Bd HTTP 403 Dostp zabroniony, ktry oznacza,
e udao si utworzy katalog.
Po poprawnym umieszczeniu aplikacji na serwerze WWW wywouje si j z JavaScriptu
dziki odniesieniu si do strony ASP.NET, jak chce si wywoa, za pomoc metody Open
obiektu XMLHttpRequest, jak poniej:
XMLHttpRequestObject.open("POST", "response.aspx?value=1", "true");
104
Ajax. Od podstaw
Rysunek 3.5.
Przycisk Utwrz
w oknie dialogowym
Waciwoci
Oczywicie nie jest to co, co mona osign cakowicie po stronie klienta, cho po stronie klienta wszystko mona zainicjowa. Aplikacja odczyta tytu ksiki ze strony klienta
i przekae go do serwera. Jest to wykorzystywane przy identyfikacji ksiki, kiedy umieszcza si j w koszyku z zakupami.
Na serwerze koszyk z zakupami musi ledzi, jakie przedmioty umieci w nim uytkownik,
a take jaka jest ich liczba. By mc tego dokona, koszyk zostanie przechowany w zmiennej sesji. Oznacza to, e w duym katalogu uytkownik bdzie mg przechodzi ze strony
do strony bez tracenia informacji o tym, co zostao umieszczone w koszyku.
Do przechowania informacji w koszyku z zakupami mona wykorzysta dokument XML.
Istnieje tylko jeden element koszyka, a wewntrz niego znajduje si element ksiki dla
kadego tytuu, jaki kupuje uytkownik. Element ksiki zawiera elementy tytuu oraz liczby
Rozdzia 3.
105
egzemplarzy (cho mona oczywicie doda numer ISBN, cen oraz autorw). Cho ma si
tylko jedn stron katalogu, przykad ten jest skalowalny, wic powinno si go da uruchomi na wielu stronach z katalogami produktw.
1.
106
Ajax. Od podstaw
spantag.innerHTML += " " + header[0].lastChild.text + " " + "<a
href='#' onclick='AddRemoveItem(\"Remove\");'>Usu przedmiot</a>";
}
else
{
spantag.innerHTML += " " +header[0].firstChild.textContent;
spantag.innerHTML += " " + header[0].lastChild.textContent + " " + "<a
href='#' onclick='AddRemoveItem(\"Remove\");'>Usu przedmiot</a>";
}
}
}
}
function AddRemoveItem(action)
{
var book = document.getElementById("book").innerHTML;
if(action=="Add")
{
xHRObject.open("GET", "ManageCart.aspx?action=" + action + "&book=" +
encodeURIComponent(book) + "&value=" + Number(new Date), true);
}
else
{
xHRObject.open("GET", "ManageCart.aspx?action=" + action + "&book=" +
encodeURIComponent(book) + "&value=" + Number(new Date), true);
}
xHRObject.onreadystatechange = getData;
xHRObject.send(null);
}
1.
Rozdzia 3.
else
{
ht.Add(newitem, 1);
Session["Cart"] = ht;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
}
else
{
ht.Remove(newitem);
Session["Cart"] = null;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
}
else
{
ht.Add(newitem, 1);
Session["Cart"] = ht;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
}
string toXml(Hashtable ht)
{
XmlDocument XmlDoc = new XmlDocument();
XmlNode versionNode = XmlDoc.CreateXmlDeclaration("1.0","UTF-8","yes");
XmlNode mainNode = XmlDoc.CreateElement("cart");
XmlDoc.AppendChild(versionNode);
XmlDoc.AppendChild(mainNode);
foreach (string key in ht.Keys)
{
XmlNode childNode = XmlDoc.CreateElement("book");
XmlNode TitleNode = XmlDoc.CreateElement("Title");
XmlNode QuantityNode = XmlDoc.CreateElement("Quantity");
TitleNode.AppendChild(XmlDoc.CreateTextNode(key));
QuantityNode.AppendChild(XmlDoc.CreateTextNode(ht[key].ToString()));
childNode.AppendChild(TitleNode);
childNode.AppendChild(QuantityNode);
mainNode.AppendChild(childNode);
}
string strXml = XmlDoc.InnerXml;
return strXml;
}
</script>
1.
107
108
Ajax. Od podstaw
Rozdzia 3.
109
Jak to dziaa
Cykl trzech stron dokadnie odzwierciedla model JavaScriptu omwiony wczeniej. Strona
HTML jest sztuczn stron, na ktrej wywietlany jest jeden przedmiot z katalogu. W rzeczywistoci byaby to strona po stronie serwera, ktra pobieraaby szczegy na temat
ksiki z bazy danych i wywietlaa je na ekranie. Strona z katalogu zawiera rwnie skrypt
Cart.js. Skrypt ten wywoywany jest za pomoc odnonika Dodaj do koszyka:
<a href="#" onclick="AddRemoveItem('Add');" >Dodaj do koszyka</a>
110
Ajax. Od podstaw
function AddRemoveItem(action)
{
var book = document.getElementById("book").innerHTML;
if(action=="Add")
{
xHRObject.open("GET", "ManageCart.aspx?action=" + action + "&book=" +
encodeURIComponent(book) + "&value=" + Number(new Date), true);
}
else
{
xHRObject.open("GET", "ManageCart.aspx?action=" + action + "&book=" +
encodeURIComponent(book) + "&value=" + Number(new Date), true);
}
xHRObject.onreadystatechange = getData;
xHRObject.send(null);
}
W kodzie po stronie serwera ManageCart.aspx istniej dwie metody. Pierwsza cz znajduje si w metodzie Page_Load i wykonywana jest po wywoaniu strony. Druga toXml
serializuje koszyk z zakupami do postaci XML i przygotowuje go do odesania z powrotem
do klienta. Rozpoczyna si w Page_Load od utworzenia trzech zmiennych. Pierwsze dwie
su do przechowywania tytuu ksiki pobranego ze strony znajdujcej si po stronie
klienta, natomiast trzecia jest dziaaniem, jakie wybra uytkownik (moe to by Add bd
Remove). Nastpnie tworzy si tablic mieszajc (ang. hash table), w ktrej przechowywane bd przedmioty z koszyka z zakupami. W koszyku naley przechowa tytu przedmiotu
wraz z liczb egzemplarzy, jak wybra uytkownik.
void Page_Load()
{
string newitem = Request.Params["book"];
string action = Request.Params["action"];
Hashtable ht = new Hashtable();
Nastpnie sprawdza si, czy zmienna Session przechowujca koszyk z zakupami jest pusta.
Jeli nie jest pusta, wiadomo, e uytkownik ju odwiedza stron, dlatego moe to by
jedna z poniszych sytuacji:
Q
Uytkownik dodaje przedmiot, ale koszyk jeszcze nie istnieje, dlatego trzeba go
utworzy.
Jeli uytkownik dodaje przedmiot do koszyka z zakupami, a przedmiot ten jest ju obecny
w Hashtable ht, mona wykona nastpujcy kod:
if (Session["Cart"] != null)
{
ht = (Hashtable)Session["Cart"];
if (action == "Add")
Rozdzia 3.
{
111
if (ht.ContainsKey(newitem))
{
int value = int.Parse(ht[newitem].ToString());
ht.Remove(newitem);
value++;
ht.Add(newitem, value);
Session["Cart"] = ht;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
Bez wzgldu na wykonywane dziaanie naley si upewni, e otrzyma si najbardziej aktualn wersj koszyka z zakupami ze zmiennej Session, a nastpnie przechowa si j
w Hashtable ht. Sprawdza si, czy zmienna dziaania rwna jest Add, a take to, czy przedmiot obecny jest w tablicy mieszajcej. Nastpnie tworzy si warto zmiennej, ktra przechowuje liczb powizan z przedmiotem znajdujcym si w tablicy mieszajcej. Przedmiot usuwany jest z tej tablicy. Dodaje si jeden do wartoci, a potem dodaje si nowy
przedmiot do tablicy mieszajcej. Wczytuje si uaktualnion tablic do zmiennej Session.
Kolejny krok jest bardzo istotny. Ustawia si ContentType na text/xml. Jeli si tego nie zrobi,
waciwo responseXML nie bdzie dziaaa poprawnie. Na koniec zapisuje si tablic mieszajc do strumienia Response za pomoc funkcji toXml (co zostanie omwione wkrtce).
Jeli tablica mieszajca nie zawiera przedmiotu, naley go doda, zatem wykonuje si poniszy kod:
else
{
ht.Add(newitem, 1);
Session["Cart"] = ht;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
Przedmiot dodaje si do tablicy mieszajcej i przypisuje si mu warto 1. Ustawia si rwnie ContentType na text/xml, a nastpnie zapisuje wszystko do strumienia Response. Trzeba
to zrobi na kocu kadego moliwego scenariusza, by upewni si, e klient wywietla
poprawne informacje.
W trzecim scenariuszu zmienna Action nie bya rwna Add, dlatego zakada si, e musi
mie warto Remove. By usun przedmiot, naley wykona nastpujcy kod:
else
{
ht.Remove(newitem);
Session["Cart"] = null;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
112
Ajax. Od podstaw
Ostatni scenariusz bdzie wyglda znajomo. Jest on w zasadzie prawie taki sam jak drugi.
Dodaje si przedmiot do tablicy mieszajcej, przechowuje si tablic mieszajc w zmiennej
Session, zapisuje ContentType jako text/xml i zapisuje tablic mieszajc do strumienia
Response.
else
{
ht.Add(newitem, 1);
Session["Cart"] = ht;
Response.ContentType = "text/xml";
Response.Write(toXml(ht));
}
Na kocu kadego scenariusza wywouje si funkcj toXml, ktra serializuje tablic mieszajc do postaci XML. Wicej informacji na temat XML znajduje si w rozdziale 5.,
dlatego nie bdziemy teraz traci czasu na omawianie struktury dokumentu.
XmlDocument XmlDoc = new XmlDocument();
XmlNode versionNode = XmlDoc.CreateXmlDeclaration("1.0","UTF-8","yes");
XmlNode mainNode = XmlDoc.CreateElement("cart");
XmlDoc.AppendChild(versionNode);
XmlDoc.AppendChild(mainNode);
Tworzy si nowy dokument, a take jego wze deklaracji. Tworzy si take wze gwny
dokumentu i nadaje mu nazw cart. Nastpnie dodaje si deklaracj oraz wze gwny do
dokumentu.
Pniej wykonuje si iteracj po kadym kluczu z tablicy mieszajcej. Przechowano tytu
ksiki (Title) jako klucz w tablicy, a take liczb egzemplarzy, jak uytkownik chce zakupi (Quantity), jako warto. Dla kadego elementu z tablicy mieszajcej tworzy si
element ksiki z Title oraz Quantity. Poniewa Title oraz Quantity s podelementami
ksiki, naley uwaa, w jakiej kolejnoci si je dodaje i do jakich elementw.
foreach (string key in ht.Keys)
{
XmlNode childNode = XmlDoc.CreateElement("book");
XmlNode TitleNode = XmlDoc.CreateElement("Title");
XmlNode QuantityNode = XmlDoc.CreateElement("Quantity");
Najpierw jednak naley doda wartoci tekstowe z tablicy mieszajcej do elementw. Dodaje
si klucz tablicy do elementu Title, a warto tego klucza do elementu Quantity:
TitleNode.AppendChild(XmlDoc.CreateTextNode(key));
QuantityNode.AppendChild(XmlDoc.CreateTextNode(ht[key].ToString()));
Rozdzia 3.
113
Jedyne, co trzeba jeszcze zrobi, to otrzymanie tekstowej wersji tego dokumentu za pomoc
metody innerXml i zwrcenie jej do metody wywoujcej:
string strXml = XmlDoc.InnerXml;
return strXml;
Oczywicie nie wszystko jest jeszcze gotowe. Udao si przesa dane do serwera, natomiast
na serwerze spakowano je i wysano odpowied z powrotem w postaci dokumentu XML.
Trzeba zatem odczyta dokument XML i wywietli go na stronie. Jest to zadanie dla JavaScriptu
oraz funkcji getData(), ktra jest wywoywana po wywoaniu zdarzenia readystatechange.
Wewntrz funkcji zwrotnej pobiera si dane z waciwoci responseXML obiektu XMLHttpRequest. Izoluje si podzbir XML za pomoc metody DOM getElementsByTagName, by
pozyska tablic elementw bdcych ksikami.
var serverResponse = xHRObject.responseXML;
var header = serverResponse.getElementsByTagName("book");
W tym samym czasie trzeba rwnie pobra informacje o elemencie HTML, ktry bdzie
wywietla koszyk z zakupami. Na stronie Catalogue1.htm utworzono pusty element <span>.
Tutaj pobiera si go za pomoc metody DOM getElementById i upewnia si, e jego waciwo innerHTML ustawiona jest na zero.
var spantag = document.getElementById("cart");
spantag.innerHTML = "";
Kiedy pobrano ju wszystkie elementy ksiki i przechowano je w tablicy, czas je rozpakowa. Tworzy si ptl i ustawia jej maksimum na liczb elementw w tablicy. Nastpnie
sprawdza si, czy uytkownik korzysta z przegldarki Internet Explorer, czy Mozilla. Jeli
uywa Internet Explorera, naley skorzysta z waciwoci text do wywietlenia kadego
elementu ksiki. Jeli przegldarka wykorzystywana przez uytkownika to Mozilla, wtedy
naley uy waciwo textContent. Pierwszym elementem potomnym (firstChild) elementu ksiki jest Title. Ostatnim elementem potomnym (lastChild) jest Quantity.
for (i=0; i<header.length; i++)
{
if (window.ActiveXObject)
{
spantag.innerHTML += " " +header[0].firstChild.text;
spantag.innerHTML += " " + header[0].lastChild.text + " " + "<a href='#'
onclick='AddRemoveItem(\"Remove\");'>Usu przedmiot</a>";
}
else
{
spantag.innerHTML += " " +header[0].firstChild.textContent;
spantag.innerHTML += " " + header[0].lastChild.textContent + " " +
"<a href='#' onclick='AddRemoveItem(\"Remove\");'>Usu przedmiot</a>";
}
}
Po wywietleniu tytuu oraz liczby wybranych ksiek tworzy si rwnie dynamiczny odnonik pozwalajcy uytkownikowi usun przedmiot z koszyka. Odnosi si on z powrotem do JavaScriptu z wywoaniem AddRemoveItem, przekazujc do tej funkcji Remove jako
argument. W ten sposb cykl zostaje zakoczony.
114
Ajax. Od podstaw
Strona ASP.NET zawiera do sporo kodu, jednak, jak wida, w samym kodzie nie ma nic
szczeglnie skomplikowanego. Tak samo bdzie w przypadku wersji w PHP.
PHP
PHP jest akronimem, o ktrym mwi si, e ma kilka znacze. Najczciej akceptowanym
jest po prostu Hypertext PreProcessor, cho dla innych bdzie to Personal Home Pages
czy PHP Hypertext PreProcessor (potencjalny akronim rekursywny). PHP jest chyba najprostsz alternatyw dla ASP.NET. W przeciwiestwie do ASP.NET (ktry wykorzystuje
istniejce jzyki programowania) PHP sam w sobie jest jzykiem programowania. Moe
dziaa na najwaniejszych serwerach WWW (IIS oraz Apache) i nie jest powizany z platform Windows. W jzyku tym udao si zachowa wiele z prostoty, ktra na pocztku
przycigna tylu programistw do klasycznego ASP, to znaczy jzyk ten nie wymaga silnego
typowania zmiennych ani te pakowania wszystkiego w osobne procedury bd metody.
PHP jest produktem Open Source, ktry zosta skomercjalizowany przez firm Zend Technologies. Mona go pobra ze strony www.php.net. Aktualn wersj w momencie pisania
niniejszej ksiki jest 5.1.6. Podczas gdy ASP.NET teoretycznie wymaga przynajmniej zakupu systemu operacyjnego Windows, PHP jest zupenie darmowy, poniewa moe dziaa
na systemie operacyjnym z gatunku Open Source (takim jak Linux). Dziaa rwnie na popularnym serwerze WWW Apache (www.apache.org), ktry moe si pochwali tak samo
szerok obsug rnych platform oraz elastycznoci jak sam PHP.
PHP przypomina dwa gwne jzyki. Zosta utworzony w jzyku PERL przez Rasmusa
Lerdorfa, a take w jzyku C. Jest jednak w duej mierze pozbawiony stopnia skomplikowania zwizanego z tymi jzykami. Ma zbir obiektw, ktry naladuje obiekty klasycznego
ASP oraz ASP.NET, wcznie z obiektami Request oraz Session, dlatego nie powinien wyglda zbyt obco dla programistw pracujcych w tych dwch jzykach.
Cho poprzednie wcielenia jzyka PHP cieszyy si opini nieatwych w instalacji, najnowsza
wersja PHP 5 jest bardzo atwa w uyciu na serwerze IIS. Jeli utworzy si katalog na
twardym dysku i dokona ekstrakcji pliku instalacyjnego ZIP dla Windows pobranego ze
strony www.php.net/downloads.php#v5, wystarczy tylko zarejestrowa filtr ISAPI za pomoc IIS. eby tego dokona, naley przej do IIS, klikn prawym przyciskiem myszy
pozycj w Domylna witryna sieci Web i wybra Waciwoci. Naley wybra zakadk
Filtry ISAPI, pokazan na rysunku 3.9. Trzeba klikn Dodaj, utworzy filtr o nazwie PHP
i skierowa plik wykonywalny na php5isapi.dll.
Po poprawnej instalacji aplikacji na serwerze WWW mona wywoywa j z JavaScriptu,
przekazujc referencj do strony PHP, jak chce si wywoa, w ten sam sposb jak w przypadku ASP.NET za pomoc metody open obiektu XMLHttpRequest, jak poniej:
XMLHttpRequestObject.open("POST", "response.php?value=1", "true");
Tak naprawd PHP moe bez adnego problemu dziaa obok ASP i ASP.NET.
Rozdzia 3.
115
Rysunek 3.9.
Zakadka Filtry ISAPI
116
Ajax. Od podstaw
2. Naley zmieni podkrelone wiersze w pliku Cart.js w funkcji AddRemoveItem,
by miay one widoczn poniej form, a nastpnie zapisa ten plik jako CartPHP.js:
if(action=="Add")
{
xHRObject.open("GET", "ManageCart.php?action=" + action + "&book=" +
book + "&value=" + num, true);
}
else
{
xHRObject.open("GET", "ManageCart.php?action=" + action + "&book=" +
book + "&value=" + num, true);
}
nastpujcy kod:
<?php session_register('Cart'); header('Content-Type: text/xml'); ?>
<?php
$newitem = $_GET["book"];
$action = $_GET["action"];
if ($_SESSION["Cart"] != "")
{
$MDA = $_SESSION["Cart"];
if ($action == "Add")
{
if ($MDA[$newitem] != "")
{
$value = $MDA[$newitem] + 1;
$MDA[$newitem] = $value;
$_SESSION["Cart"] = $MDA;
ECHO (toXml($MDA));
}
else
{
$MDA[$newitem] = "";
$_SESSION["Cart"] = $MDA;
ECHO (toXml($MDA));
}
}
else
{
$MDA= "";
$_SESSION["Cart"] = "";
ECHO (toXml($MDA));
}
}
else
{
$MDA[$newitem] = "1";
$_SESSION["Cart"] = $MDA;
ECHO (toXml($MDA));
}
function toXml($MDA)
{
$doc = new DomDocument('1.0');
Rozdzia 3.
117
$cart = $doc->createElement('cart');
$cart = $doc->appendChild($cart);
foreach ($MDA as $Item => $ItemName)
{
$book = $doc->createElement('book');
$book = $cart->appendChild($book);
$title
$title
$value
$value
=
=
=
=
$quantity
$quantity
$value2 =
$value2 =
$doc->createElement('title');
$book->appendChild($title);
$doc->createTextNode($Item);
$title->appendChild($value);
= $doc->createElement('quantity');
= $book->appendChild($quantity);
$doc->createTextNode($ItemName);
$quantity->appendChild($value2);
}
$strXml = $doc->saveXML();
return $strXml;
}
?>
Jak to dziaa
W kodzie po stronie klienta nie zmieniono prawie nic poza zmian referencji na kod PHP.
W czym zatem kod w PHP jest inny? PHP nie ma na przykad wbudowanej obsugi tablic
mieszajcych jako struktur danych. Zamiast tego naley skorzysta z wielowymiarowej
tabeli, w ktrej przechowa si zmienn Session. Poza tym jednak kod ten prawie dokadnie
odpowiada kodowi w ASP.NET.
Ponownie trzeba zaj si czterema scenariuszami:
Q
Uytkownik dodaje przedmiot, ale koszyk jeszcze nie istnieje, dlatego trzeba go
utworzy.
Poniewa w PHP nie jest wymagane silne typowanie zmiennych, kod ten moe by nieco
krtszy i prostszy od kodu w ASP.NET. Poniewa nie jest wymagane okrelone zdarzenie
on_load, kod PHP, jaki ma by wykonywany za kadym wywoaniem strony, mona umieci w jej czci head.
118
Ajax. Od podstaw
Rozpoczyna si od zarejestrowania zmiennej Session o nazwie Cart, ktra przechowuje koszyk z zakupami. Ustawia si te Content-Type odpowiedzi na text/xml, by mona byo
skorzysta z waciwoci responseXML.
<?php session_register('Cart'); header('Content-Type: text/xml'); ?>
Nastpnie tworzy si dwie zmienne, ktre bd przechowyway tytu ksiki oraz dziaanie,
jakie uytkownik chce wykona. S one pobierane ze zbioru $_GET, ktry zosta dodany jako
acuch znakw zapytania do dania wykonanego przez JavaScript:
$newitem = $_GET["book"];
$action = $_GET["action"];
Pniej sprawdza si zmienn $_Session["Cart"], by przekona si, czy jest ona pusta. Jeli
nie jest pusta, tworzy si zmienn o nazwie $MDA, w ktrej przechowana zostanie zmienna
Session. Poniewa nie uywa si silnego typowania, nie trzeba si martwi o rzutowanie
zmiennych PHP z jednego typu na drugi. Zazwyczaj odbywa si to automatycznie.
if ($_SESSION["Cart"] != "")
{
$MDA = $_SESSION["Cart"];
Dalej sprawdza si, czy zmienna $action zawiera sowo Add, ktre zostao na pocztku
przekazane z JavaScriptu. Jeli tak jest, mamy do czynienia z jednym z dwch scenariuszy.
Pierwszy z nich to sytuacja, w ktrej ma si ju przedmiot w koszyku z zakupami i chce si
doda kolejny, przechowa now warto w tablicy, przechowa tablic w zmiennej Session,
a nastpnie dokona serializacji tablicy, jak poniej:
if ($action == "Add")
{
if ($MDA[$newitem] != "")
{
$value = $MDA[$newitem] + 1;
$MDA[$newitem] = $value;
$_SESSION["Cart"] = $MDA;
ECHO (toXml($MDA));
}
W trzecim scenariuszu usuwa si przedmiot poprzez ustawienie tablicy oraz zmiennej Session
na puste acuchy znakw, a nastpnie dokonuje si serializacji do postaci XML:
Rozdzia 3.
119
else
{
$MDA= "";
$_SESSION["Cart"] = "";
ECHO (toXml($MDA));
}
}
W ostatnim, czwartym scenariuszu (gdy koszyk z zakupami nie istnieje) wykorzystano ten
sam kod co w pierwszym:
else
{
$MDA[$newitem] = "1";
$_SESSION["Cart"] = $MDA;
ECHO (toXml($MDA));
}
=
=
=
=
$quantity
$quantity
$value2 =
$value2 =
$doc->createElement('title');
$book->appendChild($title);
$doc->createTextNode($Item);
$title->appendChild($value);
= $doc->createElement('quantity');
= $book->appendChild($quantity);
$doc->createTextNode($ItemName);
$quantity->appendChild($value2);
}
$strXml = $doc->saveXML();
return $strXml;
}
120
Ajax. Od podstaw
Funkcj saveXML wykorzystuje si do skompilowania dokumentu jako jednej caoci. Przechowuje si go jako acuch znakw i zwraca do funkcji echo. Funkcja ta zapisuje dane do
strumienia Response i przekazuje informacje z powrotem z serwera do skryptu po stronie
klienta, w ktrym dokument XML zostaje wykorzystany do zoenia strony HTML.
Serwlety Javy
Ostatnia omwiona technologia po stronie serwera wykorzystuje Jav. Cho rodowisko
uruchomieniowe Javy moe by obecne na kliencie, tym razem przedstawione zostanie
wykorzystywanie Javy na serwerze z uyciem serwletw. Serwlety (ang. servlet) to aplikacje po stronie serwera napisane w jzyku programowania Java. S wykorzystywane do tworzenia interaktywnych stron internetowych i udostpniaj te same moliwoci, jakich mona oczekiwa od PHP czy ASP.NET (na przykad przetwarzanie formularzy, zarzdzanie
sesj oraz cookies, obsuga logowania).
Tak jak w przypadku PHP, cho Java jest technologi wasnociow2, jest dystrybuowana
za darmo przez firm Sun i dostpna pod adresem http://java.sun.com.
Jak na ironi, Ajax jest obecnie wykorzystywany do wypeniania luki, jak Java miaa wypeni dekad temu. Na pocztku Java wykorzystywaa wirtualn maszyn Javy (JVM, Java
Virtual Machine), by uruchamia po stronie klienta aplikacje, ktre byyby bardziej interaktywne i miayby wiksze moliwoci.
Akurat to zastosowanie Javy ograniczyo kilka problemw. Pierwszym z nich byo to,
e znacznik <applet>, ktry by dodatkiem zaakceptowanym przez Netscape (co zostao
ustandaryzowane w HTML 3.2), wykorzystywanym do uruchamiania apletw Javy, szybko
w wersji 4.0 HTML uznany zosta za przestarzay i odradzany; traktowany by rwnie jako swego rodzaju aberracja. Tak naprawd cay standard HTML 3.2 by postrzegany
jako nieco samowolny.
Zaakceptowanym zamiennikiem zosta znacznik <object>, ktry od duszego czasu obecny by w przegldarce Internet Explorer, dlatego w efekcie brakowao standardowego sposobu dodawania aplikacji w Javie. Na dodatek wirtualna maszyna Javy, ktra wymagana
bya do uruchomienia Javy, bya stale uaktualniana, natomiast wersje doczone do przegldarek zostaway te same, o ile si ich osobno nie uaktualnio. W rzeczywistoci oznaczao to, e, by uruchomi nowsze aplety Javy, czsto trzeba byo najpierw pobra zupenie
now wersj wirtualnej maszyny Javy.
Ostatnim powodem niepowodzenia byo to, e Java przeniosa prawie cay ciar przetwarzania z powrotem na klienta. Aplety Javy czsto pobieray si bardzo powoli, a jeszcze wolniej
zaczynay dziaa w zalenoci od mocy maszyny uytkownika. Cho Java nadal jest
bardzo popularnym jzykiem oraz rodowiskiem programowania, Ajax zdecydowanie przej
jej rol po stronie klienta.
2
W listopadzie 2006 firma Sun ogosia, e kod rdowy Javy zostanie opublikowany jako wolne oprogramowanie
na licencji GNU GPL. Stao si tak w okresie pomidzy listopadem 2006 a majem 2007; jedynie fragmenty
pochodzce od innych podmiotw, ktre nie zgodziy si na opublikowanie ich na licencji GNU GPL, pozostay
kodem wasnociowym. Sun planuje je jednak zastpi implementacjami alternatywnymi przyp. tum.
Rozdzia 3.
121
To, e Ajax zaj miejsce Javy po stronie klienta, nie oznacza, i nie mona z powodzeniem
poczy Ajaksa z Jav dziaajc na serwerze.
Serwlety wymagaj serwera z obsug Javy wraz z silnikiem obsugujcym serwlety. Naley
zainstalowa J2EE SDK zgodnie z zaczonymi instrukcjami i uruchomi serwer aplikacji
Javy. Serwer ten najczciej dziaa pod adresami http://localhost:8080, http://localhost:8081
bd http://localhost:4848. Nastpnie naley zainstalowa serwer Tomcat i uruchomi
usug, na ktrej jest on oparty, zgodnie ze wskazwkami dostarczonymi przy instalacji.
Kiedy aplikacja zostanie poprawnie zainstalowana na serwerze WWW, mona j wywoa
z JavaScriptu w podobny (cho nieco odmienny) sposb jak poprzednio. Serwlety musz
by skompilowane, zanim bdzie si mona do nich odnosi, dlatego naley skompilowa
klasy Javy w pliki .class. Nastpnie naley si odnie do pliku .class za pomoc metody
open obiektu XMLHttpRequest, jak poniej:
XMLHttpRequestObject.open("POST", "response?value=1", "true");
I znw przykad ten wymaga minimalnej interwencji w przypadku kodu po stronie klienta.
Zmieniony zostanie jedynie kod po stronie serwera, a poniewa w przykadzie tym wykorzystano serwer Tomcat, konieczna bdzie rwnie zmiana lokalizacji plikw aplikacji.
Tomcat wymaga take wykonania kilku czynnoci konfiguracyjnych, by serwlet dziaa.
by miay one widoczn poniej form, a nastpnie zapisa ten plik jako CartJava.js:
122
Ajax. Od podstaw
if(action=="Add")
{
xHRObject.open("GET", "ManageCartServlet?action=" + action + "&book=" +
book + "&value=" + num, true);
}
else
{
xHRObject.open("GET", "ManageCartServlet?action=" + action + "&book=" +
book + "&value=" + num, true);
}
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletResponse;
javax.servlet.http.HttpSession;
javax.servlet.http.HttpServletRequest;
javax.servlet.ServletException;
java.io.IOException;
java.util.Hashtable;
java.util.Iterator;
Rozdzia 3.
{
}
ht.put(newitem, new Integer(value));
session.setAttribute("cart", ht);
String cartXml = toXml(ht);
res.setContentType("text/xml");
res.getWriter().write(cartXml);
} else
{
ht.put(newitem, 1);
session.setAttribute("cart", ht);
String cartXml = toXml(ht);
res.setContentType("text/xml");
res.getWriter().write(cartXml);
}
} else
{
ht.remove(newitem);
session.setAttribute("cart", null);
String cartXml = toXml(ht);
res.setContentType("text/xml");
res.getWriter().write(cartXml);
;
}
} else
{
ht.put(newitem, 1);
session.setAttribute("cart", ht);
String cartXml = toXml(ht);
res.setContentType("text/xml");
res.getWriter().write(cartXml);
}
123
124
Ajax. Od podstaw
4. Naley skompilowa aplikacj do pliku .class. JDK z firmy Sun zawiera
kompilator wiersza polece javac. Przy kompilacji niezbdne bdzie rwnie
Jak to dziaa
Przykad ten w peni odzwierciedla dwa poprzednie, cho wymaga dodatkowej konfiguracji,
by zacz dziaa. Ponownie wykorzystuje si dwie metody, ktre wykonuj podane zadania.
Metoda doGet przypomina metod OnLoad z ASP.NET, poniewa jest ona wywoywana za
kadym razem, gdy uruchamiana jest strona. Jeli Czytelnik nie jest zaznajomiony z ASP.NET,
wystarczy wiedza, e jest to metoda wywoywana za kadym razem, gdy strona rozpoczyna
dziaanie. Zazwyczaj w pliku PHP jest to kod, ktry nie zosta ujty wewntrz funkcji.
Czas powrci do czterech scenariuszy. Nie ma sensu ich powtarza kolejny raz ani te dokadnie
analizowa podobnego kodu. Zamiast tego warto zwrci uwag na najistotniejsze rnice.
Rozdzia 3.
125
126
Ajax. Od podstaw
Celem niniejszego omwienia nie jest ocena zalet oraz wad wymienionych technologii.
Zazwyczaj to konieczno napdza programistw, wic na og albo klient nakazuje uycie
okrelonej technologii, albo te autor aplikacji zna jedn z nich na tyle dobrze, e to na niej
oprze swoj aplikacj.
Oczywicie czasami jedna z technologii lepiej od pozostaych nadaje si dla konkretnej implementacji. ASP.NET posiada o wiele bardziej rozbudowan i skomplikowan obsug stanw od PHP, a take zawiera alternatywny sposb zarzdzania stanem, ktry nie wie si
z wykorzystywaniem cookies. PHP oraz Java dziaaj na wikszej liczbie platform ni ASP.NET,
jednak ASP.NET staje si coraz bardziej wszechobecny. Jeli chodzi o odpowied na pytanie, czy jedna z tych technologii dziaa lepiej z Ajaksem, czy te lepiej do Ajaksa pasuje,
odpowied moe by tylko jedna nie. Tak naprawd lepiej spojrze na to z drugiej strony
Ajax wypenia luk, ktr naleao wypeni w kadej z tych technologii.
Wybr naley zatem do programisty i nie powinien on odrzuca Ajaksa tylko dlatego, e
jest przywizany do okrelonej platformy programistycznej czy technologii. Ajax dziaa rwnie
dobrze na kadej z nich.
Podsumowanie
Niniejszy rozdzia by krtkim spojrzeniem na rol serwera w aplikacjach opartych na
Ajaksie. Jeli Czytelnik zainteresowa si Ajaksem i oczekiwa, e w technologii tej nie ma si
do czynienia z serwerem, moe si czu nieco zawiedziony. W przypadku wikszoci aplikacji nie da si tego prawdopodobnie obej. Rozpoczto od zbadania roli serwera w tradycyjnym cyklu danie-odpowied w programowaniu webowym, a nastpnie porwnano
j z wykonywaniem zapyta do serwera w Ajaksie oraz JavaScripcie. Nastpnie rozszerzono
omwienie kadego z krokw tego cyklu.
Pniej krtko omwiono kad z trzech wybranych technologii po stronie serwera. Utworzono
przykad z koszykiem z zakupami oraz dopasowano do niego stron po stronie serwera napisan w ASP.NET, PHP oraz Javie, by zobaczy, jak niewiele rnic wystpuje pomidzy
tymi technologiami. Niewiele miejsca powicono operacjom po stronie klienta, jednak wspomniano nieco o tym, w jaki sposb obiekt XMLHttpRequest wykorzystywany jest do inicjowania da i otrzymywania danych.
W rozdziale 4. kwestie te omwione zostan o wiele bardziej szczegowo wraz z metodami
wykorzystywanymi w Ajaksie do tworzenia dania oraz obsugiwania jego wynikw.
wiczenia
Sugerowane rozwizania poniszych zada znajduj si w dodatku A.
1.
2. Naley ulepszy koszyk z zakupami, tak by numer ISBN by teraz w nim widoczny.