Wykład 11

Transkrypt

Wykład 11
Plan
Przetwarzanie dokumentów XML
i zaawansowane techniki WWW
Wykład 10
T. Romańczukiewicz
Jagiellonian University
2009/2010
T. Romańczukiewicz
XML 10
Plan
Plan
1
AJAX
2
Podsumowanie
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Plan
1
AJAX
Przypomnienie
AJAX - wstep
˛
Prykłady
AJAX i JSON
Frameworki
2
Podsumowanie
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
XML, poprawnie sformuowanie
Sposoby opisu XML
DTD
XML Schema
XPATH
Sposoby prezentacji
CSS
XSLT
DOM
SAX
JAXB
Serwlety
JSP
AJAX
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
AJAX
AJAX - Asynchronous JavaScript and XML, asynchroniczny JavaScript i XML
Wspólna nazwa kilku istniejacych
˛
już wcześniej narz˛edzi takich jak JavaScript,
DOM, CSS, XML itp
Technika tworzenia interaktywnych aplikacji, w dużym stopniu polegajacych
˛
na
kodzie JavaScript po stronie klienta
Realizuje asynchroniczne odwołania do serwera
Pobieranie danych z serwera odbywa sie˛ bez konieczności odświeżenia całej
strony w przegladarce
˛
Dane sa˛ najcz˛eściej generowane przez skrypt lub aplikacje˛ innego typu po stronie
serwera.
Oferuje poziom interaktywności zbliżony do aplikacji desktopowych (GoogleMaps,
GoogleDocuments, GoogleSuggest, Google*)
W klasycznym modelu stron WWW:
Serwer nie zauważał żadnej aktywności użytkownika wprowadzajacego
˛
dane np
do formularza, aż do momentu zatwierdzenia całego formularza.
Nowa strona generowana na serwerze była w całości przesyłana do użytkownika
Niepotrzebne wydłużanie procedury i obciażanie
˛
łacza
˛
Klasyczy model dobry do prezentowania statycznych danych
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
T. Romańczukiewicz
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Model AJAX
Przegladarka
˛
uruchamia aplikacje˛ a nie tylko prezentuje strony
Logika aplikacji zaimplementowana jest w jezyku
˛
JavaScript (AJAX engine)
Dane po pobraniu z serwera sa˛ zapisywane w przegladarce
˛
jedynie w miejscu,
gdzie doszło do zmiany
Dokument modyfikowany jest poprzez interfejs DOM z poziomu JavaScript
Elementy składowe AJAX
JavaScript
(X)HTML + CSS, najlepiej dobrze sformułowany
XML - podstawowy format danych pobieranych przez aplikacje˛ JavaScript
Uwaga: stosuje sie˛ też cz˛eśto dane czysto tekstowe oraz dane w formacie JSON
(JavaScript Object Notation)
Obiekt XMLHttpRequest - służy on do obsługi żada
˛ ń HTTP wysyłanych przez kod
JavaScript asynchronicznie do serwera
umożliwia również pobieranie z serwera danych w innych formatach niż XML (np.
JSON lub czysty tekst)
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Przegladarka
˛
tworzy obiekt XMLHttpRequest z żadaniem (Wsz˛edzie tak samo z
wyjatkiem
˛
M$ IE 5 i 6)
Obiekt XMLHttpRequest wysyłany jest do serwera
Serwer przetwarza żadanie
˛
i tworzy odpowiedź
Odpowiedź wysyłana jest do przegladarki
˛
Przegladarka
˛
przetwarza odpowiedź i uaktualnia strone˛
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Tworzenie XMLHttpRequest
W wiekszości
˛
przegladarek
˛
(IE7+, Opera, Chrome, FF) obiekt XMLHttpRequest
tworzony jest przypomocy
xmlhttp=new XMLHttpRequest();.
Starsze przegladarki
˛
(IE5 i IE6) korzystaja˛ z
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
Można łatwo napisać ogólny kod:
Listing 1: XMLHttpRequest
1
2
3
4
5
6
7
8
if (window.XMLHttpRequest)
{ / / c o d e f o r IE7 + , F i r e f o x , Chrome , Opera , S a f a r i
xmlhttp=new XMLHttpRequest();
}
else
{ / / c o d e f o r IE6 , IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
Alternatywnie używa sie˛ również konstrukcji try-catch.
W zasadzie jest to jedyny fragment kodu, który zależy od przegladarki.
˛
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Aby wysłać żadanie
˛
do serwera korzysta sie˛ z metod
open(method,url,async), gdzie
method: typ żadania: GET lub POST
url: lokalizacja pliku na serwerze
async: true (asynchronous) lub false (synchronous)
send(string)
wysyła żadanie
˛
do serwera. Dla metody GET brak argumentu.
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Przykady wysyłania żadania:
xmlhttp.open("GET","demo_get.asp",true);
// najprostsze
xmlhttp.open("GET","demo_get.asp?t=" + Math.random(),true); / / u n i k a l n e URL −
brak cachowania
3 xmlhttp.open("GET","demo_get2.asp?fname=Henry&lname=Ford",true); / / d o d a t k o w e
informacje
4 xmlhttp.send();
1
2
5
6
7
8
9
10
(...)
xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Henry&lname=Ford");
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
(A)synchroniczność
Pojecie
˛
asynchroniczności jest podstawowe dla AJAXa i było ogromnym
udoskonaleniem jeśli chodzi o tworzenie stron WWW.
Cz˛esto operacje wykonywane na serwerze sa˛ czasochłonne. Przed AJAXem
mogło to powodować zawieszanie sie aplikacji webowych.
W AJAXie JavaScript może wykonywać inne skrypty oczekujac
˛ na odpowiedź z
servera
Listing 2: przykład
1
2
3
4
5
6
7
8
9
10
11
12
13
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();
(...)
xmlhttp.open("GET","ajax_info.txt",false);
xmlhttp.send();
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
Uwaga: użycie async=false jest niepolecane, jednak czasami może być ono wskazane.
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Po przesłaniu żadanie
˛
na serwer przygotowywana jest odpowiedź, która przesyłana
jest w obiekcie również w obiekcie XMLHttpRequest, a można ja˛ odczytać np poprzez
zmienna˛ responseText lub responseXML:
Listing 3: przykład
1
2
3
4
5
6
7
8
9
10
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
(...)
xmlDoc=xmlhttp.responseXML;
var txt="";
x=xmlDoc.getElementsByTagName("ARTIST");
for (i=0;i<x.length;i++)
{
txt=txt + x[i].childNodes[0].nodeValue + "<br />";
}
document.getElementById("myDiv").innerHTML=txt;
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Zdarzenie onreadystatechange
Gdy odpowiedź przesłana zostanie z serwera należy wykonać jakaś
˛ czynność.
Zdarzenie onreadystatechange (a dokładniej funkcja przechowywana w
onreadystatechange) wykonywane jest za każdym razem gdy zmieni sie
˛ wartość
readyState w obiekcie XMLHttpRequest.
readyState:
0
1
2
3
4
żadanie
˛
nie zostało zainicjalizowane
połaczenie
˛
z serwerem zostało ustanowione
odpowiedź została otrzymana
przetwarzanie żadania
˛
żadanie
˛
zostało zakończone i odpowiedź jest gotowa
status
200 OK
404 strona nie została odnaleziona
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
(...)
function myFunction()
{
loadXMLDoc("ajax_info.txt",function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
});
}
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Przykład: wyszukiwanie tekstu
Listing 4: showHint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function showHint(str)
{
if (str.length==0)
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
xmlhttp.open("GET","gethint.asp?q="+str,true);
xmlhttp.send();
}
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Przykład: wyszukiwanie tekstu c.d.
Listing 5: showHint
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$a[]="Anna";
$a[]="Wenche";
$a[]="Vicky";
/ / g e t t h e q p a r a m e t e r f r o m URL
$q=$_GET["q"];
/ / l o o k u p a l l h i n t s f r o m a r r a y i f l e n g t h o f q>0
if (strlen($q) > 0)
{
$hint="";
for($i=0; $i<count($a); $i++)
{
if (strtolower($q)==strtolower(substr($a[$i],0,strlen($q))))
{
if ($hint=="") $hint=$a[$i];
else $hint=$hint." , ".$a[$i];
}
}
}
/ / S e t o u t p u t t o " no s u g g e s t i o n " i f no h i n t were f o u n d
/ / or t o t h e c o r r e c t v a l u e s
if ($hint == "") $response="no suggestion";
else $response=$hint;
/ / output the response
echo $response;
?>
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Przykład: AJAX i Bazy danych
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<html><head>
<script type="text/javascript">
function showUser(str)
{
if (str=="")
{
document.getElementById("txtHint").innerHTML="";
return;
}
if (window.XMLHttpRequest) xmlhttp=new XMLHttpRequest();
else xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
xmlhttp.open("GET","getuser.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select name="users" onchange="showUser(this.value)">
<option value="">Select a person:</option>
<option value="1">Peter Griffin</option>
<option value="2">Lois Griffin</option>
<option value="3">Glenn Quagmire</option>
<option value="4">Joseph Swanson</option>
</select>
</form><br />
<div id="txtHint"><b>Person info will be listed here.</b></div>
</body>
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
<?php
$q=$_GET["q"];
$con = mysql_connect(’localhost’, ’peter’, ’abc123’);
if (!$con) die(’Could not connect: ’ . mysql_error());
mysql_select_db("ajax_demo", $con);
$sql="SELECT * FROM user WHERE id = ’".$q."’";
$result = mysql_query($sql);
echo "<table border=’1’>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
<th>Hometown</th>
<th>Job</th>
</tr>";
while($row = mysql_fetch_array($result))
{
echo "<tr>";
echo "<td>" . $row[’FirstName’] . "</td>";
echo "<td>" . $row[’LastName’] . "</td>";
echo "<td>" . $row[’Age’] . "</td>";
echo "<td>" . $row[’Hometown’] . "</td>";
echo "<td>" . $row[’Job’] . "</td>";
echo "</tr>";
}
echo "</table>";
mysql_close($con); ?>
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
XML a JSON
Listing 6: XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version=’1.0’ encoding=’UTF-8’?>
<card>
<fullname>Sean Kelly</fullname>
<org>SK Consulting</org>
<emailaddrs>
<address type=’work’>[email protected]</address>
<address type=’home’ pref=’1’>[email protected]</address>
</emailaddrs>
<telephones>
<tel type=’work’ pref=’1’>+1 214 555 1212</tel>
<tel type=’fax’>+1 214 555 1213</tel>
<tel type=’mobile’>+1 214 555 1214</tel>
</telephones>
<addresses>
<address type=’work’ format=’us’>1234 Main St
Springfield, TX 78080-1216</address>
<address type=’home’ format=’us’>5678 Main St
Springfield, TX 78080-1316</address>
</addresses>
<urls>
<address type=’work’>http://seankelly.biz/</address>
<address type=’home’>http://seankelly.tv/</address>
</urls>
</card>
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
XML a JSON c.d.
Listing 7: JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"fullname": "Sean Kelly",
"org": "SK Consulting",
"emailaddrs": [
{"type": "work", "value": "[email protected]"},
{"type": "home", "pref": 1, "value": "[email protected]"}
],
"telephones": [
{"type": "work", "pref": 1, "value": "+1 214 555 1212"},
{"type": "fax", "value": "+1 214 555 1213"},
{"type": "mobile", "value": "+1 214 555 1214"}
],
"addresses": [
{"type": "work", "format": "us",
"value": "1234 Main StnSpringfield, TX 78080-1216"},
{"type": "home", "format": "us",
"value": "5678 Main StnSpringfield, TX 78080-1316"}
],
"urls": [
{"type": "work", "value": "http://seankelly.biz/"},
{"type": "home", "value": "http://seankelly.tv/"}
]
}
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
JSON
JSON and. JavaScript Object Notation
Format danych oparty na JavaScript
Struktura zagnieżdżenia elemetnów podobna jak w XML
JSON jest również formatem textowym
Jest praktycznie tak samo czytelny jak XML
Ma mniej redundancji - przez to jest zazwyczaj nieco lżeszy
XML jest dobrym narz˛edziem do tworzenia dokumentów
JSON jest dobrym formatem do przesyłania danych
Jest jeden obiekt z zagnieżdżonymi innymi objektami, tablicami, stringami,
liczbami itp.
Najwieksz
˛
a˛ zaleta˛ jest szybki i łatwy sposób wykorzystania w JavaScripcie (JSON
jest podzbiorem js)
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Jeśli chodzi o pobieranie danych wszystko wyglada
˛ tak samo:
1
2
3
4
var req = new XMLHttpRequest();
req.open("GET", "http://localhost/addr?cardID=32", /∗ a s y n c ∗/true);
req.onreadystatechange = myHandler;
req.send(/∗ no params ∗/null);
Odczytywanie z pliku XML z wykorzystaniem modelu DOM:
1
2
3
4
5
6
7
8
9
10
11
12
function myHandler() {
if (req.readyState ==
/ / Update a d d r e s s
var addrField
=
var root
=
var addrsElem
=
var firstAddr
=
var addrText
=
var addrValue
=
addrField.value =
}
}
4 /∗ c o m p l e t e ∗/) {
f i e l d i n a form w i t h f i r s t s t r e e t a d d r e s s
document.getElementById(’addr’);
req.responseXML;
root.getElementsByTagName(’addresses’)[0];
addrsElem.getElementsByTagName(’address’)[0];
fistAddr.firstChild;
addrText.nodeValue;
addrValue;
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
To samo ale z użyciem danych w formacie JSON:
1
2
3
4
5
6
7
unction myHandler() {
if (req.readyState == 4 /∗ c o m p l e t e ∗/) {
var addrField = document.getElementById(’addr’);
var card = eval(’(’ + req.responseText + ’)’);
addrField.value = card.addresses[0].value;
}
}
Co prawda w przeciwieństwie do poprzedniego przypadku odpowiedź należy
sparsować (XML od razu jest przekazywany w postaci obiektu DOM), ale
parsowanie danych w formacie JSON to tylko jedna linijka (4).
Dane sa˛ bezpośrednio dostepne
˛
z poziomu JavaScript, tak jak wszystkie inne
dane, co bardzo ułatwia ich odczytywanie.
Funkcja eval wykonuje wszystkie skrypty gdy napotka kod JavaScript. Ze
wzgledów
˛
bezpieczeństwa można używać metody parse, która opuszcza skrypty.
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Prototype JavaScript Framework - rozbudowana biblioteka JavaScript. Zawiera
wiele rozwiaza
˛ ń wspomagajacych
˛
operacje na DOM, programowanie AJAX, i
wiele innych.
$() – funkcja dolara jest używana jako skrót do metody getElementById. By odwołać sie
˛
do obiektu DOM w stronie HTML:
$("moj_element").style.display = "none";
$F() – zwraca wartość pola formularza. Na przykład dla elementu text zwróci wartość
pola:
$$() – funkcja podwójnego dolara jest silnikiem selektorów CSS. Można używać takich
samych selektorów jakich sie˛ używa w arkuszu stylów.
Obiekt AJAX oferowany przez Prototype, jest przenośny miedzy
˛
przegladarkami.
˛
Posiada
dwie główne metody: Ajax.Request() i Ajax.Updater().
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var url = "http://www.foobar.com/path/script.php";
var myAjax = new Ajax.Request(url, {
parameters: {
imie: $F("imie"),
wiek: $F("wiek")
},
onSuccess: function(t) {
alert(t);
},
onFailure: function(t) {
alert(’Error....’);
}
});
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Przypomnienie AJAX - wstep
˛
Prykłady AJAX i JSON Frameworki
Biblioteka script.aculo.us – jest udostepniana
˛
na Licencji X11, a baza˛ dla tej
biblioteki jest Prototype JavaScript Framework, wiec
˛ cz˛esto sa˛ one spotykane
razem. Aculo.us rozszerza Prototype JS o animacje oraz różne efekty wizualne,
czy też o elementy interfejsu użytkownika na bazie obiektowego modelu
dokumentu DOM.
jQuery – lekka biblioteka programistyczna dla jezyka
˛
JavaScript, ułatwiajaca
˛
korzystanie z JavaScript (w tym manipulacje˛ drzewem DOM). Pozwala osiagn
˛ ać
˛
interesujace
˛ efekty animacji, dodać dynamiczne zmiany strony, wykonać
zapytania AJAX.
jQuery UI - jest rozszerzeniem biblioteki jQuery o bogaty zestaw komponentów
graficznych i widgetów
Adobe Spry – framework JS / Ajax od firmy Adobe. Bardzo bogaty, posiadajacy
˛
wiele elementów, m.in: efekty(animacje, przenikanie, potrzasanie,
˛
itd), wsparcie
do przetwarzania XML, JSON, HTML, XML,
MooTools – modułowa biblioteka JavaScript.
mintAjax – rozbudowana, łatwa w użyciu i darmowa biblioteka JavaScript o
małych rozmiarach przeznaczona do prostego, szybkiego i wygodnego tworzenia
dynamicznych stron internetowych.
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
Plan
1
AJAX
2
Podsumowanie
T. Romańczukiewicz
XML 10
AJAX Podsumowanie
AJAX - podsumowanie
Zbiór kilku narz˛edzi do dynamicznego i asynchronicznego tworzenia stron WWW
(JavaScript, DOM, XML, XMLHttpRequest)
Pozwala na tworzenie interaktywnych aplikacji webowych, bez konieczności
przeładowywania całej strony
Przegladarka
˛
tworzy obietk XMLHttpRequest, w którym umieszczane jest żadanie
˛
wysyłane do serwera
Po otrzymaniu odpowiedzi z servera JavaScript analizuje odpowiedź i aktualizuje
jedynie te fragmenty , których dotycza˛ zmiany
Odpowiedzi najcz˛esciej sa˛ przesyłane w postaci zwykłego tekstu, XML lub w
formacie JSON
Dane z XML można przetwarzać przy pomocy modelu DOM
Dane z JSON sa˛ już praktycznie w formacie danych JavaScript - nie potrzebne sa˛
złożone procedury wybierania odpowiednich elementów.
T. Romańczukiewicz
XML 10

Podobne dokumenty