Questo documento e' stato usato in un seminario tenuto il giorno 8 Luglio 2004 nel Dipartimento di Fisica di Bari . Suggerimenti e commenti sono graditi: spediteli a info@zitogiuseppe.com.
Perche' usiamo Java Le tecnologie per trattare xml e servizi web sono ormai disponibili in ogni linguaggio di programmazione inclusi quelli di scripting come PHP, python e perl.Ma se consideriamo lo sviluppo di servizi web "seri" e non solo a livello dimostrativo, allora abbiamo in pratica due sole alternative: la piattaforma Java che qui vedremo in dettaglio e la piattaforma .NET (dotnet) di Microsoft.Per quanto quest'ultima usi strumenti diversi (di solito indicati con .net) i protocolli usati sono gli stessi.Invece dietro la "piattaforma Java" non c'e' solo la Sun ma anche altri big come IBM(Websphere), Oracle, Macromedia,etc che hanno contribuito allo sviluppo della piattaforma. Inoltre c'e' il contributo dell'open source soprattutto col progetto Jakarta di Apache a cui si devono tra l'altro Tomcat,Castor,Axis e Struts.
Dobbiamo comunque aggiungere che i linguaggi di scripting stanno acquistando sempre piu' importanza:non fosse altro che per la loro semplicita' d'uso. Per questo,nelle pagine che seguono, faremo vedere qualche esempio in PHP. Essi sono inoltre in alcune applicazioni, perfettamente adeguati ed inoltre la loro efficienza aumenta sempre piu' cosi' da fare sempre piu' concorrenza alle soluzioni "serie" qui descritte.
Infine sull'uso di Java per realizzare applicazioni Web guardate anche questo: Applicazioni Web in Java : perche' tante tecnologie?.
La proprieta' che i vari servizi Web possano comunicare tra di loro indipendentemente dalla piattaforma, viene chiamata interoperabilita' ed e' la maggiore caratteristica dei servizi web basati su xml. Si possono vedere percio' online delle tabelle per "certificare" l'interoperabilita' dei vari toolkit usati per creare tali servizi.
In definitiva l'xml e' uno standard che ci permette di definire nuovi linguaggi di marcatura.Questi linguaggi di marcatura permettono di rappresentare informazione strutturata in un formato testo che si descrive da se e che e' adatto allo scambio della stessa tra computer e programmi e quindi tra organizzazioni. Il set di caratteri usato ,detto Unicode, permette di rappresentare testi nei principali alfabeti mondiali.
Il formato dei documenti XML e' definito da un documento del comitato W3C(diventato una raccomandazione nel Febbraio 1998) ed ha una struttura gerarchica ad albero. Questa struttura segue il cosiddetto DOM (Document Object Model).Un Documento xml e' fatto da nodi di vario tipo.I nodi piu' comuni sono i nodi elemento che contengono un comando di marcatura tra parentesi angolari o tag di apertura e un tag di chiusura. I nodi testo sono invece le stringhe racchiuse tra un tag di apertura e uno di chiusura.Ogni elemento puo' avere uno o piu' attributi sotto forma di nomeattributo="valoreattributo". Da notare che in alcuni casi e' possibile rappresentare un'informazione sia come elemento che come attributo di un elemento. Nel caso della rubrica possiamo ad esempio rappresentare la singola persona come un unico elemento con differenti attributi:
<persona nome="Mario" cognome="Rossi" tel="3333" email="mario.rossi@qualcheparte.it" homepage="" />
Il linguaggio di marcatura puo' essere definito in maniera implicita come in
questo caso. Oppure possiamo descriverlo in maniera esplicita usando un'apposito
linguaggio di marcatura XML Schema(esiste anche un modo diverso di descrivere lo schema detto DTD:Document Type Definition che pero' sta diventando (forse) obsoleto).Descrivere in maniera esplicita lo schema o sintassi di un linguaggio
di marcatura permette di controllare la sintassi dei documenti scritti
validandoli.In seguito vedremo dei documenti scritti con linguaggi di
marcatura che hanno il seguente schema.
Se guardate questo documento scritto anch'esso in xml, noterete che tutti i comandi sono preceduti dalla scritta "xsd:". Questa scritta separata dal carattere ":" che talvolta compare per alcuni comandi, serve a indicare il namespace dei comandi: cioe' il particolare linguaggio di marcatura usato. In questo modo possiamo usare gli stessi comandi (e attributi) in due linguaggi di marcatura diversi e usarli nello stesso documento senza pericolo di confusione.I namespace usati sono di solito indicato nel root element ovvero il comando che racchiude l'intero documento xml come valore dell'attributo xmlns= per indicare il namespace di default , e come valore dell'attributo xmlns:pippo= per indicare il namespace pippo .Il valore di questo parametro e' un URI che non deve necessariamente corrispondere a un documento esistente. Infatti questi indirizzi sono solo degli identificatori e il loro unico scopo e' di identificare in maniera univoca il namespace. .
In definitiva un documento xml e' fatto da elementi contenenti a loro volta attributi.A ogni elemento corrisponde un tag di apertura e un tag di chiusura. I vari elementi sono disposti in una gerarchia a partire dall'unico elemento radice.I nomi degli elementi e degli attributi possono provenire da namespaces (vocabolari) diversi) indicati da un prefisso e definiti nell'elemento radice da un indirizzo web(URI).
Se siete abituati a scrivere html a mano con un'editore di testi potete subito scrivere xml con lo stesso editore. Dovete solo tener presente queste piccole modifiche rispetto all'html:
- Per i tag maiuscole e minuscole contano : <prova> e' diverso da <PROVA>
- A un tag di apertura deve sempre corrispondere un tag di chiusura.
- Potete scrivere un elemento vuoto nella forma abbreviata <tel/> che corrisponde a <tel></tel>
- Tutto il documento deve essere racchiuso tra un unico tag di apertura e uno di chiusura(elemento radice).
- I valori di attributi vanno sempre racchiusi tra doppi apici.
- La prima riga deve indicare la versione xml e il set di caratteri usato: di solito
<?xml version="1.0" encoding="UTF-8"?>- I commenti si scrivono come in html racchiudendoli tra <!-- e -->
- Definite nel tag di apertura dell'elemento radice eventuali namespace a cominciare da quello di default con l'attributo xmlns oppure xmlns:nome.
make
usato per lo piu' per programmi Java) usa come "Makefile" : build.xml.
Anche il format SVG ha un valore particolare in quanto va visto come il formato specializzato per la presentazione grafica di informazioni XML (una specie di PowerPoint o Flash dell'xml). Come esempio ecco la rappresentazione grafica di un xml contenente una sequenza di numeri ottenuta con queste specifiche XSLT che producono questo codice SVG.
Il nuovo Web si presenta invece con una sequenza incredibile di nuove tecnologie tra le quali e' difficile raccapezzarsi:
Web semantico = XML + DOM + XML Schema + XSLT + XPath + XQuery + SOAP + WSDL + UDDI + ...
Per capirci qualcosa e' meglio basarsi su un fondamento sicuro : l'XML e classificare queste tecnologie e standard in termini di operazioni sull'XML. Cosi' abbiamo:
Versioni,versioni,... Ognuno dei vari protocolli e' a uno stadio diverso di maturazione, con diverse versioni. XML 1.0 , XML 1.1, Namespaces 1.0 , Namespaces 1.1 ,DOM 1, DOM 2, DOM 3 ...
Cosi' il software in alcuni casi si sta adeguando, in altri casi sta diventando obsoleto.Sax1, Sax2..,
Riporto qui solo un breve riepilogo della situazione a meta' 2004 per quanto riguarda gli standards dei Web services:
- XML 1.0 stabile, ebbene XML-Schema sta per sostituire DTDs (attualmente si lavora a XML- Schema 1.1 ).Da notare che nei servizi web si usa solo XML-Schema per definire il tipo di dati da inviare.
- SOAP 1.2
- WSDL 2.0 (in arrivo, 1.2 in funzione)
- UDDI versione 3 (Agosto 2003)
Come esempio piu' complesso consideriamo questa descrizione di un rivelatore di alte energie : la descrizione e' contenuta in 5 files conf.xml , specs.xml, tb.xml, tracker.xml e materials.xml. Questi files usano 2 linguaggi di marcatura chiamati CDL e DDL descritti in questo documento.
Ormai esistono centinaia di programmi che permettono di trattare l'xml per cui e' difficile che abbiate bisogno di scrivere voi un programma per fare questo. Ma nel caso ne abbiate bisogno potete immaginare come estrarre dati da un gruppo di file xml non sia proprio facile come leggere un file di testo. Avete bisogno di una buona API che ci permetta di navigare nella struttura creata dai comandi xml e dai link tra un file e l'altro. Uno dei linguaggi piu' attrezzati per questo scopo e' Java col suo Java API for Xml Processing (JAXP) e con programmi come Castor o JAXB.
L'operazione di estrarre informazioni da un file xml viene detta in gergo parsing ed esistono due maniere di fare il parsing: la maniera Sax e la maniera Dom. In alternativa potete usare anche una maniera magica nel senso che, dopo aver generato in maniera automatica le classi che vi servono per caricare i dati a partire dallo schema, il caricamento degli stessi avviene con un'unica operazione detta in gergo di marshalling.
Scaricate questo programma sul vostro computer e compilatelo dando il comando:
javac Loadxml.java. A questo punto potete eseguirlo su un qualsiasi file xml dando il comando:
java Loadxml nomefilexml.Ecco il risultato processando la nostra rubrica. In termini tecnici si dice che il programma ha fatto un parsing del file xml e dandovi il controllo nei metodi startDocument ,endDocument, startElement, endElement and characters vi permette di estrarre i dati dal documento. A titolo di cronaca quello usato in questo programma e' un parsing semplificato detto SAX per contrapporlo al parsing completo DOM in cui viene ricostruita la struttura completa del documento xml.
Avendo questo programma come base non e' difficile estrarre dei dati da un singolo file xml. Ecco alcune semplici modifiche:
java DomEcho02 Persone.xml.Ecco il risultato. Useremo una versione estremamente semplificata di questo programma come base per estrarre dei dati dai file XML usando il parsing DOM.Un oggetto
Document
rappresenta l'intera struttura gerarchica del documento.
Se guardate in questo programma il metodo list vedrete che richiama
dei metodi come child(n) per scendere al nodo figlio n, childCount() per sapere quanti figli ha un nodo, getName per ottenere il
nome di un nodo , getValue per ottenere il contenuto di un nodo.
Quindi se persona punta al nodo radice della singola persona,
persona.child(9).child(0).getValue() ritorna l'indirizzo dell'homepage
di quella persona.
Ecco alcuni esempi:
Infine esiste una maniera magica di ottenere lo stesso risultato di estrarre e modificare i dati.(In gergo si chiama xml data binding).Questa maniera richiede uno speciale programma chiamato Castor oppure in alternativa JAXB, JDO o JDOM. Abbiamo chiamato magica questa maniera di manipolare documenti xml, perche' il programma Java che serve a manipolare i dati xml viene creato in maniera automatica a partire dallo schema del documento. Il programmatore Java puo' manipolare i dati senza bisogno di conoscere DOM e SAX. Il documento xml diventa un semplice contenitore Java che possiamo modificare a nostro piacimento e riscrivere come xml quando abbiamo finito.Alcuni di questi sistemi "magici" arrivano al punto da assicurare anche la persistenza degli oggetti creati a partire dal file xml in un database relazionale, anche questo in maniera automatica.
Nel nostro esempio useremo Castor e cercheremo di scrivere un programma che legge persone.xml lo controlla sintatticamente e quindi genera un file personeWithHomepage.xml con le sole persone che hanno una homepage. Ecco i passi da seguire:
cd
nella cartella principale di castor e copiate
qui i file persone.xml e persone.xsd.
setenv CLASSPATH castor-0.9.5.3.jar:castor-0.9.5.3-xml.jar:jta1.0.1.jar:jdbc-se2.0.jar:/usr/local/tomcat/common/endorsed/xercesImpl.jar:/usr/local/tomcat/common/endorsed/xmlParserAPIs.jar:.:/home/zito/temp/castor/tempDa notare l'aggiunta di xerces (qui preso dall'installazione di Tomcat). Inoltre dovete avere java 1.4 installata.
temp
e date il comando:
java -cp $CLASSPATH org.exolab.castor.builder.SourceGenerator -i persone.xsd -dest tempCastor vi crea dei file .java nella cartella temp
temp
il programma ListPersone.java
temp
con:
javac temp/*.java -d .
java -cp $CLASSPATH ListPersone persone.xmlIl risultato di questa esecuzione oltre ad una stampa, sara' appunto personeWithHomepage.xml
schema
.All'interno potete definire i tag usati
nella rubrica come una serie di nodi element
l'uno dentro l'altro
in modo da seguire la struttura gerarchica del documento. Il nome del tag e' indicato dall'attributo name
. Possiamo avere elementi di tipo complesso e di tipo semplice (quest'ultimi corrispondono alle foglie dell'albero
del documento. I tipi complessi vergono definiti col tag complexType
e il tag sequence
specifica che i figli devono essere
nell'ordine prefissato. In alternativa potevamo avere all
cioe' l'ordine non e' importante oppure choice
cioe' uno o piu' figli possono anche mancare.
La descrizione degli elementi di tipo semplice prevede la dichiarazione del
tipo di dato con l'attributo type
. Inoltre e' possibile definire
una serie di restrizioni sul numero minimo e massimo di elementi.
Tra i software piu' usati per fare parsing e validazione c'e' Xerces
open-source e disponibile sia in Java che C++.
Il linguaggio alla base dei fogli di stile XSLT e' un linguaggio di programmazione di tipo particolare che invece di descrivere come fare per ottenere il risultato da applicare, descrive le regole da applicare ai nodi del documento.
Nell'esempio visto prima abbiamo una sola regola definita dal tag template
. I nodi a cui deve essere applicata la regola sono indicati dall'attributo match
. Il filtro che seleziona i nodi e' a sua volta espresso
in un linguaggio detto XPath. Questo linguaggio usa una sintassi simile
a quella con la quale si selezionano files in una linea di comando Linux .
Solo che ora invece di selezionare cartelle e file, selezionamo il percorso dei
nodi nel nostro albero. Il tag for-each
permette di filtrare
tutti i nodi con una particolare caratteristica. Mentre value-of
e' un esempio di tag che estrae dati dal documento originale .
Ecco altri esempi di trattamento della stessa lista di persone:
java trasforma foglio_di_stile file_xmlQuesto programma usa il software open-source Xalan per fare la trasformazione. Xalan e' disponibile anche in C++.
Da notare che XSLT e' la maniera piu' semplice per estrarre o manipolare i dati di uno o piu' file xml. In alcuni compiti ci evita di dover scrivere programmi appositi con parsing SAX o DOM. Tutto quello che dobbiamo fare e' avere un motore XSLT come un browser o il programma Java prima visto e scrivere il nostro programma come un file xml con specifiche xslt. Nessuna necessita' di conoscere Java o C++. Quindi XSLT , XPath e XQuery permettono l'accesso e la manipolazione di dati xml esattamente come le Api Dom e Sax prima viste. Solo che il tipo di accesso ottenuto con XSLT e' a piu' alto livello. E' la stessa differenza che si ha , nei database relazionali, tra l'accesso con SQL e l'accesso con un'Api come JDBC.
XSLT o XSL? Nei documenti che parlano dei fogli di stile XSLT c'e' spesso confusione perche' si parla di un misterioso linguaggio XSL e non si capisce cosa sia. La confusione e' accresciuta dal fatto che talvolta si indica con XSL cio' che invece andrebbe chiamato XSL-FO : di XSL-FO abbiamo gia' parlato definendolo come un particolare formato XML intermedio usato per trasformare xml in pdf, rtf, ps e altri formati di presentazione. Per generare da xml xml-fo si usano dei fogli di stile in cui compaiono delle specifiche definite dal seguente namespacexmlns:fo="http://www.w3.org/1999/XSL/Format"
. Ovviamente il foglio di stile contiene anche specifiche del namespace usato normalmente da XSLTxmlns:xsl="http://www.w3.org/1999/XSL/Transform"
I due namespace provengono ambedue da W3C .Ambedue i namespace realizzano in parte il linguaggio XSL. Per cui la relazione tra XSL e XSLT + specifiche XSL-FO e' quella tra il tutto e le parti. XSLT e' la parte Trasformazioni dell'xsl , mentre XSL-FO e' la parte Formattazione.In ogni caso W3C non considera ancora l'implementazione di XSL completa.
La descrizione del servizio Web viene fatta in un particolare linguaggio xml detto WDSL e resa disponibile a tutti via Internet. Ecco ad esempio la descrizione del servizio Web di Google.Un client SOAP manda una richiesta con un POST http al indirizzo del servizio ottenendo come risposta il seguente documento.La risposta nell'approccio SOAP richiede un server SOAP come ad esempio Axis+Tomcat.
Se a qualcuno tutto questo ricorda CORBA o RMI , non c'e' da meravigliarsi, SOAP , a parte l'XML, rimpiazza proprio queste tecnologie che erano state inventate per poter richiamare metodi di oggetti remoti e far viaggiare gli stessi oggetti attraverso internet.
Come abbiamo gia' visto prima ci sono due tipi o stili di servizi SOAP : quello orientato ai documenti e quello orientato alla chiamata di procedure remote(rpc).Se guardate questa lista di servizi il tipo e' indicato nella colonna Style. Sempre da questa lista potete vedere la principale differenza tra i 2 tipi : nel tipo rpc il servizio e' una lista di metodi ad ognuno dei quali corrisponde un Endpoint URL e uno o piu' Input e Output Parameters. Nel tipo documento invece , il servizio si caratterizza come una lista di operazioni per ognuna delle quali e' definito un InputMessage e un OutputMessage.Potete pensare alle singole operazioni dello stile document come dei metodi che hanno un unico parametro di input e un'unico parametro di output.Questi parametri sono stringhe di caratteri contenenti documenti xml.Cioe' ,in termini di oggetti, possono rappresentare dei contenitori di oggetti.
Fornire un servizio Web con SOAP e' abbastanza complicato perche' richiede un server Web che sappia trattare SOAP,WDSL e XML Schema. Ci sono vari sistemi che cercano di semplificare la vita, ma prima di vederne qualcuno in particolare, cerchiamo di vedere cosa andrebbe fatto:
wdsl2java
, lavora anche come un servlet di Tomcat che sa come trattare i protocolli SOAP, Xml Schema e WDSL. Invece Castor (un programma
autonomo) ci servira' in alcuni servizi web per trasformare i dati di un documento xml in un'insieme di classi Java e viceversa(data binding).Questa operazione
dovrebbe in teoria essere fatta da Axis con wsdl2java
che genera
stubs per il cliente e il server+classi per modellare i dati nell'xml(data binding). Perche' non e'
sufficiente wsdl2java
e dobbiamo usare anche Castor? Perche' l'operazione di data binding e' delicata e richiede un software maturo e specializzato come Castor.
java gsearch http://api.google.com/search/beta2 googleinput.xml googleoutput.xmlPer capire come si costruisce "a mano" la richiesta SOAP da inviare al servizio, bisogna conoscere la descrizione dello stesso in formato wsdl.Meglio ancora ci facciamo decodificare la descrizione wsdl da questo wsdl analyzer.Qui troviamo l'informazione che e' disponibile il metodo
doGoogleSearch
per il quale dobbiamo usare il namespace urn:GoogleSearch
.
Il nodo di root di un messaggio SOAP e' un elemento Envelope
che ha come unico elemento figlio Body
(vedi figura sopra).E' proprio all'interno di questo elemento che inseriremo la chiamata alla procedura remota che diventa il nome del comando xml. Gli argomenti della chiamata
alla procedura remota, sono i figli di questo elemento.Un messaggio SOAP puo'
anche contenere un elemento Header
prima di Body e un elemento Fault
interno a body. Il comando Fault
permette di trattare gli errori.
Un messaggio SOAP puo contenere anche attachment binari, esattamente come avviene con un mail.
Ed ecco la richiesta e la risposta per il servizio Web di Somma.
Vediamo come si legge il file WSDL usando il servizio Somma che ritorna la somma di 2 interi.All'interno dell'elemento radicedefinitions
abbiamo nell'ordine gli elementimessage
,portType
,binding
,service
. Il fatto che inviamo 2 interi e riceviamo l'intero somma e' descritto dai 2 comandimessage
: notate i nomi in0,in1,sommaReturn assegnati ai 3 numeri e il tipo indicato comexsd:int
utilizzando XMLSchema.
La descrizione e' completata daportType
dove si indica esplicitamente che c'e' un unico metodosomma
descritto dall'elementooperation
che prevede in0,in1 in input e il messaggiosommaResponse
come output.binding
contiene l'informazione che il nostro documento e' di tipo rpc e viaggia su http.
Un file WSDL contiene di solito anche l'elementotypes
che descrive il tipo di dati da inviare usando Xml-schema.
Ecco client SOAP per il servizio Web di Google
scritto in PHP.
Ora la richiesta e' fatta direttamente da PHP : voi dovete fornire solo l'URL del servizio,la lista dei parametri e l'url del namespace di Google.
Tutte le operazioni di mandare la richiesta e recuperare i dati dalla
risposta sono rese possibili dal pacchetto nusoap.php
scaricato da Internet.
Il client SOAP per il servizio Web di Somma scritto in PHP.
Ancora un altro client sempre in PHP per questo servizio.
Ancora un client SOAP ma questa volta in Javascript sempre per Google. Questo client per questioni di protezione , funziona solo in locale.Cioe' dovete scaricare i due file sul vostro disco e aprire il primo dei due col browser (dopo aver inserito la vostra chiave di Google).In questo client la richiesta e' fatta "a mano" inserendola direttamente nel codice Javascript. Invece la stampa del risultato e' fatta da funzioni Javascript che fanno il parsing del documento ricevuto e lo rappresentano nella pagina Web.
java org.apache.axis.wsdl.WSDL2Java -o persone -s "persone.wsdl"crea una serie di files nelle sottocartelle
persone_wsdl
e
persone_xsd
di persone/ba/persone
.
Dobbiamo modificare il file PersoneSoapBindingIm
pl.java
in modo da ritornare invece di null l'oggetto ListaResponse
.
Compiliamo il tutto con:
javac persone/ba/persone/*/*.javaCopiamo il file di deploy con:
cp persone/ba/persone/persone_wsdl/deploy.wsdd .Copiamo tutti i files generati in webapps con:
mv persone/ba/persone $CATALINA_HOME/webapps/axis/WEB-INF/classes/ba/persone
java org.apache.axis.client.AdminClient deploy.wsddUn nuovo servizio persone e' ora disponibile col metodo getLista che ritorna una lista di persone.
Ora invece realizziamo un servizio sempre tipo "document" che alla richiesta "getTracker=fulltracker" deve ritornare un documento che segue il seguente schema.
tracker1
e
carichiamo lo schema prima visto aggiungendo le 2 operazioni che deve fornire
il servizio:getTracker e getTrackerResponse. Definiamo inoltre il file wsdl di definizione.
del servizio.
java org.apache.axis.wsdl.WSDL2Java -o tracker1 -s tracker.wsdl
tracker_wsdl
e types
.
types
e le sostituiamo con quelle di Castor:
rm tracker1/ba/tracker/types/*.java java -cp $CLASSPATH org.exolab.castor.builder.SourceGenerator -i tracker.xsd -dest tracker1 -package ba.tracker.types
javac tracker1/ba/tracker/*/*.java
. Verranno dati errori a causa dei nomi differenti generati per le
classi di binding (ad esempio Tracker invece di _tracker). Correggiamo
finche' la compilazione e' senza errori.
type=
.
cp tracker1/ba/tracker/tracker_wsdl/deploy.wsdd .
mv tracker1/ba $CATALINA_HOME/webapps/axis/WEB-INF/classes/ba
java org.apache.axis.client.AdminClient -dddddd deploy.wsddIl servizio e' ora disponibile a : http://pcba10.ba.infn.it:8080/axis/services/tracker?method=getTracker&name=fulltracker . Ecco l'implementazione e due esempi di client Java 1 e 2 .
Nel nostro caso le risorse da indicare con URI univoche sono:
Questo fatto implica due cose di grande importanza per il programmatore:
Visto da questo punto di vista il problema di estrarre le informazioni da un documento xml (visto nei paragrafi precedenti) viene risolto in maniera elegante , creando in maniera automatica in memoria gli oggetti corrispondenti al documento xml. Ci sono varie tecnologie che sfruttano questo: ad esempio la tecnologia JAXB(Java Architecture for XML Binding) e Castor visto nel capitolo precedente. Un programma che utilizza questa tecnologia all'inizio fa l'operazione di unmarshalling di un file xml caricandolo in un contenitore di oggetti. Ora il contenuto puo' essere modificato a piacimento finche' non si procede nell'operazione inversa di marshalling per salvare il contenuto modificato su un altro file xml.
Altre tecnologie come JDO(Java Data Object) vanno ancora piu' in la ed oltre ad assicurare il collegamento tra oggetti e xml , danno la possibilita' di realizzare anche una persistenza "hard" con del codice che permette di salvare gli oggetti in maniera automatica anche su un normale database tipo mysql.
In generale, considerando la relazione tra xml e database, bisogna tener conto di
questo fatto: un insieme di documenti xml assieme ai tool considerati costituiscono un vero e proprio data base management system anche se rudimentale. Infatti
abbiamo i dati memorizzati nei file xml, lo schema descritto da xml-schema, la
possibilita' di fare query con XPath e XQuery , librerie per l'accesso ai dati
e tool come il parser Xerces, Xalan per fare trasformazioni , Galax per processare queries . A questo punto e' comprensibile che da una parte
abbiamo la possibilita' di avere dei database "tradizionali" (relazionali o xml)
per il backup e la gestione unificata di un insieme di documenti; dall'altra
vediamo gli standard e i tool evolversi in modo da permettere di fare con
xml cose che si fanno coi database tradizionali. Ad esempio avere linguaggi di query compatibili con SQL.
Ecco un esempio di un insieme di circa 20 documenti xml che formano un database
che descrive il detector CMS. I files si trovano a partire dalle seguenti cartelle:Tracker,Muon,etc
La descrizione del contenuto in html.
Se guardate il sito che descrive questo database, vedrete che finora il database e' stato
gestito usando direttamente questi files, ma in futuro si usera' un database
relazionale come sostegno .Il software usato per la gestione attuale e' Xerces +
Xalan in C++.
In definitiva, possiamo pensare all'XML come una "vista" dei nostri dati , un livello logico di descrizione sovrapposto a quello fisico. Questo allo scopo di rendere i nostri dati indipendenti dal modo come sono memorizzati. La memorizzazione di dati xml puo' avvenire direttamente come file xml (nel qual caso l'XML funziona come serializzazione light dei nostri oggetti) oppure in data base relazionali o xml. Usando come riferimento i database relazionali con SQL , possiamo fare il seguente schema a quattro livelli.
SQL | XSLT, XQuery, XPath |
JDBC | Api DOM , Api SAX |
modello di dati relazionale | modello di dati di XPath |
memorizzazione fisica delle tabelle | memorizzazione fisica dei documenti xml |
Un'altra importante influenza di queste nuove tecniche sul lavoro del programmatore e' la seguente: lo sviluppo di servizi Web comincia a fare concorrenza alle applicazioni desktop. Per cui,dovendo sviluppare una nuova applicazione, conviene chiederci se non e' il caso di svilupparla come web service, evitando tutti i problemi legati alla portabilita' e all'adeguamento ai sistemi operativi che cambiano in continuazione. E' vero che adesso i servizi Web (rispetto alle applicazioni) sono lenti ed hanno interfacce scadenti, ma ci stiamo abituando a poco a poco (ad esempio lettura posta) e secondo me rimpiazzeranno a poco a poco le applicazioni desktop. Anche perche' fra poco usufruiremo di Internet direttamente da cellulari e palmari che potrebbero non avere la stessa potenza del desktop.Un indice significativo che stiamo andando in questa direzione e' l'implementazione sempre piu' frequente del protocollo Webdav che permette di scrivere in un sito Web remoto. Questo e' disponibile in IIS e anche in Tomcat. E inoltre i progetti di scrittura via Web di documenti come blog e wiki.
I dettagli tecnici di realizzazione possono essere visti in questo programma
AJAX dimostrativo:orologio digitale. Esso usa l'oggetto XMLHttpRequest
per collegarsi
a un server che fornisce l'ora sotto forma di file
xml.Insomma il trucco e' che le richieste di aggiornamento sono fatte dietro
le quinte da un programma Javascript. Una volta ricevuto il file XML
si procede ad aggiornare la pagina usando alcune funzioni Javascript.
Il metodo piu' semplice e' quello di dare un nome alle parti del documento
da modificare racchiudendole tra <div id="nome"> e </div> e poi usare
document.getElementById("nome").innerHTML=req.responseXML.getElementsByTagName("nome_tag_contenente_informazione_aggiornata");Nonostante non ci sia relazione tra tecniche AJAX e servizi Web, proprio i siti Web che forniscono un'interfaccia AJAX come i due visti prima , hanno sviluppato delle Web API fornendo servizi Web e permettendo in tal modo agli utenti di personalizzare l'interfaccia o addirittura di costruire dei nuovi servizi basati su quelli di base . Ad esempio l'Api Google Maps viene usato per creare e rendere disponibili centinaia di applicazioni basate su mappe. Insomma questi siti AJAX fornendo dei web services accessibili a tutti stanno dimostrando le possibilita' offerte dall'approccio basato su servizi.