Professional Documents
Culture Documents
Niezbdnik
projektanta
dynamicznych aplikacji
Autor: Michael Morrison
Tumaczenie: Maciej Jezierski
ISBN: 978-83-246-1393-9
Tytu oryginau: Ajax Construction Kit:
Building Plug-and-Play Ajax Applications
(Negus Live Linux Series)
Format: 170x230, stron: 280
Wykorzystaj gotowe rozwizania w technologii AJAX!
Jak wykorzysta technologi AJAX?
Jak wykona najczciej spotykane zadania?
Jak zwikszy interaktywno serwisw WWW?
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treci
Podzikowania .............................................................................. 10
O autorze ....................................................................................... 11
Wstp ............................................................................................. 13
Cz I
Rozdzia 1.
Rozdzia 2.
Spis treci
Cz II
Rozdzia 3.
Rozdzia 4.
Wykorzystanie Ajaksa
do dynamicznego wypeniania list: lista akcji ........................... 81
Zadanie: wywietlanie informacji o wybranych akcjach ................................. 82
Projekt: aplikacja do wyboru akcji ................................................................... 84
Implementacja aplikacji Inwestor ................................................................... 89
Testowanie aplikacji Inwestor ......................................................................... 98
Przerabianie aplikacji Inwestor ..................................................................... 100
Podsumowanie ................................................................................................ 102
Rozdzia 5.
Rozdzia 6.
Rozdzia 7.
Rozdzia 8.
Rozdzia 9.
Dodatek B
Spis treci
5
Pobieranie danych
z kanaw RSS
Jako kto, kto przez kilka lat tworzy i utrzymywa wiele witryn internetowych,
bardzo entuzjastycznie podszedem do kanaw RSS, kiedy zobaczyem je po
raz pierwszy. Umoliwiaj one wywietlanie informacji z innych serwisw i moesz
umieci je na wasnych stronach. Zapewniaj automatyczn aktualizacj witryny, a przynajmniej kanaw informacyjnych, ktre s na niej umieszczone.
Jeli nie masz wprawy lub nie chcesz skrupulatnie uzupenia wiadomoci, moesz
przyj, e kana informacyjny umieszczony na Twojej stronie pozwoli udostpnia interesujce, automatycznie aktualizowane informacje. Kana informacyjny,
ktry bdzie idealnie dopasowany do zawartoci Twojej strony, znajdziesz najprawdopodobniej ju po chwili poszukiwa.
W tym rozdziale omwi, w jaki sposb Ajax umoliwia dynamiczne odpytywanie kanaw informacyjnych i wywietlanie ich zawartoci na stronie. Przykadowa aplikacja, ktr poznasz w tym rozdziale, udostpnia prosty interfejs
umoliwiajcy wybieranie rnych usug informacyjnych i nastpnie wywietlenie ich na stronie. Oprcz tego podczas wykonywania dania Ajaksa zobaczysz may adny obrazek, ktry jest niemal tak samo odjazdowy jak dynamiczne pobieranie wiadomoci.
Poniej znajduje si lista plikw wykorzystywanych w aplikacji Czytnik wiadomoci w tym rozdziale. S one umieszczone w spakowanym archiwum zawierajcym przykadowy kod doczony do ksiki i znajdujcym si na serwerze FTP
wydawnictwa Helion pod adresem ftp://ftp.helion.pl/przyklady/ajaxnp.zip, w katalogu chap05.
newsfeeder.html strona gwna,
newsfeeder.php skrypt serwera do pobierania danych z kanaw
informacyjnych,
newsfeeder.css arkusz stylw do formatowania wiadomoci,
ajaxkit.js podstawowe funkcje Ajaksa w bibliotece ajaksowej,
domkit.js funkcje do obsugi DOM w bibliotece ajaksowej,
newspaper.gif ikonka gazety wywietlana obok kadej wiadomoci,
wait.gif animowana ikonka wywietlana podczas wykonywania
dania Ajaksa.
104
Rozdzia 5.
105
Rozdzia 5.
danie klienta
Gdyby nie byo ogranicze bezpieczestwa, danie klienta w aplikacji Czytnik
wiadomoci byoby najprostsz czci do zaimplementowania, poniewa po
prostu wykonywaby danie GET adresu URL bez adnych parametrw. Jednak
nie mona wykona dania Ajaksa bezporednio do zdalnego serwera internetowego, co oznacza, e bdziesz musia stworzy wasny skrypt po stronie
serwera obsugujcy takie dania.
107
Odpowied serwera
Strona serwera aplikacji Czytnik wiadomoci jest odpowiedzialna tylko za dostarczenie dokumentu XML zawierajcego informacje z kanau wiadomoci w formacie RSS, ktry jest formatem XML. W przeciwiestwie do niektrych przykadw w tej ksice, w ktrych skrypt PHP przetwarza dane przed zwrceniem
ich w odpowiedzi Ajaksa, aplikacja Czytnik wiadomoci wymaga tylko, eby
skrypt PHP suy jako obejcie ograniczenia uniemoliwiajcego wysanie dania klienta do zewntrznego serwera. Jest to ograniczenie zabezpieczajce
kod JavaScript po stronie klienta przed odwoywaniem si poza domen, z ktrej zosta wczytany.
Z tego powodu w aplikacji Czytnik wiadomoci jest wymagany skrypt po
stronie serwera, ale jego jedynym zadaniem jest pobranie danych z zewntrznego serwera i zwrcenie ich do klienta poprzez odpowied Ajaksa. Skrypt
serwera moesz sobie wyobrazi jako porednika pomidzy kodem JavaScript
po stronie klienta a waciwym serwerem udostpniajcym kanay informacyjne.
Ponownie kluczowym powodem zastosowania takiego podejcia jest fakt, e kod
Ajaksa moe wykonywa dania tylko do Twojego serwera, co stanowi powany problem, kiedy potrzebujesz pobra dane z innego miejsca. Rozwizaniem
jest umoliwienie skryptowi serwera pobrania danych i posuenie si nimi jako
podstaw odpowiedzi na dania Ajaksa.
Zewntrznymi (zdalnymi) serwerami, o ktrych mwi, mog by dowolne
serwery udostpniajce dane w formacie RSS. Jeli troch poszukasz, odkryjesz,
e niemal kada strona internetowa udostpnia dane w tym formacie. Kiedy za
108
Rozdzia 5.
109
110
Rozdzia 5.
111
112
Rozdzia 5.
Pamitaj o tym, e w skad tych elementw wchodz take zewntrzne serwery wskazywane przez adresy URL poszczeglnych kanaw informacyjnych.
Serwery te nie s czci aplikacji, to znaczy nie znajduj si na nich adne pliki ani zasoby, ktrymi musisz si zajmowa, ale bez wzgldu na to peni kluczow rol w funkcjonowaniu aplikacji. Dlatego te kiedy w nastpnych punktach bdziesz pracowa nad plikami aplikacji Czytnik wiadomoci, pamitaj, e
s one uzalenione od zdalnych serwerw, z ktrych pobierane s dane.
Rysunek 5.5. Strona aplikacji Czytnik wiadomoci skada si z listy wyboru kanau
oraz informacji zwizanych z aktualnie wybranym kanaem
Kod HTML strony aplikacji Czytnik wiadomoci z interfejsem uytkownika
znajduje si w znaczniku <body>, ktry przedstawiono poniej:
113
<body onload="loadFeed()">
<div id="ajaxState" style="display:none"></div>
<br />
<div>Wybierz kana wiadomoci:
<select id="feed" onchange="loadFeed()">
<option value="http://feeds.wired.com/wired/topheadlines">
Wired News</option>
<option value="http://feeds.engadget.com/weblogsinc/engadget">
Engadget</option>
<option value="
http://feeds.ziffdavis.com/ziffdavis/extremetech">
ExtremeTech</option>
<option value="
http://feeds.feedburner.com/ajaxian">Ajaxian</option>
<option value="http://www.sciam.com/xml/sciam.xml">
Scientific American</option>
<option value="http://news.google.com/?output=rss">Google
News</option>
<option value="
http://www.michaelmorrison.com/mambo/index2.php?
option=com_rss&feed=RSS2.0&no_html=1">Blog Michaela
Morrisona</option>
</select>
</div>
<br />
<div id="feedcontent"></div>
</body>
114
Rozdzia 5.
function loadFeed() {
// Wyczy poprzedni zawarto kanau
document.getElementById("feedcontent").innerHTML =
"<img src='wait.gif' alt='Wczytywanie...' />";
// Wylij danie Ajaksa wczytujce now zawarto kanau
ajaxSendRequest("GET", "newsfeeder.php?rssurl=" +
encodeURIComponent(document.getElementById('feed').options[
document.getElementById('feed').selectedIndex].value),
handleFeedRequest);
}
Pierwsza rzecz, ktr robi funkcja loadFeed(), jest jedn z najbardziej interesujcych funkcjonalnoci aplikacji ot wywietla ona obrazek oczekiwania (wait.gif), ktry pojawia si podczas przetwarzania dania. Obrazek by ju
przedstawiony na rysunku 5.3, ale kiedy zobaczysz go we waciwym kontekcie, tak jak na rysunku 5.6, jego rola bdzie bardziej oczywista.
115
Zadaniem tego kodu jest to, eby nie byo widoczne opnienie podczas
wczytywania obrazka. Rol obrazka jest wskazanie uytkownikowi, e w tle co
si dzieje. Dlatego te wczytujemy go jeszcze przed wywietleniem strony. Jest
to moliwe dziki temu, e kod wczytujcy obrazek znajduje si poza jakkolwiek funkcj JavaScript, co powoduje, e jest automatycznie wykonywany podczas wczytywania strony.
Powracajc do funkcji handleFeedRequest(), jej zadaniem jest reagowanie
na odpowied Ajaksa pobranie zwrconych danych RSS i wywietlenie wiadomoci z kanau. Poniej znajduje si kod tej funkcji:
function handleFeedRequest() {
if (request.readyState == 4 && request.status == 200) {
// Zapamitaj dane z odpowiedzi XML
var xmlData = request.responseXML;
// Wygeneruj zawarto, zaczynajc od tytuu kanau
var feedContent = "";
var channelElem = xmlData.getElementsByTagName("channel")[0];
feedContent += "<div class='feedtitle'><a href='" +
getText(channelElem.getElementsByTagName("link")[0]) +
"'>" + getText(channelElem.getElementsByTagName("title")[0]) +
"</a></div>";
// Teraz wygeneruj nienumerowan list wiadomoci
feedContent += "<ul>";
var feedItems = channelElem.getElementsByTagName("item");
for (var i = 0; i < feedItems.length; i++) {
var itemTitle =
getText(feedItems[i].getElementsByTagName("title")[0]);
var itemLink = getText(feedItems[i].getElementsByTagName(
"link")[0]);
116
Rozdzia 5.
var itemPubDate =
getText(feedItems[i].getElementsByTagName("pubDate")[0]);
if (itemPubDate == "")
itemPubDate =
getText(feedItems[i].getElementsByTagName("date")[0]);
if (itemPubDate == "")
feedContent += "<li><a href='" + itemLink + "'>" +
itemTitle + "</a></li>";
else
feedContent += "<li><a href='" + itemLink + "'>" +
itemTitle + " <span class='itemdate'>(" +
itemPubDate + ")</span></a></li>";
}
feedContent += "</ul>";
// Wywietl zawarto kanau
document.getElementById("feedcontent").innerHTML = feedContent;
}
}
ajaxUpdateState();
Oczywicie jest tu sporo kodu, ale nie jest on specjalnie trudny. Pamitaj o tym,
e tak naprawd suy on do stworzenia fragmentu HTML. Inaczej mwic,
funkcja tworzy cz strony internetowej, ktra moe zosta umieszczona i wywietlona w elemencie div z zawartoci kanau informacyjnego. Wygenerowany
HTML zawiera tytu kanau informacyjnego bdcy jednoczenie czem do strony, z ktrej pochodzi. Kod HTML zawiera take nienumerowan (wypunktowan) list wiadomoci skadajcych si z tytuu, ktry jest rwnie czem,
oraz daty publikacji. Naley zauway, e wygenerowany kod HTML zawiera
odwoania do klas arkusza stylw CSS, ktre umoliwiaj zastosowanie odpowiedniego stylu dla danej zawartoci.
Pod koniec kodu funkcji handleFeedRequest() moesz zobaczy lini kodu
umieszczajc dynamicznie wygenerowany kod HTML na stronie:
document.getElementById("feedcontent").innerHTML = feedContent;
Chocia niewielka, ta pojedyncza linia robi bardzo duo, biorc pod uwag,
e jest odpowiedzialna za zamian obrazka wczytywanie na sformatowany tytu
kanau informacyjnego oraz poszczeglne wiadomoci.
Wygld strony aplikacji Czytnik wiadomoci jest wynikiem zastosowania arkusza stylw newsfeeder.css doczanego do strony za pomoc poniszego cza:
<link rel="stylesheet" type="text/css" href="newsfeeder.css" />
117
Rysunek 5.7. Po usuniciu arkusza stylw aplikacja Czytnik wiadomoci wyglda ubogo
Porwnaj ten rysunek z rysunkiem 5.5 przedstawiajcym ten sam kana informacyjny, ale z zastosowaniem arkusza stylw. Moim celem jest pokazanie
tego, e chocia CSS ma niewiele wsplnego z Ajaksem, jednak mona za jego
pomoc nada aplikacji bardziej elegancki i profesjonalny wygld.
Poniej znajduje si kod CSS odpowiedzialny za style kanau wiadomoci
w aplikacji Czytnik wiadomoci:
div.feedtitle {
padding-left : 5px;
background-color : #EEEEEE;
font-size : 22px;
font-weight : bold;
}
div.feedtitle a {
color : #666677;
118
Rozdzia 5.
text-decoration : none;
}
div.feedtitle a:hover {
color : #333344;
text-decoration : none;
}
Tytu kanau informacyjnego jest wygenerowanym kodem HTML z atrybutem class o wartoci feedtitle, ktry czy go z grup stylw o tej nazwie.
Jako pierwsze style ustawione s lewostronne wyrwnanie, kolor ta, rozmiar
i grubo czcionki. Nastpnie ustawiany jest kolor tekstu, ktry zmienia si,
kiedy uytkownik najedzie kursorem myszy na tytu (ktry, jak sobie przypominasz, jest czem). Styl text-decoration jest wykorzystywany do nadpisania
domylnego ustawienia HTML powodujcego podkrelanie czy, kiedy uytkownik umieci nad nimi kursor myszy w tym przypadku czytelniej i bardziej profesjonalnie bdzie wyglda zmiana koloru.
Podobne style CSS zastosowane s do poszczeglnych wiadomoci wywietlanych w wypunktowanej licie:
li {
font-size : 18px;
padding-left : 25px;
background : url(newspaper.gif) no-repeat;
list-style : none;
}
Powyszy kod jest odpowiedzialny za wywietlanie adnej maej ikonki gazety obok kadego elementu listy (patrz rysunek 5.5). Kady element jest rwnie czem, dlatego te zastosowana jest podobna koncepcja zmiany koloru po
najechaniu kursorem myszy jak w przypadku tytuu kanau. Poniej znajduje
si kod CSS, ktry realizuje to zadanie:
a:link {
color : #333344;
text-decoration : none;
}
a:visited {
color : #9999AA;
text-decoration : none;
}
a:hover, a:active {
background : #EEEEEE;
text-decoration : none;
}
119
W kocu moesz zauway, e data publikacji kadej wiadomoci jest wywietlana kursyw i w jasnym kolorze, dziki czemu tytu jest lepiej widoczny.
Poniej znajduje si styl CSS odpowiedzialny za wygld daty publikacji poszczeglnych wiadomoci:
span.itemdate {
font-style : italic;
color : #CCCCDD;
}
UWAGA
Pamitaj, e zadaniem tego poredniczcego skryptu serwera jest obejcie ograniczenia
uniemoliwiajcego wykonywanie da Ajaksa do zdalnych serwerw. Gdyby takie
ograniczenie nie istniao, skrypt serwera nie byby potrzebny i klient wykonywaby po
prostu danie bezporednio do serwera udostpniajcego dane RSS. Jednak istnieje
wana przyczyna wprowadzenia takiego ograniczenia: bezpieczestwo! Umoliwienie
skryptom klienta wykonywania da do zewntrznych serwerw byoby zbyt niebezpieczne, dlatego te konieczno stworzenia wasnego skryptu poredniczcego w daniach Ajaksa jest nisk cen, jak trzeba zapaci za bezpieczny internet.
120
Rozdzia 5.
rezultatem jest sformatowany dokument kanau RSS odsyany do klienta w odpowiedzi Ajaksa.
121
Kanay wiadomoci nie maj specjalnie duego rozmiaru, wic ich wywietlenie nie powinno zaj duo czasu. Wywietlane wiadomoci zastpuj na stronie
obrazek wczytywanie, co wida na rysunku 5.10.
122
Rozdzia 5.
123
Ostatnim zadaniem, ktre moesz wzi pod uwag, kiedy masz ju wiedz
na temat RSS, jest stworzenie wasnego kanau. Jeli masz bloga lub stron internetow z regularnie zmienian zawartoci, udostpnienie uytkownikom
kanau informacyjnego na Twojej stronie jest blisk przyszoci. Mam nadziej, e dowiedziae si w tym rozdziale wystarczajco duo na temat formatu
RSS, eby sprbowa stworzy wasne dokumenty RSS. Tak naprawd najlepszym rozwizaniem jest stworzenie skryptu, ktry automatycznie bdzie konwertowa zawarto HTML na format RSS, dziki czemu Twoja witryna bdzie
automatycznie publikowana w postaci kanaw wiadomoci. Sposb realizacji
tego rozwizania wykracza nieco poza zakres tego rozdziau, ale masz ju dobre
narzdzie do testowania swoich kanaw wiadomoci, kiedy ju je stworzysz.
Podsumowanie
W tym rozdziale wprowadziem Ci w interesujcy obszar zarzdzania zawartoci internetow znany jako kanay wiadomoci, ktry wykorzystuje standardowy, oparty na XML-u, format RSS (ang. Really Simple Syndication). Za pomoc RSS mona pobra skrt zawartoci witryny internetowej bez potrzeby
jej odwiedzania. Co wicej, mona pobra zawarto z innej witryny i udostpni j na wasnych stronach. Jest to dobra metoda aktualizowania wasnych
stron bez koniecznoci wprowadzania zmian we wasnej zawartoci. Stworzona
przez Ciebie aplikacja Czytnik wiadomoci pozwolia zademonstrowa, w jaki
sposb za pomoc Ajaksa mona dynamicznie wczytywa dane RSS i czytelnie
prezentowa je na stronie, dziki czemu moliwe jest czytanie i nawigowanie
do wiadomoci. Aplikacja ta zawiera podstawowy kod, dziki ktremu moesz
bez wikszego wysiku umieci kanay wiadomoci RSS na wasnych stronach.
124
Rozdzia 5.