Sei sulla pagina 1di 1107

Universit degli Studi di Bologna Facolt di Ingegneria

Tecnologie Web T Corso di Laurea in Ingegneria Informatica A.A. 2010-2011 Presentazione del Corso
Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 0.01.Presentazione.pdf Versione elettronica: 0.01.Presentazione-2p.pdf
Tecnologie Web T 1

Docenti e tutor Docenti Ilaria Bartolini e Paolo Bellavista


DEIS - Facolt di Ingegneria Viale Risorgimento, 2 - 40136, Bologna

Contatti E-mail: {i.bartolini,paolo.bellavista}@unibo.it Telefono:


051 20 93550 (Bartolini) - 051 20 93866 (Bellavista)

Web: http://www-db.deis.unibo.it/ibartolini/
http://lia.deis.unibo.it/Staff/PaoloBellavista/

Orario ricevimento studenti:


Luned ore 16-18 (sospeso durante II ciclo) e Venerd ore 16-18 (Bartolini), c/o palazzina IEIIT (ex-CSITE) Luned ore 16-18 (sospeso durante II ciclo) e Venerd ore 11-13 (Bellavista), c/o Aule nuove, primo piano, vicino Aula 5.7
Tecnologie Web T 2

Docenti e tutor Tutor: Carlo Giannelli


E-mail: carlo.giannelli@unibo.it Telefono: 051 20 93087 Web: http://lia.deis.unibo.it/Staff/CarloGiannelli/ Ricevimento studenti: (previo appuntamento) c/o LIA (LAB1)

Tecnologie Web T

Caratteristiche generali

Nome dellinsegnamento: Tecnologie Web T Durata: 120 ore 40 ore circa di esercitazioni in laboratorio 80 ore circa di lezione Crediti formativi: 12 Periodo: secondo ciclo 28 febbraio - 10 giugno 2011 (15 settimane, inclusa sospensione Pasquale) Organizzazione: diviso in due moduli, interallacciati nel tempo e tenuti entrambi dai due docenti
Modulo I Tecnologie e modelli di base Modulo II Architetture enterprise e modelli avanzati
Tecnologie Web T 4

Calendario del corso Orario lezioni: Luned - ore 16:00-19:00 Aula 2.7B Marted - ore 16:00-19:00 Aula 6.1 (fino all8 marzo) Gioved - ore 16:00-19:00 Aula 6.1 Orario esercitazioni: A partire dal 15 marzo (12 settimane x 3 = 36) Marted 16:00-19:00 LAB4
N.B. Il Laboratorio parte integrante del corso! Frequentare le esercitazioni guidate dal tutor importante:
Alcune problematiche si capiscono meglio mettendo in pratica i concetti teorici appresi a lezione
Acquisire manualit nell'uso degli strumenti software fondamentale

Per saperne di pi sulle regole generali di laboratorio si prega di consultare la guida sulla homepage del corso
Tecnologie Web T 5

Contenuti Obiettivo: fornire tutte le conoscenze e le competenze necessarie per la progettazione e la realizzazione di applicazioni Web-based, inquadrandole nell'ambito pi vasto delle applicazioni distribuite, focalizzando lattenzione alle applicazioni di classe enterprise Competenze molto ricercate nel mondo del lavoro ! Focus: definizione dei modelli su cui questa tipologia di applicazioni si basa, a partire da quelli pi tradizionali per arrivare alle evoluzioni recenti Parti del corso
Web statico Descrizione delle informazioni e XML Web dinamico Architetture enterprise Modelli e tecnologie per la gestione della persistenza
Tecnologie Web T 6

Programma Modulo I. Tecnologie e modelli di base


Modello statico: interazione e protocolli Web Modello statico: breve introduzione storica URI e protocollo HTTP Linguaggi di descrizione della pagina: HTML e CSS Descrizione delle informazioni e XML Descrizione delle informazioni: XML e XHTML Tipizzazione di XML: XSD e Schema Accenni a XSL e XSLT Accenni al parser XML (modelli DOM e SAX) Modello dinamico Sessioni e conversazioni - Gestione dello stato Programmazione Server Side: Servlet, JSP, Modello Java One Programmazione Client Side: Javascript e Ajax

Tecnologie Web T

Modello frequente in applicazioni enterprise


Presentation
Livello di presentazione si occupa della visualizzazione dei risultati generati secondo il percorso definito nel flusso sottostante

Business Flows
A questo livello vengono implementati i flussi delle diverse conversazioni che interagiscono per comporre una applicazione

Business Logic

La logica di business contiene le caratteristiche delle applicazioni e dipende sia dal modello dei dati che, ancora pi rilevante, dalle logiche di utilizzo degli stessi

Services

Servizi devono fornire tutte le funzionalit base (API) necessarie per limplementazione rapida ed efficace della logica di business, dalla gestione della concorrenza al supporto alle transazioni, dallinterfacciamento ai db al monitoraggio/controllo/gestione delle performance

Tecnologie Web T

Programma - Modulo II. Applicazioni enterprise


Introduzione alle architetture enterprise Organizzazione multilivello Component container Modello EJB Modelli a inversione di controllo - Spring Presentazione (alternative alle JSP) Java Server Faces - Facelet Controllo di flusso (business flow) Il modello Java 2 MVC Controller Spring MVC e Spring WebFlow Business logic Approfondimento architettura Spring Vari aspetti avanzati tecnologia Spring, ad es. AOP Servizi Accesso diretto a basi dati - Interfacce - Astrazioni Architetture a oggetti e database relazionali Strumenti di Object-Relational Mapping (ORM) - Hibernate Livelli di isolamento e gestione delle transazioni
Tecnologie Web T 9

Home Page del corso


http://www-db.deis.unibo.it/courses/TW/

Contiene:
Copia dei lucidi in formato PDF Guida al lab. Strumenti software e link utili Testi e soluzioni delle esercitazioni svolte in lab. Appelli desame Testi e soluzioni di prove desame Regole desame Bibliografia Avvisi
Tecnologie Web T 10

Testi consigliati (1/2) Per sostenere l'esame sufficiente il materiale reso disponibile sul sito Per chiunque voglia comunque avere a disposizione delle fonti in cui gli argomenti trattati a lezione vengono svolti in maniera pi estesa, sono consigliati i seguenti testi e/o link (molte altre alternative sono comunque disponibili):

V. Della Mea, L. Di Gaspero, I. Scagnetto, Programmazione Web Lato Server, 2a edizione, Apogeo, 2010 V. Roberto, M. Frailis, A. Gugliotta, P. Omero, Introduzione alle Tecnologie Web, McGraw-Hill, 2005

W3C, HTML, CSS, JavaScript


World Wide Web Consortium: http://www.w3.org HTML 4.01 Specifications: http://www.w3.org/TR/html4/ World Wide Web Consortium CSS Reference:
http://www.w3.org/Style/CSS/

World Wide Web Consortium CSS2 Specifications:


http://www.w3.org/TR/REC-CSS2/

Client-Side JavaScript Guide: http://www.w3schools.com/js/default.asp


Tecnologie Web T 11

Testi consigliati (2/2)


XML
Elliotte Rusty Harold and W. Scott Means. XML in a Nutshell, 2nd ed., O'Reilly XML: http://www.w3.org/XML/ XSL: http://www.w3.org/Style/XSL/

Architetture Enterprise
B. Burke, R. Monson-Haefel, Enterprise JavaBeans 3.0, 5th ed., OReilly, 2006 B. McLaughlin, Building Java Enterprise Applications, Vol. I: Architecture, 1st ed., OReilly, 2002 J2EE: http://java.sun.com/javaee/reference/ Tomcat: http://tomcat.apache.org/

Spring e Hibernate
Craig Walls. Spring in Action, 2nd ed., Manning Spring: http://www.springsource.org/ Christian Bauer and Gavin King. Java Persistence with Hibernate, Manning
Tecnologie Web T 12

Modalit di esame L'esame consiste di una prova pratica (in laboratorio) e di un colloquio orale Inoltre:
L'ammissione all'esame subordinata all'iscrizione obbligatoria tramite liste AlmaEsami e all'attivazione del proprio account di facolt In sede di esame possibile consultare testi, dispense, appunti, ecc. Durante l'esame non consentito uscire dal laboratorio La consegna dell'esame avviene in modalit telematica, mediante l'applicativo Web Esamix Il voto acquisito in una prova ha validit illimitata nel tempo Chi consegna al termine di una prova desame perde l'eventuale voto precedentemente acquisito I risultati delle prove vengono esposti sul sito Web del corso entro l'appello successivo La verbalizzazione del voto avviene periodicamente, in date rese note sul sito Web del corso
Tecnologie Web T 13

Appelli desame Sono previsti sei appelli desame allanno tre appelli nella sessione estiva (tra giugno e luglio) un appello nella sessione autunnale (a settembre) e due appelli in quella invernale (tra gennaio e febbraio) Durante il corso esamineremo insieme alcuni esempi di esame inoltre prevista una esercitazione in laboratorio dedicata alla simulazione di prova desame

Tecnologie Web T

14

Tecnologie Web T Introduzione

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 1.01.Introduzione.pdf Versione elettronica: 1.01.Introduzione-2p.pdf
1

Breve Storia del Web - 1 Il Word Wide Web (WWW) stato proposto nel 1989 da Tim Berners-Lee che lavorava al CERN di Ginevra Lidea alla base del progetto era quella di fornire strumenti adatti a condividere: documenti statici in forma ipertestuale disponibili su Internet Si volevano rimpiazzare i sistemi di condivisione di documenti basati su protocolli pi vecchi come FTP e Gopher
2

Breve storia del Web - 2 Nel marzo del 1989 Tim Berners-Lee elabor una una proposta Il 12 novembre 1990 assieme a Robert Cailliau present una proposta pi formale per un sistema ipertestuale basato su unarchitettura client-server Il 6 agosto 1991 Berners-Lee mise on-line su Internet il primo sito Web Inizialmente fu utilizzato solo dalla comunit scientifica Il 30 aprile 1993 il CERN decise di rendere pubblica la tecnologia alla base del Web Il Web si diffuse con una rapidit inaspettata

Berners-Lee e Cailliau

Il simbolo creato da Cailliau

Ipertesto
Un ipertesto (hypertext) un insieme di documenti messi in relazione tra loro tramite collegamenti (hyperlink o pi semplicemente link) Pu essere visto come una rete (un grafo) e i documenti ne costituiscono i nodi Attraverso un link possiamo passare da un punto di un documento ad un altro qualunque dei documenti del grafo La caratteristica principale di un ipertesto che la lettura pu svolgersi in maniera non lineare: qualsiasi documento della rete pu essere il successivo All'interno dell'ipertesto sono possibili praticamente infiniti percorsi di lettura Se si prendono in considerazione non solo testi ma elementi multimediali (immagini suoni, video) si parla di Ipermedia
4

Ipertesti: la preistoria Nel 1945 Vannevar Bush scrisse un articolo intitolato "As We May Think su un dispositivo futuristico chiamato Memex Lo descrisse come una scrivania elettromeccanica collegata ad un archivio di microfilm contenente testi e immagini Memex consentiva di accedere alle risorse contenute nei microfilm combinandole liberamente fra loro Questo articolo influenz la visione di quelli che sono considerati gli inventori del concetto di ipertesto: Ted Nelson e Douglas Engelbart

Ipertesti: un po di storia - 2 Ted Nelson invent i termini "hypertext" e "hypermedia" nel 1965 Nel 1968 con Andries van Dam svilupp Hypertext Editing System alla Brown University Nel 1962 Douglas Engelbart aveva iniziato a lavorare a Stanford su un sistema chiamato NLS che riprendeva lidea del Memex A causa delle difficolt a trovare risorse riusc a sviluppare lidea solo nel 1968 A dicembre di quellanno mostr per la prima volta al pubblico uninterfaccia ipertestuale

Ted Nelson

Douglas Engelbart

Ipertesti: un po di storia - 2
Negli anni 80 Ben Shneiderman cre lInteractive Encyclopedia System (TIES) allUniversit del Maryland e il sistema Intermedia alla Brown University Nel 1980, Tim Berners-Lee cre ENQUIRE, un sistema di database ipertestuale che funzionava pi o meno come un wiki Nel 1987 la Apple rilasci HyperCard per il Mac portando per la prima volta a livello commerciale la tecnologia degli ipertesti Nel frattempo Nelson continuava il suo lavoro sullarma finale degli ipertesti: il progetto Xanadu Xanadu - idea di partenza: word processor capace di gestire pi versioni e che visualizza le differenze; facilitare scrittura non-sequenziale, in cui lettori possano scegliere proprio sentiero attraverso un documento elettronico: progetto attivo da 30 anni che non ha mai portato ad un prodotto finito
7

WWW come sistema ipertestuale Grande idea di Berners-Lee stata quella di mettere insieme le idee di ipertesto e Internet World Wide Web in pratica un ipertesto distribuito sulla rete I documenti, chiamati anche pagine, risiedono su server sparsi in giro per il mondo (World Wide) e costituiscono una ragnatela virtuale (Web) La pagine sono in generale costituite da pi risorse: testo, immagini, Risorse che costituiscono una pagina possono trovarsi in luoghi diversi Da un qualunque documento possibile saltare ad un altro indipendentemente da dove questo si trovi Linsieme di questi salti prende il nome di navigazione (surfing)
8

Gli elementi costitutivi del Web Per realizzare questo ipertesto planetario abbiamo bisogno di tre elementi concettuali: Un meccanismo per localizzare un documento Un protocollo per accedere alle risorse che costituiscono il documento e trasferirle al client Un linguaggio per descrivere i documenti ipertestuali (usato per costruire le pagine) E di due elementi fisici: Un server in grado di erogare le risorse che costituiscono i documenti Un client in grado di rappresentare/visualizzare i documenti e di consentire la navigazione da un documento allaltro
9

La formula del Web In estrema sintesi nella sua visione iniziale il web pu essere rappresentato con la formula:

WWW = URL + HTTP + HTML

Consente di indirizzare risorse disponibili sui server Consente il trasferimento di risorse

Consente la rappresentazione di documenti ipertestuali

10

Modello del Web - Elementi Web segue un modello Client/Server Client, detti Web Browser Utilizzano il protocollo http per connettersi ai server Usano URL per identificare risorse Richiedono pagine Web ai server e ne visualizzano il contenuto Server, detti Web Server Rimangono in ascolto di eventuali connessioni di nuovi client Utilizzano il protocollo http per interagire con i client Forniscono ai client le pagine Web che questi richiedono
11

Modello del Web - Schema


Macchina server Macchina client URL Web Server Browser Documento HTML

Risorse (documenti HTML)

12

Home page Home page semplicemente la pagina di accesso di un server Web Contiene i link che portano ad altre pagine

La prima La prima home page del web home page del web

13

Tecnologie Web T URI e URL

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 1.02.URI.pdf Versione elettronica: 1.02.URI-2p.pdf
1

Questioni di fondo

WWW = URL + HTTP + HTML


Il primo termine della formula del Web fa riferimento a tre questioni principali: Come identifichiamo il server in grado di fornirci un elemento dellipertesto (una pagina o una risorsa allinterno della pagina)? Come identifichiamo la risorsa (elemento dellipertesto) a cui vogliamo accedere? Quali meccanismi possiamo utilizzare per accedere alla risorsa? La risposta a tutte queste domande sono gli URI

Uniform Resource Identifier Gli URI (Uniform Resource Identifier) forniscono un meccanismo semplice ed estensibile per identificare una risorsa Con il termine risorsa intendiamo qualunque cosa abbia una identit: un documento, unimmagine, un servizio, una collezione di altre risorse Caratteristiche di un URI: un concetto generale: non fa riferimento necessariamente ad entit disponibili in rete mapping concettuale ad una entit: non si riferisce necessariamente ad una particolare versione dellentit esistente in un dato momento Mapping pu rimanere inalterato anche se cambia il contenuto della risorsa
3

U come Uniforme La sintassi degli URI rispetta una sintassi standard, semplice e regolare gli identificatori sono uniformi Luniformit ha diversi vantaggi: Convenzioni sintattiche comuni Comune semantica per linterpretazione Possibilit di usare nello stesso contesto differenti tipologie di identificatori anche con meccanismi di accesso diversi Facilit nellintroduzione di nuovi tipi di identificatori (estensibilit)

Sintassi degli URI


Un identificatore un frammento di informazione che fa riferimento ad una entit dotata di unidentit (risorsa) Nel caso degli URI gli identificatori sono stringhe con una sintassi definita, dipendente dallo schema, che pu essere espressa nella forma pi generale in questo modo: <scheme>:<scheme-specific-part> Per la componente <scheme-specific-part> non esiste una struttura o una semantica comune a tutti gli URI Esiste per un sottoinsieme di URI che condivide una sintassi comune per rappresentare relazioni gerarchiche in uno spazio di nomi: <scheme>://<authority><path>?<query> A parte <scheme>, le altre parti possono talora essere omesse, come nei casi in cui non inclusa la componente <authority> o non inclusa la componente <query>
5

URN ed URL Esistono due specializzazioni del concetto di URI: Uniform Resource Name (URN): identifica una risorsa per mezzo di un nome che deve essere globalmente unico e restare valido anche se la risorsa diventa non disponibile o cessa di esistere Uniform Resource Locator (URL): identifica una risorsa per mezzo del suo meccanismo di accesso primario (es. locazione nella rete) piuttosto che sulla base del suo nome o dei suoi attributi Applicando questi concetti ad una persona: URN come il nome e cognome, o meglio il codice fiscale URL come lindirizzo di casa o il numero di telefono
6

URN Un URN identifica una risorsa mediante un nome in un particolare dominio di nomi (namespace) Deve essere unico e duraturo Consente di parlare di una risorsa prescindendo dalla sua ubicazione e dalle modalit con cui possibile accedervi Un esempio molto noto il codice ISBN (International Standard Book Number) che identifica a livello internazionale in modo univoco e duraturo un libro o una edizione di un libro di un determinato editore Non ci dice nulla su come procurarci il libro
Namespace

urn:isbn:0-9553010-9
Nome univoco nel namespace 7

URL Un URL tiene conto anche della modalit per accedere alla risorsa Specifica il protocollo necessario per il trasferimento della risorsa stessa Tipicamente il nome dello schema corrisponde al protocollo utilizzato La parte rimanente dipende dal protocollo Nella sua forma pi comune (schema HTTP-like) la sintassi <protocol>://[<username>:<password>@] <host>[:<port>][/<path>[?<query>][#fragment]] Questa forma vale per diversi protocolli di uso comune: HTTP, HTTPS, FTP, WAP, Ma non, ad esempio, per la posta elettronica
8

Componenti di un URL con schema HTTP-like <protocol>: Descrive il protocollo da utilizzare per l'accesso al server (HTTP, HTTPS, FTP, MMS, ) <username>:<password>@: credenziali per l'autenticazione <host>: indirizzo server su cui risiede la risorsa. Pu essere un nome di dominio o un indirizzo IP <port>: definisce la porta da utilizzare (TCP per HTTP). Se non viene indicata si usa la porta standard per il protocollo specificato (per HTTP la 80) <path>: percorso (pathname) nel file system del server che identifica la risorsa. Se manca tipicamente si accede alla risorsa predefinita (es. home page) <query>: una stringa di caratteri che consente di passare al server uno o pi parametri. Di solito ha questo formato: parametro1=valore&parametro2=valore2
9

Esempio di URL con schema HTTP

Domain Name del server in cui la Domain Name del server in cui la pagina memorizzata pagina memorizzata

Porta di ascolto del server Porta di ascolto del server

http://lia.deis.unibo.it:8080/Courses/index.html

Schema = protocollo di Schema = protocollo di comunicazione con ililserver. comunicazione con server. IlIlprotocollo http il default protocollo http il default per i iservizi Web per servizi Web

Path del file richiesto nel file Path del file richiesto nel file system del server system del server

10

Altri esempi di URI Schema per servizi FTP ftp://ftp.FreeBSD.org/pub/FreeBSD/ Schema per indirizzi di posta elettronica: mailto:paolo.bellavista@unibo.it Schema per newsgroup e articoli Usenet news:comp.infosystems.www.servers.unix Schema per servizi Telnet telnet://melvyl.ucop.edu Schema per IRC irc://irc.freenode.net/wikipedia-it

11

URL opache e URL gerarchiche Le URI sono anche classificate come opache o gerarchiche URL opaca: non soggetta a ulteriori operazioni di parsing mailto:paolo.rossi@deis.unibo.it URL gerarchica: soggetta a ulteriori operazioni di parsing, per esempio per separare lindirizzo del server dal percorso allinterno file system http://deis.unibo.it/ docs/guide/collections/designfaq.html#28 ../../../lab/examples/ant/build.xml file:///~/calendar

12

Parsing delle URL gerarchiche Una URL gerarchica sottoposta ad un ulteriore parsing secondo la sintassi:
[scheme:][//authority]path[?query][#fragment]

La componente authority, se specificata, pu essere server-based o registry-based. Una authority serverbased subisce il seguente processo di parsing:
[user-info@]host[:port]

Una authority non server-based detta registry-based La componente path di una URI gerarchica detta assoluta se inizia con /, relativa in caso contrario Il path di una URI gerarchica assoluta o che specifica una authority sempre assoluto

13

Operazioni sulle URL gerarchiche Normalizzazione: processo di rimozione dei segmenti "." e ".. " dal path di una URI gerarchica La normalizzazione su una URI opaca non ha effetto Risoluzione: il processo che a partire da una URI originaria porta allottenimento di una URI risultante La URI originaria viene risolta basandosi su una terza URI, detta base URI Relativizzazione il processo inverso alla risoluzione

14

Esempio di risoluzione URL originale: docs/guide/collections/designfaq.html#28 Base URL: http://deis.unibo.it/ Risultato: http://deis.unibo.it/docs/guide/collections/ designfaq.html#28

15

Riferimenti RFC2396, Uniform Resource Identifiers (URI): Generic Syntax, http://www.ietf.org/rfc/rfc2396.txt RFC1738, Uniform Resource Locators (URL), http://www.ietf.org/rfc/rfc1738.txt C.D. Manning, P. Raghavan, H. Schtze, Introduction to Information Retrieval, Cambridge University Press. 2008 (http://www-csli.stanford.edu/~hinrich/ information-retrieval-book.html)

16

Tecnologie Web T Il protocollo HTTP

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 1.03.HTTP.pdf Versione elettronica: 1.03.HTTP-2p.pdf
1

HTTP

WWW = URL + HTTP + HTML


HTTP lacronimo di HyperText Transfer Protocol il protocollo di livello applicativo utilizzato per trasferire le risorse Web (pagine o elementi di pagina) da server a client Gestisce sia le richieste (URL) inviate al server che le risposte inviate al client (pagine) un protocollo stateless: n il server n il client mantengono, a livello di protocollo, informazioni relative ai messaggi precedentemente scambiati Ci sono state tre versioni di HTTP: 0.9, 1.0 e 1.1
2

HTTP: Terminologia
Client: Programma applicativo che stabilisce una connessione al fine di inviare delle richieste Server: Programma applicativo che accetta connessioni al fine di ricevere richieste ed inviare specifiche risposte con le risorse richieste Connessione: circuito virtuale stabilito a livello di trasporto tra due applicazioni per fini di comunicazione Messaggio: lunit base di comunicazione HTTP, definita come una specifica sequenza di byte concettualmente atomica Request: messaggio HTTP di richiesta Response: messaggio HTTP di risposta Resource: Oggetto di tipo dato univocamente definito URI: Uniform Resource Identifier identificatore unico per una risorsa Entity: Rappresentazione di una risorsa, pu essere incapsulata in un messaggio
3

HTTP nello stack TCP/IP HTTP si situa a livello application nello stack TCP/IP

WEB APPLICATIONS APPLICATION LAYER TRANSPORT LAYER INTERNET LAYER NETWORK INTERFACE LAYER
HTTP, DNS TCP IP Ethernet

HTTP un protocollo basato su TCP Sia le richieste al server che le risposte ai client sono trasmesse usando stream TCP Segue uno schema di questo tipo: server rimane in ascolto, tipicamente sulla porta 80 client apre una connessione TCP sulla porta 80 (da
quale porta locale?)

server accetta la connessione (possibili pi connessioni


in contemporanea?)

client manda una richiesta server invia la risposta e chiude la connessione

Esempio HTTP (1.0)


Ipotizziamo di volere richiedere una pagina composta da un file HTML e 10 immagini JPEG:
1. Il client http inizia una connessione TCP verso il server http sullhost sulla porta 80 3. Il client http invia un messaggio di richiesta http (request message) contenente URL 5. Il client http riceve il messaggio di risposta contenente il file html, visualizza la pagina html. Analizzando il file html, browser trova i riferimenti a 10 oggetti jpeg 2. Il server http in ascolto sulla porta 80. Accetta la richiesta di connessione e ne d conferma al client 4. Il server http riceve il messaggio di richiesta, costruisce un messaggio di risposta (response message) contenente loggetto richiesto e e lo invia 6. Il server http chiude la connessione TCP

7. I passi 1-6 sono ripetuti per ciascuno dei 10 oggetti jpeg

Differenze fra HTTP 1.0 e 1.1


e una serie corrispondente di risposte
La connessione HTTP composta da una serie di richieste La differenza principale tra HTTP 1.0 e 1.1 la possibilit di

specificare coppie multiple di richiesta e risposta nella stessa connessione

Le connessioni 1.0 vengono dette non persistenti mentre quelle 1.1 vengono definite persistenti Il server lascia aperta la connessione TCP dopo aver spedito la risposta e pu quindi ricevere le richieste successive sulla stessa connessione Nellesempio precedente lintera pagina Web (file HTML e 10 immagini ) possono essere inviate sulla stessa connessione TCP Il server HTTP chiude la connessione quando viene specificato nellheader del messaggio oppure quando non usata da un certo tempo (time out)
7

HTTP 1.1 e pipelining Per migliorare ulteriormente le prestazioni si pu usare usa la tecnica del pipelining Il pipelining consiste nellinvio di molteplici richieste da parte del client prima di ricevere le risposte Le risposte debbono per essere date nello stesso ordine delle richieste, poich non specificato un metodo esplicito di associazione tra richiesta e risposta

Confronto fra tipi di connessione client


open close open close open close close close

server

client
open

server

client
open

server

HTTP 1.0

HTTP 1.1

HTTP 1.1
con pipelining

Messaggi Un messaggio HTTP definito da due strutture: Message Header: Contiene tutte le informazioni necessarie per identificazione del messaggio (pi in generale tutte le intestazioni del messaggio) Message Body: Contiene i dati trasportati dal messaggio Esistono schemi precisi per ogni tipo di messaggio relativamente a header e body I messaggi di Response contengono i dati relativi alle risorse richieste (tipicamente una pagina html) I dati sono codificati secondo il formato specificato Solitamente sono in formato MIME (Multipurpose Internet Mail Extensions)
10

nellheader

Header HTTP Gli header sono righe (nome: valore) che specificano caratteristiche del messaggio trasmesso o ricevuto: Header generali della trasmissione Data, codifica, versione, tipo di comunicazione, ecc. Header dellentit trasmessa Content-type, Content-Length, data di scadenza, ecc. Header della richiesta effettuata Chi fa la richiesta, a chi viene fatta la richiesta, che tipo di caratteristiche il client in grado di accettare, quale autorizzazione, ecc. Header della risposta generata Che server d la risposta, che tipo di autorizzazione necessaria, ecc.
11

Messaggi HTTP: esempio di richiesta Il protocollo utilizza messaggi in formato ASCII (testo leggibile) Esempio di messaggio http request:
Request line Request line contiene i icomandi contiene comandi (GET, POST), (GET, POST), loggetto eela loggetto la versione di versione di protocollo protocollo Header lines Header lines

GET /somedir/page.html HTTP/1.1 Host: www.unibo.it Connection: close User-agent: Mozilla/4.0 Accept: text/html, image/gif,image/jpeg Accept-language:fr

IlIlbody vuoto body vuoto Chiudi la connessione Chiudi la connessione al termine della al termine della richiesta richiesta 12

Un esempio un po pi complesso

GET /search?q=Introduction+to+XML+and+Web+Technologies HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.2) Gecko/20040803 Accept: text/xml,application/xml,application/xhtml+xml, text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: da,en-us;q=0.8,en;q=0.5,sw;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://www.google.com/

13

I comandi della richiesta - GET GET Serve per richiedere una risorsa ad un server il metodo pi frequente: quello che viene attivato facendo click su un link ipertestuale di un documento HTML, o specificando un URL nellapposito campo di un browser previsto il passaggio di parametri (la parte <query> dellURL) La lunghezza massima di un URL limitata

14

I comandi della richiesta - POST POST Stato progettato come il messaggio per richiedere una risorsa A differenza del GET i dettagli per la identificazione e la elaborazione della risorsa stessa non sono nellURL ma sono contenuti nel body del messaggio Non ci sono limiti di lunghezza nei parametri di una richiesta POST viene usato per esempio per sottomettere i dati di una form HTML ad unapplicazione CGI sul server Si ha una trasmissione di informazioni che per non porta alla creazione di una risorsa sul server
15

I comandi della richiesta - PUT e DELETE PUT Chiede la memorizzazione sul server di una risorsa allURL specificato Il metodo PUT serve quindi per trasmettere delle informazioni dal client al server A differenza del POST per si ha la creazione di una risorsa (o la sua sostituzione se esisteva gi) Largomento del metodo PUT la risorsa che ci si aspetta di ottenere facendo un GET in seguito con lo stesso nome DELETE Richiede la cancellazione della risorsa riferita dallURL specificato Sono normalmente disabilitati sui server pubblici
16

I comandi della richiesta HEAD, OPTIONS e TRACE HEAD: simile al metodo GET, ma il server deve rispondere soltanto con gli header relativi, senza body Viene usato per verificare un URL Validit: la risorsa esiste e non di lunghezza zero Accessibilit: non richiesta autenticazione OPTIONS: serve per richiedere informazioni sulle opzioni disponibili per la comunicazione TRACE: usato per invocare il loop-back remoto a livello applicativo del messaggio di richiesta Consente al client di vedere che cosa stato ricevuto dal server: viene usato nella diagnostica e nel testing dei servizi Web
17

Il formato della risposta


status line status line (protocollo, codice (protocollo, codice di stato, status di stato, status phrase) phrase)

Header lines Header lines

HTTP/1.1 200 OK Connection: close Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 ... Content-Length: 6821 Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>...</html

I Idati: per esempio dati: per esempio la pagina HTML la pagina HTML richiesta richiesta

HTTP 1.0: server chiude la connessione al termine della richiesta HTTP 1.1: server mantiene aperta la connessione oppure la chiude se si mette la clausola: Connection: close
18

I codici di stato
Lo status code un numero di tre cifre, di cui la prima indica la classe della risposta e le altre due la risposta specifica Ci sono 5 classi: 1xx: Informational. Una risposta temporanea alla richiesta, durante il suo svolgimento (sconsigliata a partire da HTTP 1.0) 2xx: Successful. Il server ha ricevuto, capito e accettato la richiesta 3xx: Redirection. Il server ha ricevuto e capito la richiesta, ma sono necessarie altre azioni da parte del client per portare a termine la richiesta 4xx: Client error. La richiesta del client non pu essere soddisfatta per un errore da parte del client (errore sintattico o richiesta non autorizzata) 5xx: Server error. La richiesta pu anche essere corretta, ma il server non in grado di soddisfare la richiesta per un problema interno (suo o di applicazioni CGI)
19

Esempi di codici di stato 100 Continue (se il client non ha ancora mandato il body) 200 Ok (GET con successo) 201 Created (PUT con successo) 301 Moved permanently (URL non valida, il server conosce la nuova posizione) 400 Bad request (errore sintattico nella richiesta) 401 Unauthorized (manca lautorizzazione) 403 Forbidden (richiesta non autorizzabile) 404 Not found (URL errato) 500 Internal server error (tipicamente un CGI mal fatto) 501 Not implemented (metodo non conosciuto dal server)
20

HTTP server: quali modelli di esecuzione? Vi ricordate vero la distinzione fra

server sequenziale, server concorrente e server parallelo? Soluzione concorrente: Processi pesanti o thread? Quale cardinalit del pool di processi/thread? Quando effettuare generazione processi/thread? Code e gestione code (FIFO, con priorit, ) Qualit di servizio: come ottenerla? Tradeoff fra costo del pool di processi/thread e latenza, ecc.
Una curiosit: in Unix numero massimo di processi generabili stato aumentato dopo il successo dei primi http server
21

HTTP server: quali modelli di esecuzione?

E per server http ad altissima scalabilit, ad es. http://www.google.com ? Pu essere sufficiente avere un pool di processi/thread su un unico server ad altissime prestazioni? Come andrebbe gestita opportunamente una soluzione con n server disponibili in parallelo? Quali problemi (sulla base di quello che gi conoscete su reti di calcolatori e uso di socket TCP)? Idee per soluzioni possibili

22

I cookie Parallelamente alle sequenze request/response, il protocollo prevede una struttura dati che si muove come un token, dal client al server e viceversa: i cookie I cookie possono essere generati sia dal client che dal server, dopo la loro creazione vengono sempre passati ad ogni trasmissione di request e response Hanno come scopo quello di fornire un supporto per il mantenimento di uno stato in un protocollo come http che essenzialmente stateless

23

Struttura dei cookie I cookie sono una collezione di stringhe: Key: identifica univocamente un cookie allinterno di un dominio:path Value: valore associato al cookie ( una stringa di max 255 caratteri) Path: posizione nellalbero di un sito al quale associato (di default /) Domain: dominio dove stato generato Max-age: (opzionale) numero di secondi di vita (permette la scadenza di una sessione) Secure: (opzionale) non molto usato. Questi cookie vengono trasferiti se e soltanto se il protocollo sicuro (https) Version: identifica la versione del protocollo di gestione dei cookie
24

Autenticazione Esistono situazioni in cui si vuole restringere laccesso alle risorse ai soli utenti abilitati Tecniche comunemente utilizzate Filtro su set di indirizzi IP Form per la richiesta di username e password HTTP Basic HTTP Digest

25

Riconoscimento dellindirizzo IP Basare lautenticazione sullindirizzo IP del client una soluzione che presenta vari svantaggi: Non funziona se lindirizzo non pubblico (vedi esempio dei NAT) Non funziona se lindirizzo IP assegnato dinamicamente (es. DHCP) Esistono tecniche che consentono di presentarsi con un IP fasullo (spoofing) Lautenticazione HTTP Digest caduta in disuso negli ultimi anni Normalmente si usano Form HTTP Basic
26

Autenticazione HTTP Basic Challenge:


HTTP/1.1 401 Authorization Required WWW-Authenticate: Basic realm="The Doe Family Site"

Response:
Authorization: Basic emFjaGFyaWFzOmFwcGxlcGllCg==

Testo in chiaro Testo in chiaro codificato in codificato in Base64 Base64

27

Autenticazione Form Normalmente si usa il metodo POST Analoghe considerazioni a quelle fatte per HTTP Basic

mrossi

28

Sicurezza Propriet desiderabili Confidenzialit Integrit Autenticit Non Ripudio

SSL/TLS

SSL: Secure Sockets Layer TLS: Transport Layer Security

29

SSL/TLS Viene posto un livello che si occupa della gestione di confidenzialit, autenticit ed integrit della comunicazione fra HTTP e TCP Accediamo tramite https://... Basato su crittografia a chiave pubblica private key + public key certificato (in genere usato per autenticare il server)

30

Architetture avanzate per il Web Proxy: Programma applicativo in grado di agire sia come Client che come Server al fine di effettuare richieste per conto di altri Clienti. Le Request vengono processate internamente oppure vengono ridirezionate al Server. Un proxy deve interpretare e, se necessario, riscrivere le Request prima di inoltrarle Gateway: Server che agisce da intermediario per altri Server. Al contrario dei proxy, il gateway riceve le request come se fosse il server originale e Client non in grado di identificare che Response proviene da un gateway. Detto anche reverse proxy Tunnel: Programma applicativo che agisce come blind relay tra due connessioni. Una volta attivo (in gergo salito) non partecipa alla comunicazione http

31

Caching Idea di base: memorizzare copie temporanee di documenti web (es. pagine HTML, immagini) al fine di ridurre luso della banda ed il carico sul server Una Web cache memorizza i documenti che la attraversano. Lobiettivo usare i documenti in cache per le successive richieste qualora alcune condizioni siano verificate Tipi di Web cache User Agent Cache Proxy Cache

32

User Agent Cache Lo user agent (tipicamente il browser) mantiene una cache delle pagine visitate dallutente Luso delle user agent cache era molto importante in passato quando gli utenti non avevano accesso a connessioni di rete a banda larga Questo modello di caching ora molto rilevante per i dispositivi mobili al fine di consentire agli utenti di lavorare con connettivit intermittente. Nuovi strumenti, es. Google Gears, si basano su questo concetto

33

Proxy Cache
Forward Proxy Cache Servono per ridurre le necessit di banda Es. rete locale aziendale, Universit, ecc. Il proxy intercetta il traffico e mette in cache le pagine Successive richieste non provocano lo scaricamento di ulteriori copie delle pagine al server Reverse Proxy Cache Gateway cache Operano per conto del server e consentono di ridurre il carico computazionale delle macchine I client non sono in grado di capire se le pagine arrivano dal server o dal gateway Internet Caching Protocol per il coordinamento fra diverse cache. Base per content delivery network (sapete farmi qualche esempio di content delivery network che conoscete?)

34

HTTP e Cache HTTP definisce vari meccanismi per la gestione delle cache Freshness: Validation: pu essere usato per controllare se un elemento in cache ancora corretto, ad es. nel caso in cui sia in cache da molto tempo Invalidation: normalmente un effetto collaterale di altre request che hanno attraversato la cache. Se per esempio viene mandata una POST, una PUT o una DELETE a un URL il contenuto della cache deve essere invalidato

35

Tecnologie Web T Il linguaggio HTML

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 1.04.HTML.pdf Versione elettronica: 1.04.HTML-2p.pdf
HTML 1

HTML

WWW = URL + HTTP + HTML


HTML lacronimo di HyperText Markup Language E il linguaggio utilizzato per descrivere le pagine che costituiscono i nodi dellipertesto E un linguaggio di codifica del testo del tipo a marcatori (markup) Un linguaggio di codifica del testo un formalismo con il quale possibile rappresentare un documento su supporto digitale in modo che sia trattabile dallelaboratore in quanto testo

HTML

Codifica dei caratteri I formalismi pi elementari per la codifica informatica del testo sono i sistemi di codifica dei caratteri In generale, ogni documento elettronico costituito da una stringa di caratteri Come qualsiasi altro tipo di dati, anche i caratteri vengono rappresentati allinterno di un elaboratore mediante una codifica binaria Per codificare i caratteri si stabilisce una corrispondenza biunivoca tra gli elementi di una collezione ordinata di caratteri e un insieme di codici numerici Si ottiene cos un coded character set che di solito si rappresenta in forma di tabella (code page o code table)
HTML 3

La codifica dei caratteri Per ciascun coded character set si definisce una codifica dei caratteri (character encoding) La codifica mappa una o pi sequenze di 8 bit (byte) a un numero intero che rappresenta un carattere in un determinato coded character set Il numero di caratteri rappresentabili in un certo coded charachter set determinato dal numero di bit utilizzati per codificare ogni singolo carattere I pi noti sono: ASCII (7 bit) Famiglia ISO 8859/ANSI (8 bit) Unicode (8, 16 o 32 bit: UTF-8, UTF-16 e UTF-32)

HTML

Linguaggi a marcatori La codifica dei caratteri non esaurisce i problemi di rappresentazione delle caratteristiche di un testo Un testo un oggetto complesso caratterizzato da molteplici livelli strutturali che non si limitano alla sequenza di simboli del sistema di scrittura Si parla propriamente di linguaggio di codifica testuale solo in riferimento ai linguaggi che consentono la rappresentazione o il controllo di uno o pi livelli strutturali di un documento testuale Tali linguaggi vengono correntemente denominati linguaggi a marcatori (mark-up languages)

HTML

Caratteristiche dei linguaggi a marcatori Un linguaggio di mark-up composto da: un insieme di istruzioni dette tag o mark-up (marcatori) che rappresentano le caratteristiche del documento testuale una grammatica che regola luso del mark-up una semantica che definisce il dominio di applicazione e la funzione del mark-up I marcatori vengono inseriti direttamente allinterno del testo cui viene applicato Ogni tag a sua volta costituito da una sequenza di caratteri, preceduta da caratteri speciali che la delimitano e permettono allelaboratore di distinguere il testo dai marcatori
HTML 6

Classificazione Tradizionalmente i linguaggi di mark-up sono stati divisi in due tipologie: linguaggi procedurali o imperativi linguaggi descrittivi o dichiarativi Questa classificazione risale a Charles Goldfarb, il padre di SGML Nei linguaggi procedurali il mark-up specifica quali operazioni un dato programma deve compiere su un documento elettronico per ottenere una determinata presentazione (Tex, LateX) Nei linguaggi descrittivi il mark-up descrive la struttura di un documento testuale identificandone i componenti (SGML, HTML, XML)
HTML 7

Linguaggi dichiarativi In particolare viene descritta la struttura editoriale, costituita da componenti (content object) organizzati in modo gerarchico Frontespizio, introduzione, corpo, appendice Capitoli, sottocapitoli, atti, scene, canti Titoli, epigrafi, abstract Paragrafi, versi, battute, entrate di dizionario Enfasi, citazioni

HTML

Potenza espressiva La potenza espressiva di un linguaggio di mark-up pu essere definita come la capacit di: Modellare il maggior numero possibile di tipologie e generi testuali Rappresentare adeguatamente il maggior numero di livelli strutturali e di caratteristiche di un documento testuale Esprimere tali caratteristiche secondo diverse prospettive metodologiche Associare metadati descrittivi e gestionali ai documenti digitali

HTML

Portabilit e riusabilit Portabilit: un documento digitale dovrebbe essere accessibile su ogni piattaforma e dispositivo informatico Riusabilit: un documento digitale dovrebbe essere accessibile anche a distanza di tempo dalla sua creazione Indipendenza dallhardware: architettura, supporto (CD, floppy), sistema di output (video, stampa) Indipendenza dal software: sistema operativo e software usato per la creazione, analisi, elaborazione e visualizzazione del testo

HTML

10

SGML SGML = Standard Generalized Markup Language E uno standard ISO (8879) pubblicato nel 1986 un meccanismo flessibile e portabile per rappresentare documenti elettronici Un documento SGML comprende oggetti di varie classi (capitoli, titoli, riferimenti, oggetti grafici, etc.) Questi oggetti sono chiamati elementi. SGML identifica gli estremi degli elementi tramite tag iniziali e finali Non contiene sequenze di istruzioni di formattazione Gli elementi sono organizzati in una gerarchia: un capitolo contiene un titolo ed una o pi sezioni che a loro volta contengono altri elementi, ecc.

HTML

11

HTML e SGML HTML unapplicazione SGML ovvero un tipo di documento SGML Tramite HTML possibile realizzare documenti con una semplice struttura che contengono testo, immagini, oggetti interattivi e connessioni ipertestuali ad altri documenti Oltre a descrivere il contenuto, HTML associa anche significati grafici agli elementi che definisce istruzioni pi o meno precise su come rendere graficamente gli elementi che definisce Come vedremo questa commistione crea diversi problemi

HTML

12

Storia di HTML
Gen 2011 (working draft state) XHTML 5.0 Gen 2008 (draft) HTML 5.0 Mag 2000 XHTML 1.0 ISO HTML

Mag 2001 W3C

XHTML 1.1

Gen 2000

= 4.01 Strict

Dic 1999

HTML 4.01

Dic 1997 Gen 1997

HTML 4.0 HTML 3.2

Nov 1995 IETF Nov 1992 Ott 1991

HTML 2.0

HTML 3.0

HTML 1.1

HTML 1.0

HTML

13

HTML 4.01 Nel seguito faremo riferimento a HTML 4.01 E lo standard attualmente in uso (assieme a XHTML di cui parleremo in seguito) Prevede tre varianti: Strict, in cui gli elementi deprecati sono vietati Transitional, in cui gli elementi deprecati sono

ammessi

Frameset, in cui sono ammessi anche i frames e gli

elementi collegati

Nel maggio 2000 lHTML 4.01 Strict diventato standard ISO/IEC con il codice 15445:2000

HTML

14

Tag I tag HTML sono usati per definire il mark-up di elementi HTML Sono preceduti e seguiti rispettivamente da due caratteri < e > (parentesi angolari) Sono normalmente accoppiati; un esempio dato da: <p> e </p>, detti rispettivamente start tag ed end tag Il testo tra start tag ed end tag detto contenuto dellelemento Un documento HTML contiene quindi elementi composti da testo semplice delimitato da tag:
Elemento

<p>Testo di un paragrafo</p>
start tag Contenuto dellelemento end tag

HTML

15

Grammatica poco rigorosa HTML rispetta in maniera poco rigorosa le specifiche SGML Ammette elementi senza chiusura come <br> I tag non sono case sensitive Lapertura e chiusura di tag annidati pu essere incrociata <b><i>Testo corsivo grassetto</b></i> Esistono per delle buone pratiche che bene rispettare e che diventano un obbligo in una versione pi rigorosa del linguaggio chiamata XHTML Chiudere sempre anche i tag singoli: <br></br> o in forma sintetica <br/> Tag in minuscolo Apertura e chiusura senza incroci (in teoria non ammessi ma tollerati) <b><i></i></b>
HTML 16

Entity HTML definisce un certo numero di entit (entity) per rappresentare i caratteri speciali senza incorrere in problemi di codifica: Caratteri riservati a HTML (<, >, &, , ecc.) Caratteri non presenti nellASCII a 7 bit &Amp; & &quot; &lt; < &gt; < &reg; &nbsp; (non-breaking space) &Aelig; &Aacute; &Agrave; &Auml; &aelig; &aacute; &agrave; &auml; &ccedil; &ntilde;
HTML 17

Attributi Un elemento pu essere dettagliato mediante attributi Gli attributi sono coppie nome=valore contenute nello start tag con una sintassi di questo tipo <tag attrib1=valore1 attrib2=valore2 I valori sono racchiusi da apici singoli o doppi Esempio: <input type='submit' value="NAME">Ok</input> Gli apici possono essere omessi se il valore contiene un numero o una singola parola I colori vengono espressi con un nome o in formato RGB con la sintassi #RRGGBB
Red = "#FF0000 Blue = "#0000FF" HTML Black = "#000000 Yellow = "#FFFF00 18

Tipi MIME Lo standard MIME (Multipurpose Internet Mail Extensions) nato per poter allegare file ai messaggi di posta elettronica, che supportano tipicamente solo testo a 7 bit E una classificazione dei tipi di contenuto basata su una logica a due livelli ed largamente utilizzata nellambito di HTML e delle tecnologie web in generale Un tipo MIME espresso con questa sintassi: tipo/sottotipo Esempi: text/plain: testo semplice text/html: testo HTML

HTML

19

Commenti E possibile inserire commenti in quelunque punto allinterno di una pagina HTML con la seguente sintassi: <!-- Questo un testo di commento -->

HTML

20

Struttura base di un documento HTML


<!DOCTYPE HTML PUBLIC "//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Hello document</title> </head>

<body> Hello World! </body> </html>

HTML

21

DTD
Il primo elemento di un documento HTML la definizione del tipo di documento (Document Type Definition o DTD): Serve al browser per identificare le regole di interpretazione e visualizzazione da applicare al documento Esempio:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" http://www.w3.org/TR/html4/loose.dtd>

E costituita da diverse parti: HTML il tipo di linguaggio utilizzato l'HTML PUBLIC il documento pubblico - le specifiche non sono registrate all'ISO (altrimenti +) W3C ente che ha rilasciato le specifiche DTD HTML 4.01 Transitional: versione di HTML EN la lingua con cui scritta il DTD l'inglese http://... URL delle specifiche
HTML 22

Header
E identificato dal tag <head> Contiene elementi non visualizzati dal browser (informazioni di servizio) <title> titolo della pagina (viene mostrato nella testata della finestra principale del browser) <meta> metadati informazioni utili ad applicazioni esterne (es. motori di ricerca) o al browser (es. lingua, codifica dei caratteri, utile per la visualizzazione di alfabeti non latini) <base> definisce come vengono gestiti i riferimenti relativi nei link <link> collegamenti verso file esterni: CSS, script, icone visualizzabili nella barra degli indirizzi del browser <script> codice eseguibile utilizzato dal documento <style> informazioni di stile (CSS locali)
HTML 23

Elementi <meta> Gli elementi di tipo <meta> sono caratterizzati da una serie di attributi Esistono due tipi di elementi meta, distinguibili dal primo attributo: http-equiv o name Gli elementi di tipo http-equiv danno informazioni al browser su come gestire la pagina Hanno una struttura di questo tipo: <meta http-equiv=nome content=valore> Gli elementi di tipo name forniscono informazioni utili ma non critiche Hanno una struttura di questo tipo: <meta nome=nome content=valore>

HTML

24

Elementi <meta> di tipo http-equiv refresh: indica che la pagina deve essere ricaricata dopo un numero di secondi definito dallattributo content <meta http-equiv=refresh content=45> expires: stabilisce una data scadenza (fine validit) per il documento <meta http-equiv=expires content="Tue, 20 Aug 1996 14:25:27 GMT"> content type: definisce il tipo di dati contenuto nella pagina (di solito il tipo MIME text/html): <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

HTML

25

Elementi <meta> di tipo name


author: autore della pagina: <meta name=author content=John Smith> description: descrizione della pagina <meta name=description content=Home page UNIBO"> copyright: indica che la pagina protetta da un diritto dautore <meta name=copyright content="Copyright 2009, John Smith"> keywords: lista di parole chiave separate da virgole, usate dai motori di ricerca <meta name=keywords lang="en" content="computer documentation, computers, computer help"> date: data di creazione del documento <meta name="date" content="2008-0507T09:10:56+00:00">
HTML 26

Esempio di header <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <meta name="description" content=Documentation about HTML"> <meta name="keywords" content="HTML, tags, commands"> <title>Impariamo lHTML</title> <link href="style.css" rel=stylesheet type="text/css"> </head>

HTML

27

Body Il tag <body> delimita il corpo del documento Contiene la parte che viene mostrata dal browser Ammette diversi attributi tra cui: background =uri Definisce lURI di una immagine da usare come sfondo per la pagina text =color Definisce il colore del testo bgcolor =color In alternativa a background definisce il colore di sfondo della pagina lang =linguaggio definisce il linguaggio utilizzato nella pagina es. language="it"
HTML 28

Un esempio di BODY
<body> <h1>Titolo</h1> <p>Questo &eacute; un paragrafo completo di un documento.</p> <p>Un altro paragrafo<br>con un a capo</p> <hr> <p>Esempio di lista puntata, la lista della spesa:</p> <ul> <li>Pane</li> <li>Latte</li> <li>Prosciutto</li> <li>Formaggio</li> </ul> </body>
HTML

Visualizzazione

29

Tipi di elementi del body Intestazioni: titoli organizzati in gerarchia Strutture di testo: paragrafi, testo indentato, ecc. Aspetto del testo: grassetto, corsivo, ecc. Elenchi e liste: numerati, puntati Tabelle Form (moduli elettronici): campi di inserimento, checkbox e radio button, menu a tendina, bottoni, ecc. Collegamenti ipertestuali e ancore Immagini e contenuti multimediali (audio, video, animazioni, ecc.) Contenuti interattivi: script, applicazioni esterne

HTML

30

Elementi blocco ed elementi inline Dal punto di vista del layout della pagina gli elementi HTML si dividono in 3 grandi categorie: Elementi block-level: costituiscono un blocco attorno a s, e di conseguenza vanno a capo (paragrafi, tabelle, form) Elementi inline: non vanno a capo e possono essere integrati nel testo (link, immagini,) Liste: numerate, puntate Regole di composizione: Un elemento block-level pu contenere altri elementi dello stesso tipo o di tipo inline Un elemento inline pu contenere solo altri elementi inline
HTML 31

Elementi rimpiazzati e non rimpiazzati Un'altra distinzione da ricordare quella tra elementi rimpiazzati (replaced elements) ed elementi non rimpiazzati Gli elementi rimpiazzati sono quelli di cui il browser conosce le dimensioni intrinseche Sono quelli in cui altezza e larghezza sono definite dall'elemento stesso e non da ci che lo circonda L'esempio pi tipico di elemento rimpiazzato <img> Altri elementi rimpiazzati sono: <input>,<textarea>,<select> Tutti gli altri elementi sono in genere considerati non rimpiazzati

HTML

32

Heading
I tag <h1>,< h2> ... <h6> servono per definire dei titoli di importanza decrescente (<h1> il pi importante) La "h" sta per "heading", cio titolo e sono previste 6 grandezze I titoli appaiono in grassetto e lascano una riga vuota prima e dopo di s (sono elementi di blocco) Ammettono attributi di allineamento: <h1 align = left|center|right|justify>

<h1>titolo <h2>titolo <h3>titolo <h4>titolo <h5>titolo <h6>titolo

1 2 3 4 5 6

</h1> </h2> </h3> </h4> </h5> </h6>

HTML

33

Contenitori di testo: paragrafi Il paragrafo l'unit di base entro cui suddividere un testo: un elemento di tipo blocco Il tag <p> lascia una riga vuota prima della sua apertura e dopo la sua chiusura Se si vuole andar a capo allinterno di un paragrafo si usa lelemento <br>

Esempio: due paragrafi <p>paragrafo 1</p> <p>paragrafo 2</p> Vengono visualizzati cos:
paragrafo1 paragrafo2
HTML 34

Esempio di paragrafi
<p>Il romanzo si apre con il famoso incipit che introduce una realistica e minuziosa descrizione dellambiente in cui si svolgono i fatti:</p> <p>Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume, tra un promontorio a destra, e un'ampia costiera dall'altra parte;<br> e il ponte, che ivi congiunge le due rive, par che renda ancor pi sensibile all'occhio questa trasformazione, e segni il punto in cui il lago cessa, e l'Adda rincomincia, per ripigliar poi nome di lago dove le rive, allontanandosi di nuovo, lascian l'acqua distendersi e rallentarsi in nuovi golfi e in nuovi seni.</p> Il romanzo si apre con il famoso incipit che introduce una realistica e minuziosa descrizione dellambiente in cui si svolgono i fatti: Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume, tra un promontorio a destra, e un'ampia costiera dall'altra parte; e il ponte, che ivi congiunge le due rive, par che renda ancor pi sensibile all'occhio questa trasformazione, e segni il punto in cui il lago cessa, e l'Adda rincomincia, per ripigliar poi nome di lago dove le rive, allontanandosi di nuovo, lascian l'acqua distendersi e rallentarsi in nuovi golfi e in nuovi seni.

HTML

35

Allineamento E possibile definire lallineamento di un paragrafo mediante lattributo align Abbiamo 4 valori: align = left align = center align = right align = justify
Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume Quel ramo del lago di Como, che volge a mezzogiorno, tra due catene non interrotte di monti, tutto a seni e a golfi, a seconda dello sporgere e del rientrare di quelli, vien, quasi a un tratto, a ristringersi, e a prender corso e figura di fiume

HTML

36

Div Se al posto di <p> si usa il tag <div> il blocco di testo va a capo, ma - a differenza del paragrafo - non lascia spazi prima e dopo la sua apertura E l'elemento di tipo block per eccellenza Esempio: due <div> <div>Blocco di testo 1</div> <div>Blocco di testo 2</div> Vengono visualizzati cos:
Blocco di testo 1 Blocco di testo 2

HTML

37

Span Lo <span> un contenitore generico che pu essere annidato (ad esempio) all'interno dei <div> E un elemento inline, e quindi non va a capo ma continua sulla stessa linea del tag che lo include Esempio: due <span>
<span>Contenitore 1</span><span>Contenitore 2</span>

Visualizzazione:
Contenitore 1Contenitore 2

E un elemento molto utilizzato soprattutto insieme ai fogli di stile per dare un aspetto particolare ad un pezzo di testo in un blocco (per esempio , per evidenziare) Se non viene associato ad uno stile invisibile
HTML 38

Contenitori di testo: riepilogo Ricapitolando: <p>, <div> e <span> sono tre diversi tipi di contenitori di testo Si comportano in modo diverso: <p> un elemento di blocco e lascia spazio prima e dopo la propria chiusura <div> e un elemento di blocco: non lascia spazio prima e dopo la propria chiusura, ma va a capo <span> un elemento inline e quindi non va a capo

HTML

39

Horizontal rule
Il tag <hr> serve ad inserire una riga di separazione Attributi: align = {left|center|right} Allineamento della riga rispetto a ci che la circonda size = pixels Altezza della riga width = length Larghezza della riga in modo assoluto o in percentuale delle dimensioni di ci che la contiene noshade Riga senza effetto di ombreggiatura
<hr width="50%" align="center"> <hr size="5" width="50%" align="center"> <hr noshade size="5" width="50%" align="center">
HTML 40

Gli stili del testo Nella terminologia tipografica lo "stile di un testo" indica le possibili varianti di forma di un carattere: tondo (normale), neretto (grassetto), corsivo HTML consente di definire lo stile di un frammento di testo, combinando fra loro anche pi stili I tag che svolgono questa funziona vengono normalmente suddivisi in fisici e logici: Tag fisici: definiscono lo stile del carattere in termini grafici indipendentemente dalla funzione del testo nel documento Tag logici: forniscono informazioni sul ruolo svolto dal contenuto, e in base a questo adottano uno stile grafico
HTML 41

Tag fisici

<tt>...</tt> <i>...</i> <b>...</b> <u>...</u> <s>...</s>

Carattere monospaziato Corsivo Grassetto Sottolineato (deprecato) Testo barrato


monospaced text
italic text

< tt>monospaced text</tt>

<i>italic text</i>

<b>bold text</b>
<u>underlined text</u> <s>stroke</s>

bold text
underlined text stroke

HTML

42

Tag logici
<strong> <em> (emphasis) <code> <pre> <kbd> <abbr> <acronym> <address> <blockquote> <cite> Usualmente visualizzato in grassetto Usualmente visualizzato in corsivo Codice: usualmente monospaziato Keyboard: monospaziato come code Abbreviazione (nessun effetto) Acronimo (nessun effetto) Indirizzo fisico o e-mail: in corsivo Blocco di citazione: rientrato a destra Citazione: visualizzato in corsivo

HTML

43

Font Il tag <font> permette di formattare il testo, definendo dimensioni, colore, tipo di carattere E lesempio limite del mescolamento fra contenuto e rappresentazione E deprecato in HTML 4.01 Attributi: size = [+|-]n Definisce le dimensioni del testo (1-7 o relative) color = color Definisce il colore del testo face = text Definisce il font del testo

HTML

44

Liste non ordinate Il tag <ul> (unordered list) permette di definire liste non ordinate (puntate) Gli elementi della lista vengono definiti mediante il tag <li> (list item) Lattributo type definisce la forma dei punti e ammette 3 valori: disc, circle e square
<ul type=disc> <li>Unordered information.</li> <li>Ordered information.</li> <li>Definitions.</li> </ul>

Unordered information. Ordered information. Definitions.

HTML

45

Liste ordinate Il tag <ol> (ordered list) permette di definire liste ordinate (numerati) Gli elementi vengono definiti mediante il tag <li> Lattributo type definisce il tipo di numerazione e ammette 5 valori: 1 (1,2,..), a (a,b,..), A (A,B,..), i (i,ii,..) e I (I,II,..)
<ol type=I> <li>Unordered information.</li> <li>Ordered information.</li> <li>Definitions.</li> </ol>
I. II. III.
HTML

Unordered information. Ordered information. Definitions.


46

Liste di definizione Il tag <dl> (definition list) permette di definire liste di definizione Sono liste costituite alternativamente da termini (tag <dt>) e definizioni (tag <dd>)
<dl> <dt><strong>UL</strong></dt> <dd>Unordered List.</dd> <dt><strong>OL</strong></dt> <dd>Ordered List.</dd> </dl>

UL

Unordered List.
OL Ordered List.
HTML 47

Tabelle
<table border="1" > <caption align=top> <em>A test table with merged cells</em></caption> <tr> <th rowspan="2"></th> <th colspan="2">Average</th> <th rowspan="2">Red<br/>eyes</th> </tr> <tr><th>height</th><th>weight</th></tr> <tr><th>Males</th><td>1.9</td><td>0.003</td><td>40%</td></tr> <tr><th>Females</th><td>1.7</td><td>0.002</td><td>43%</td></tr> </table>

HTML

48

<table> Il tag <table> racchiude la tabella Attributi: align = {left|center|right} allineamento della tabella rispetto alla pagina; width=n|n% larghezza della tabella (anche in percentuale rispetto alla pagina); bgcolor=#xxxxxx colore di sfondo della tabella; border=n spessore dei bordi della tabella (0 = tabella senza bordi); cellspacing, cellpadding
HTML 49

Righe <tr> il tag che racchiude ciascuna riga della tabella Attributi: align = {left|center|right|justify} allineamento del contenuto delle celle della riga; valign = {top|middle|bottom|baseline} allineamento verticale del contenuto delle cella della riga; bgcolor=#xxxxxx colore di sfondo della riga

HTML

50

Testate e celle <th> e <td> sono i tag che racchiudono le celle <th> serve per le celle della testata <td> serve per le celle del contenuto Attributi: Gli stessi di <tr> width, height = {length|length%} specifica le dimensioni (larghezza e altezza) della cella, dimensione assoluta (pixels) o valore percentuale; rowspan, colspan = n indica su quante righe/colonne della tabella si estende la cella

HTML

51

Tabelle e layout
Le tabelle sono nate sostanzialmente per organizzare dati in modo ordinato Nel tempo si sono rivelate uno strumento indispensabile per definire layout grafici complessi per le pagine web Permettono di costruire griglie in cui inserire i contenuti di un sito e per mezzo degli sfondi e dei margini possibile riprodurre unimpostazione accattivante Permettono di realizzare i cosiddetti layout liquidi, che si adattano cio alla risoluzione del monitor dellutente (grazie uso delle dimensioni in %) La tendenza attuale quella di superare questa tecnica, che presenta alcuni inconvenienti Mischia elementi di formattazione dei dati ai dati stessi Appesantisce le pagine con molti elementi, rallentando lo scaricamento Siamo comunque in una fase di transizione e limpaginazione a tabelle ancora molto usata
HTML 52

Link ipertestuali Il link il costrutto di base di un ipertesto Caratterizza HTML come linguaggio a marcatori per la descrizione di ipertesti E una connessione fra una risorsa Web ed unaltra Un link costituito da due estremi - detti ncore (anchor) - e da una direzione di percorrenza Link = source anchor destination anchor Lncora di origine (source anchor) un elemento contenuto nella pagina di partenza Lncora di destinazione (destination anchor) una qualsiasi risorsa web (unimmagine, un video, un eseguibile, un documento HTML o un elemento interno al documento) La risorsa di destinazione si ottiene visitando il link
HTML 53

Ancore In HTML le ancore, sia di origine che di destinazione, si esprimono utilizzando il tag <a> Le ncore di origine sono caratterizzate da un attributo, denominato href, che contiene lindirizzo di destinazione ( un URL) Le ncore di destinazione sono invece caratterizzate dallattributo name Lesempio pi semplice di link quello che collega due elementi allinterno di uno stesso documento In questo caso lattributo href dellncora di origine ha la forma #nome nome il valore dellattributo name dellncora di destinazione Un elemento #xxxx posto alla fine di un URL viene chiamato fragment
HTML 54

Esempio di link allinterno di un documento


<p> <a href="#section1"> Introduzione</a><br> <a href ="#section2"> Concetti di base</a><br> <a href ="#section2.1"> Definizione del problema</a><br> ... </p> <h2><a name="section1"> Introduzione</a></h2> ...sezione 1... <h2><a name ="section2"> Concetti di base</a></h2> ...sezione 2... <h3><a name ="section2.1"> Definizione del problema</a></h3> ...sezione 2.1...

HTML

55

Ancore implicite Si pu esprimere unncora di destinazione in forma implicita, cio senza utilizzare il tag <a> E sufficiente assegnare lattributo ID a un qualunque elemento della pagina E una forma pi compatta anche se probabilmente meno facile da interpretare

HTML

56

Esempio con ancore di destinazione implicite


<p> <a href="#section1"> Introduzione</a><br> <a href="#section2"> Concetti di base</a><br> <a href="#section2.1"> Definizione del problema</a><br> ... </p> <h2 id="section1"> Introduzione</h2> ...sezione 1... <h2 id="section2"> Concetti di base</h2> ...sezione 2... <h3 id="section2.1"> Definizione del problema</h3> ...sezione 2.1...

HTML

57

Link a risorsa esterna Il caso pi comune quello di un link ad un altro documento (pagina HTML) o in generale ad unaltra risorsa In questo caso il primo link non specifica un ncora e quindi si salta allinizio del documento chapter2.html
<body> ... <p>Per maggiori informazioni leggete il <a href="chapter2.html">capitolo 2</a>. Guardate anche questa <a href="../images/forest.gif">mappa della foresta incantata.</a></p> ... </body>

HTML

58

Link completo Il caso pi completo quello di un link ad un punto preciso di un documento (ncora di destinazione)
... <p>Per maggiori informazioni leggete il <a href="chapter2.html#section2 "> secondo paragrafo del capitolo 2</a>. Guardate anche questa <a href="../images/forest.gif"> mappa della foresta incantata.</a></p> ...
chapter1.html

chapter2.html

... <h1>Capitolo 2</h1> <h2><a name="section1">Paragrafo 1</a></h2> <p>Testo del primo paragrafo...</p> <h2><a name="section2">Paragrafo 2</a></h2> <p>Testo del secondo paragrafo...</p> ...

HTML

59

URL relativi e assoluti Gli URL utilizzati nellattributo HREF possono essere assoluti o relativi Se sono relativi si procede alla risoluzione utilizzando come base la base del documento Per esempio se lURL completo del documento corrente : www.deis.unibo.it/docs/chapter1.html E lurl relativo messo in HREF chapter2.html

LURL base sar www.deis.unibo.it/docs/


E la risoluzione porter allURL assoluto: www.deis.unibo.it/docs/chapter2.html
HTML 60

Link e HTTP Cosa succede quando si clicca su unncora di origine? LURL definito dallattributo HREF viene risolto Se un URL HTTP, fatta una chiamata HTTP al server in cui si trova il documento E una chiamata di tipo GET per ottenere la risorsa descritta dallURL La pagina viene caricata e visualizzata dal browser Se stata definita anche la parte fragment (#xxxxxx) il browser si porta al punto della pagina specificato

HTML

61

Immagini
Il tag <img> consente di inserire immagini in un documento HTML con la sintassi:

<img src ="sitemap.gif">


Attributi: src = uri specifica lindirizzo dellimmagine (required) alt = text testo alternativo nel caso fosse impossibile visualizzare limmagine align = {bottom|middle|top|left|right} (deprecato in HTML 4) posizione dellimmagine rispetto al testo che la circonda width,height = pixels larghezza e altezza dellimmagine in pixel border = pixels (deprecato in HTML 4) spessore del bordo dellimmagine (0 = nessun bordo)

HTML

62

Form Un form (modulo) una sezione di documento HTML che contiene elementi di controllo che lutente pu utilizzare per inserire dati o in generale per interagire I dati inseriti possono essere poi inoltrati al server dove un agente pu processarli Gli elementi di controllo sono caratterizzati da un valore iniziale e da un valore corrente Gli elementi di controllo possono essere: Bottoni di azione Checkbox (caselle di spunta) Radio Button (bottoni mutuamente esclusivi) Liste di selezione (Lista di opzioni) Caselle di inserimento di testo Oggetti nascosti (elementi valorizzati ma invisibili)
HTML 63

Il tag <form>
Il tag <form> racchiude tutti gli elementi del modulo ( un elemento di tipo blocco) Attributi: action = uri URI dellagente che ricever i dati del form name = text specifica il nome della form method = {get|post} specifica il modo in cui i dati vengono inviati enctype = content-type se il metodo post specifica il content type usato per la codifica (encoding) dei dati contenuti nel form: default application/x-www-form-urlencoded
<form action="http://site.com/bin/adduser method="post"> ...form contents... </form>
HTML 64

Elementi input
La maggior parte dei controlli viene definita mediante il tag <input> Lattributo type stabilisce il tipo di controllo text: casella di testo monoriga password: come text ma il testo non leggibile (****) file: controllo che consente di caricare un file checkbox: casella di spunta radio: radio button submit: bottone per trasmettere il contenuto del form image: bottone di submit sotto forma di immagine reset: bottone che riporta tutti i campi al valore iniziale button: bottone di azione hidden: campo nascosto Tutti gli input possono essere disabilitati utilizzando lattributo disabled nella forma disabled = disabled
HTML 65

Input text

E un campo per linserimento di testo su una sola riga Attributi: name = text nome del controllo value = text eventuale valore iniziale size = n lunghezza del campo (numero di caratteri) maxlength = n massima lunghezza del testo (numero di caratteri)
<form ="http://site.com/bin/adduser" method="post"> <p> Nome: <input type="text" name="firstname"> </p> </form>
HTML 66

Input file
Consente di fare lupload di un file selezionandolo nel file system del client Attributi: name = text specifica il nome del controllo value = content-type lista di MIME types per lupload Richiede una codifica particolare per il form (multipart/form-data) perch le informazioni trasmesse con il post contengono tipologie di dati diverse: testo per i controlli normali, binario per il file da caricare
<form action="http://site.com/bin/adduser" method="post enctype="multipart/form-data" > <p> File: <input type="file" name="attach"> </p> </form>
HTML 67

Checkbox
Un input con tipo checkbox definisce una casella di spunta Attributi: name = text nome del controllo value = text valore restituito se la casella viene spuntata checked = checked stabilisce se la casella inizialmente spuntata
<form action="http://site.com/bin/adduser" method="post"> <p> <input type="checkbox" name="food value="pane"> Pane<br/> <input type="checkbox" name="food" value="burro"> Burro<br/> <input type="checkbox" name="drink value="acqua checked="checked"> Acqua<br/> </p> </form>
HTML 68

Radio button Un radio button una casella di spunta che serve per realizzare gruppi di scelta mutuamente esclusivi Tutti i controlli di questo tipo che condividono lo stesso nome sono esclusivi fra di loro Si pu stabilire che un bottone spuntato per default con lattributo checked nella forma: checked=checked
<form action="http://site.com/bin/adduser" method="post"> <p> <input type="radio" name="sex" value="M">Maschio<br/> <input type="radio" name="sex" value="F">Femmina<br/> </p> </form>

HTML

69

Bottoni Per i bottoni si utilizzano tre valori dellattributo type submit per il bottone che provoca la spedizione del form al server reset per il bottone che riporta il contenuto dei campi al valore originale button per un generico bottone di azione Letichetta che compare nel bottone viene definita usando lattributo value
<form action="http://site.com/bin/adduser" method="post"> <input type="submit" value="Conferma">&nbsp;&nbsp; <input type="reset" value="Azzera"> </form>

HTML

70

Il tag <button> In HTML 4 stato introdotto il tag <button> che offre la possibilit di creare dei bottoni con un aspetto anche complesso Infatti <button> d la possibilit di inserire il testo del bottone come contenuto del tag Questo consente di specificare anche codice HTML all'interno del tag: testo formattato ma anche immagini

<form action="http://site.com/bin/adduser" method="post"> <button type="button">Generico</button>&nbsp; <button type="reset"><i>Azzera</i></button>&nbsp; <button type="submit"><b>Invia</b></button> </form>

HTML

71

Liste di opzioni Il tag <select> permette di costruire liste di opzioni Per definire le singole opzioni si usa il tag <option> ricorrendo allattributo value si pu attribuire il valore Con l'attributo selected si pu indicare una scelta predefinita: selected=selected Laspetto di default quello di un combo box (tendina a discesa)
<form action="http://site.com/bin/adduser" method="post"> <select name="provincia" > <option value="BO" selected="selected">Bologna</option> <option value="MO">Modena</option> <option value="RE">Reggio Emilia</option> <option value="PR">Parma</option> <option value="PC">Piacenza</option> </select> </form>

HTML

72

Liste a scelta multipla Se si utilizza lattributo multiple (nella forma multiple=multiple) non abbiamo pi un combo ma una lista sempre aperta Si pu operare una scelta multipla tenendo premuto il tasto [Ctrl] durante la selezione Lattributo size determina il numero di righe mostrate
<form action="http://site.com/bin/adduser" method="post"> <select name="provincia" multiple=multiple> <option value="BO" selected="selected">Bologna</option> <option value="MO">Modena</option> <option value="RE selected=selected>Reggio Emilia</option> <option value="PR">Parma</option> <option value="PC">Piacenza</option> </select> </form>

HTML

73

Gruppi di opzioni Con il tag <optgroup> possibile organizzare la lista (sia a scelta singola che multipla) in gruppi Molto utile per liste lunghe
<form action="http://site.com/bin/adduser" method="post"> <select name="provincia" multiple="multiple" size=7> <optgroup label="Capoluogo"> <option value="BO" selected="selected">Bologna</option> </optgroup> <optgroup label="Emilia"> <option value="MO">Modena</option> <option value="RE">Reggio Emilia</option> <option value="PR">Parma</option> <option value="PC">Piacenza</option> </optgroup> </select> </form>

HTML

74

Textarea Il tag <textarea> consente di definire un campo di inserimento multiriga adatto a un testo lungo Il contenuto dellelemento il testo iniziale L'attributo rows indica il numero di righe della textarea, cols il numero di caratteri (cio di colonne) che ogni riga pu contenere.
<form action="http://site.com/bin/adduser" method="post"> <textarea name="testo" rows="8" cols="30">Testo iniziale </textarea> </form>

HTML

75

Organizzare form complessi Con il tag <fieldset> si possono creare gruppi di campi a cui possibile attribuire un nome utilizzando il tag <legend>
<form action="http://site.com/bin/adduser" method="post"> <fieldset> <legend>Nome e cognome</legend> Nome: <input type="text" name="nome"><br> Cognome: <input type="text" name=""cognome"> </fieldset> <fieldset> <legend>Provincia</legend> <select name="provincia" multiple="multiple" size=7> <optgroup label="Capoluogo"> <option value="BO" selected="selected">Bologna</option> </optgroup> <optgroup label="Emilia"> <option value="MO">Modena</option> <option value="RE">Reggio Emilia</option> <option value="PR">Parma</option> <option value="PC">Piacenza</option> </optgroup> </select> </fieldset> </form>

HTML

76

Collegare le etichette ai controlli Il tag <label> permette di associare unetichetta ad un qualunque controllo di un form Lassociazione pu essere fatta in forma implicita inserendo il controllo nellelemento label Oppure in forma esplicita tramite lattributo for che deve corrispondere allattributo id del controllo
<form action=> <label>Nome: <input type="text id=nome></label><br> <label>Cognome: <input type="text" id=cognome"></label><br> </form> <form action=> <label for=nome">Nome: </label> <input type="text" id=nome"><br> <label for=cognome">Cognome: </label> <input type="text" id=cognome"><br> </form>
HTML 77

Inline frames Lelemento <iframe> crea un frame inline che contiene un altro documento E deprecato in HTML 4.01 ma ancora molto utilizzato (in certi casi indispensabile)

<iframe src =interno.html" width="100%"> </iframe>

Documento

iframe (doc HTML)

HTML principale

HTML

78

Il DOM Una pagina HTML pu essere rappresentata come una struttura ad albero Questa struttura prende il nome di DOM: Document Object Model
<html> <head> <title>My title</title> </head> <body> <a href=>MyLink</a> <h1>My header</h1> </body> </html>
Testo HTML
DOM

Quando un browser carica una pagina HTML la


HTML

scompone e costruisce la struttura ad albero del DOM


79

Riferimenti HTML 4.01 Specification - W3C Recommendation 24 December 1999: http://www.w3.org/TR/html401/ Guida in inglese (molto completa e ben fatta) http://www.w3schools.com/html/default.asp Corso su HMTL in italiano: http://xhtml.html.it/guide/leggi/51/guidahtml/

HTML

80

Tecnologie Web T CSS

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 1.05.CSS.pdf Versione elettronica: 1.05.CSS-2p.pdf
CSS 1

A cosa servono i CSS I fogli di stile a cascata (Cascading Style Sheets = CSS) hanno lo scopo fondamentale di separare contenuto e presentazione nelle pagine Web HTML serve a definire il contenuto senza tentare di dare indicazioni su come rappresentarlo CSS serve a definire come il contenuto deve essere presentato allutente I vantaggi sono evidenti: Lo stesso contenuto diventa riusabile in pi contesti Basta cambiare il CSS e pu essere presentato correttamente in modo ottimale su dispositivi diversi (es. PC e palmari) o addirittura su media diversi (es. video e carta) Si pu dividere il lavoro fra chi gestisce il contenuto e chi si occupa della parte grafica
CSS 2

Altri obiettivi dei CSS Ridurre i tempi di scaricamento delle pagine: una pagina che usa i CSS meno della met di una pagina che usa la formattazione con tag HTML, inoltre se il file CSS condiviso da pi pagine viene scaricato una volta sola Ripulire il codice HTML: eliminare luso di estensioni non proprietarie Rendere le pagine visualizzabili con dispositivi non convenzionali: palmari, smartphone, ecc.

CSS

Un po di storia Le specifiche del CSS sono state emanate dal W3C 1996 - CSS 1: poco usati a causa dello scarso supporto da parte dei browser (Netscape, IE3) 1998 - CSS 2: naturale evoluzione dei CSS 1, discreto supporto da parte dei browser (IE5, Firefox, Opera 7) 2004 - CSS 2.1: versione che migliora CSS 2 risolvendo errori e apportando aggiustamenti In fase di definizione: CSS 3 Nel seguito faremo riferimento alle specifiche CSS 2.1

CSS

CSS e HTML
<html> <head>...</head>

<body>
<h1>title</h1> <div> <p> uno </p> <p> due </p> </div> <p> tre
Un documento HTML pu essere visto come un insieme di blocchi (contenitori) sui quali si pu agire con stili diversi. Ogni tag HTML definisce un blocco.

<a href=link.html">link</a>
</p> </body> </html>

CSS

Un esempio: Hello World Creiamo una pagina HTML - denominata hello.html che mostra la scritta Hello World!
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML>

Non abbiamo dato alcuna indicazione su come rappresentare la pagina Abbiamo solo specificato che si tratta di un titolo di primo livello e di un paragrafo Il browser user gli stili standard
CSS 6

Hello World con CSS Creiamo un secondo file di testo denominato hello.css - che contiene queste due righe:
BODY { color: red } H1 { color: blue }

Colleghiamo i due file inserendo il link al CSS nella testata della pagina hello.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Hello World con CSS</TITLE> <LINK rel="stylesheet" href=hello.css" type="text/css"> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML>
CSS 7

Il risultato Ecco il risultato nei due casi:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Hello World con CSS</TITLE> <LINK rel="stylesheet" href=hello.css" type="text/css"> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML>

hello.html

hello.html
BODY { color: red } H1 { color: blue }

hello.css

CSS

Applicare gli stili ad una pagina - 1 Abbiamo due possibilit: Mettere gli stili in uno o pi file separati Inserire gli stili nella pagina stessa Se si sceglie di mettere gli stili in file separati (si parla di stili esterni) sono possibili due sintassi diverse:
<HTML> <HEAD> <TITLE>Hello World</TITLE> <link rel="stylesheet" href=hello.css" type="text/css"> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML> <HTML> <HEAD> <TITLE>Hello World</TITLE> <style type="text/css"> @import url(hello.css); </style> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML>

CSS

Applicare gli stili ad una pagina - 2 Se invece si sceglie di mettere gli stili nella pagina si pu procedere in due modi: Mettere tutti gli stili nellheader in un tag <style> (stili interni) Inserirli nei singoli elementi (stili inline)
<HTML> <HEAD> <TITLE>Hello World</TITLE> <style type="text/css"> BODY { color: red } H1 { color: blue } </style> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML> <HTML> <HEAD> <TITLE>Hello World</TITLE> </HEAD> <BODY style="color: red"> <H1 style="color: blue"> Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML>

CSS

10

Qual la scelta migliore? E sicuramente preferibile usare gli stili esterni: E facile applicare diversi stili alla stessa pagina Si ottimizza il trasferimento delle pagine perch il foglio stile rimane nella cache del browser Luso degli stili inline da evitare rendono molto basso il livello di separazione fra contenuto e presentazione Le modifiche sono molto complicate Gli stili interni sono una via di mezzo Fra le due sintassi per gli stili esterni: Quella con <link> pi diffusa Quella con @import meno critica per la compatibilit con i vecchi browser
CSS 11

Regole e loro struttura Unespressione come H1 { color: blue } prende il nome di regola CSS Una regola CSS composta da due parti: Selettore: H1 Dichiarazione: color: blue La dichiarazione a sua volta si divide in due parti Propriet: color Valore: blue La sintassi generale si pu quindi esprimere cos selettore { propriet: valore } O pi in generale: selettore { propriet1 : valore1; propriet2 : valore2, valore3; }
CSS 12

Selettori - 1 Il selettore serve per collegare uno stile agli elementi a cui deve essere applicato Selettore universale: identifica qualunque elemento * { } Selettori di tipo: si applicano a tutti gli elementi di un determinato tipo (ad es. tutti i <p>) tipo_elemento { } Classi: si applicano a tutti gli elementi che presentano lattributo class=nome_class .nome_classe { } Identificatori: si applicano a tutti gli elementi che presentano lattributo id=nome_id #nome_id { }
CSS 13

Combinazioni di selettori I selettori di tipo si possono combinare con quelli di classe e di identificatore: tipo_elemento.nome_classe { } tipo_elemento#nome_id { } In effetti negli esempi della pagina precedente la mancanza di un tipo_elemento prima di . / # sottintendeva la presenza del selettore universale * .nome_classe *.nome_classe #nome_id *.#nome_id

CSS

14

Selettori - 2 Pseudoclassi: si applicano ad un sottoinsieme degli elementi di un tipo identificato da una propriet tipo_elemento:propriet { }

Es. stato di unancora: link e visited a:link { }, a:visited { }


Es. condizione di un elemento: active, focus e hover h1:hover { }, Pseudoelementi: si applicano ad una parte di un elemento tipo_elemento:parte { } Es. solo la prima linea o la prima lettera di un paragrafo: p:first-line { } p:first-letter { }
CSS 15

Selettori - 3 Selettori gerarchici: si applicano a tutti gli elementi di un dato tipo che hanno un determinato legame gerarchico (discendente, figlio, fratello) con elementi di un altro tipo tipo1 tipo2 { } tipo2 discende da tipo1 tipo1>tipo2 { } tipo2 figlio di tipo1 tipo1+tipo2 { } tipo2 fratello di tipo1 Ad esempio: UL>LI { } si applica solo agli elementi contenuti direttamente in liste non ordinate:
<UL> <LI>Riga 1</LI> </UL>
SI

<UL> <OL> <LI>Riga 1</LI> </OL> </UL>


CSS

NO

16

Raggruppamenti Se la stessa dichiarazione si applica a pi tipi di elemento si scrive una regola in forma raggruppata

H1 { font-family: sans-serif } H2 { font-family: sans-serif } H3 { font-family: sans-serif }

equivale a
H1, H2, H3 { font-family: sans-serif }

CSS

17

Propriet
Nelle dichiarazioni possibile far uso di propriet singole o in forma abbreviata (shorthand properties) Le propriet singole permettono di definire un singolo aspetto di stile Le shorthand properties consentono invece di definire un insieme di aspetti, correlati fra di loro usando una sola propriet Per esempio, ogni elemento permette di definire un margine rispetto a quelli adiacenti usando quattro propriet: margin-top, margin-right, margin-bottom, margin-left Utilizziamo le propriet singole applicandole ad un paragrafo: P { margin-top: 10px; margin-right: 8px; margin-bottom: 10px; margin-left: 8px; } Lo stesso risultato si pu ottenere usando la propriet in forma abbreviata margin: P {margin: 10px 8px 10px 8px;}
CSS 18

Valori - 1 Numeri interi e reali: . come separatore decimale Grandezze: usate per lunghezze orizzontali e verticali un numero seguito da una unit di misura Unit di misura relative em: relativa all'altezza del font in uso (es. se il font ha corpo 12pt, 1em varr 12pt, 2em varranno 24pt) px: pixel, sono relativi al dispositivo di output e alle impostazioni del computer dell'utente Unit di misura assolute in: pollici; (1 in =2.54 cm) cm: centimetri mm: millimetri pt: punti tipografici (1/72 di pollice) pc: pica = 12 punti
CSS 19

Valori - 2 Percentuali: percentuale del valore che assume la propriet stessa nell'elemento padre; un numero seguito da % URL assoluti o relativi; si usa la notazione url(percorso) Stringhe: testo delimitato da apici singoli o doppi Colori: possono essere identificati con tre metodi differenti: In forma esadecimale #RRGGBB Tramite la funzione rgb(rosso,verde,blu) Usando una serie di parole chiave che possono indicare colori assoluti o dipendenti dallimpostazione del PC (propriet di sistema)
CSS 20

Colori: parole chiave Colori assoluti:

Colori dipendenti dalle propriet di sistema:

CSS

21

Attribuzione di uno stile ad un elemento


Per poter rappresentare una pagina HTML il browser deve riuscire ad applicare ad ogni elemento uno stile Un elemento privo di stile non pu essere rappresentato: Anche se nella pagina non c nessuna regola CSS (interna o esterna) ogni browser ha un foglio stile di default che contiene stili per ogni tipologia di elemento HTML (tag) Lattribuzione pu essere diretta : Lelemento contiene uno stile inline Esistono una o pi regole il cui selettore rimanda allelemento Oppure pu essere indiretta: Lelemento eredita lo stile dallelemento che lo contiene
CSS 22

Ereditariet E un meccanismo di tipo differenziale simile per certi aspetti allereditariet nei linguaggi ad oggetti Si basa sui blocchi annidati di un documento HTML Uno stile applicato ad un blocco esterno si applica anche ai blocchi in esso contenuti In un blocco interno: Si possono definire stili aggiuntivi Si possono ridefinire stili definiti in un blocco pi esterno ( una sorta di overriding) Lo stesso ragionamento si pu esprimere in termini di DOM: un nodo figlio eredita gli attributi dei nodi che si trovano sul ramo da cui discende
CSS 23

Esempio di ereditariet
Torniamo allesempio visto allinizio Lelemento <p>Usiamo i CSS</p> non ridefinisce il colore del testo e quindi eredita da <body>: viene mostrato in rosso Lelemento <H1>Hello World</H1> ridefinisce lo stile e quindi appare in blu
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"> <HTML> <HEAD> <TITLE>Hello World con CSS</TITLE> <LINK rel="stylesheet" href=hello.css" type="text/css"> </HEAD> <BODY> <H1>Hello World!</H1> <p>Usiamo i CSS</p> </BODY> </HTML> hello.html CSS 24 BODY { color: red } H1 { color: blue } hello.css

Limitazioni allereditariet Non tutte le propriet sono soggette al meccanismo dellereditariet In generale non vengono ereditate quelle che riguardano la formattazione del box model Il box il riquadro che circonda ogni elemento La motivazione abbastanza intuitiva: se ogni elemento interno ereditasse le propriet dellelemento che lo contiene avremmo un effetto grafico tipo scatole cinesi assolutamente indesiderato

CSS

25

Conflitti di stile Nellapplicare gli stili possono nascere conflitti di competenza per diversi motivi: Esiste unintersezione tra regole che utilizzano selettori di tipo diverso, ad esempio ID e Classe come in questo caso:
p#myID {text-color=red} p.myClass {text-color=blue} <p id=myID class=myClass>

Una pagina usa pi fogli di stile oppure combina fogli di stile esterni e regole interne o inline Nello stesso foglio stile ci sono regole con lo stesso selettore e dichiarazioni diverse
banale errore o gestione disordinata dei CSS
CSS 26

Cascade Lo standard CSS definisce un insieme di regole di risoluzione dei conflitti che prende il nome di cascade La logica di risoluzione si basa su tre elementi Origine del foglio stile: Autore: stile definito nella pagina Browser: foglio stile predefinito Utente: in alcuni browser si pu editare lo stile Specificit: esiste una formula che misura il grado di specificit attribuendo, ad es., un punteggio maggiore ad un selettore di ID rispetto ad uno di Classe Dichiarazione !important: possibile aggiungere al valore di una dichiarazione la clausola !important p.myClass {text-color: red !important}
CSS 27

Regole di risoluzione dei conflitti Il CSS assegna un peso a ciascun blocco di regole In caso di conflitto vince quella con peso maggiore Per determinare il peso si applicano in sequenza una serie di regole: Origine: lordine di prevalenza autore, utente,

browser

Specificit del selettore: ha la precedenza il selettore con specificit maggiore (c una formula di calcolo della specificit) Ordine di dichiarazione: se esistono due dichiarazioni con ugual peso, specificit e origine vince quella fornita per ultima. Le dichiarazioni

esterne sono considerate come precedenti a qualsiasi dichiarazione interna


CSS

28

Effetto di !important Leffetto della clausola !important molto semplice Una regola marcata come !important ha sempre precedenza sulle altre, indipendentemente da origine, specificit e ordine di apparizione

CSS

29

Propriet CSS definisce una sessantina di propriet che ricadono grosso modo nei seguenti gruppi: Colori e sfondi Caratteri e testo Box model Liste Display e gestione degli elementi floating Posizionamento Tabelle

CSS

30

Color Per ogni elemento si possono definire almeno tre colori: il colore di primo piano (foreground color) il colore di sfondo (background color) il colore del bordo (border color) La propriet color definisce esclusivamente: il colore di primo piano, ovvero quello del testo il colore del bordo di un elemento quando non viene impostato esplicitamente con border-color La sintassi di color : selettore { color: <valore> } dove il valore definito con le modalit descritte in precedenza (parola chiave, #RRGGBB, ecc.)
CSS 31

Background La definizione dello sfondo pu essere applicata a due soli elementi: body e tabelle Propriet singole e valori: background-color: colore oppure transparent background-image: url di unimmagine o none background-repeat:{repeat|repeat-x|repeaty|no-repeat} background-attachment: {scroll|fixed} background-position: x,y in % o assoluti o parole chiave(top|left|bottom|right} Propriet in forma breve: background
selettore {background: background-color backgroundimage background-repeat background-attachment background-position;}
CSS 32

Gestione del testo Una parte consistente di CSS tratta la gestione del testo Esistono propriet per definire tutti gli elementi classici della tipografia Aspetto dei caratteri: Tipo di carattere (font) Dimensione Peso Varianti di stile (normale, corsivo) Formattazione del testo: Interlinea Allineamento Rientri Decorazioni (sottolineato, barrato, ecc.)
CSS 33

Font Un font una serie completa di caratteri (lettere, cifre, segni di interpunzione) con lo stesso stile Possono essere classificati sulla base di diversi criteri
presenza o assenza di grazie o bastone (inglese sans serif (talvolta solo sans) spaziatura fissa o proporzionale

CSS

34

Con grazie o senza grazie? Le grazie sono piccole decorazioni che sporgono dal corpo della lettera (in rosso nella figura a lato) Nei testi stampati ad alta risoluzione i caratteri con grazie risultano molto pi leggibili (le grazie guidano locchio) Quando per si lavora a bassa risoluzione (i video dei computer sono tutti a bassa risoluzione) i caratteri senza grazie risultano molto pi leggibili Esistono alcuni font senza grazie, per esempio il Verdana, che sono stati pensati per essere molto leggibili anche a video e con caratteri di piccola dimensione
CSS 35

font-family - 1 La propriet che ci permette di definire il tipo di carattere font-family che prende come valore il nome di un font: p {font-family: Verdana} I font pongono un problema di compatibilit piuttosto complesso su piattaforme diverse (Windows, Mac, Linux) sono disponibili caratteri diversi e ogni utente pu avere un proprio set personalizzato Per gestire questa situazione CSS mette a disposizione due meccanismi La definizione di famiglie generiche La possibilit di dichiarare pi font in una propriet
CSS 36

font-family - 2
Le 5 famiglie generiche sono e hanno una corrispondenza specifica che dipende dalla piattaforma (fra parentesi i valori utilizzati da Windows): serif (Times New Roman) sans-serif (Arial) cursive (Comic Sans) fantasy (Allegro BT) monospace (Courier) Una dichiarazione multipla fatta in questo modo: p {font-family: Verdana, Helvetica, sans-serif;} Il browser procede per ordine: cerca prima il font Verdana, altrimenti cerca Helvetica e se manca anche questo ricorre allultimo tipo sans-serif sans-serif una famiglia generica e quindi si trova sempre una corrispondenza Conviene quindi mettere sempre per ultima una famiglia generica
CSS 37

font-size La propriet font-size permette di definire le dimensioni del testo (in tipografia: corpo del carattere) La dimensione pu essere espressa in forma assoluta: con una serie di parole chiave

xx-small, x-small, small, medium, large, x-large, xx-large

con unit di misura assolute


tipicamente pixel (px) e punti (pt)

Oppure in forma relativa: con le parole chiave smaller e larger con lunit em (proporzione rispetto al valore ereditato basato sulla M maiuscola
es. 1.5em = una volta e mezzo

Con lunit ex: proporzione rispetto allaltezza della x minuscola (linea mediana) In percentuale (% rispetto al valore ereditato: 75%)
CSS 38

Il corpo Il corpo del carattere tiene conto di una serie di fattori: Ascendenti (puntino della i o asta della d) Discendenti (gamba della g o della q) Accenti delle maiuscole

CSS

39

font-size e compatibilit Qual il miglior modo di definire il corpo di un carattere? In teoria sullo schermo sarebbe bene usare i pixel, ma IE non consente allutente di ridimensionare un testo espresso in pixel La scelta migliore (consigliata da W3C) quella di utilizzare lem Anche qui per abbiamo un problema di ridimensionamento in IE La soluzione migliore esprimere in % la dimensione del testo nel body (tipicamente 100%) e poi usare gli em per gli elementi interni
body {font-size:100%} h1 {font-size:2.5em} p {font-size:0.875em}
CSS 40

font-weight La propriet font-weight definisce il peso del carattere (la grossezza dei tratti che lo compongono) Lesempio pi noto normale/neretto (impropriamente chiamato grassetto) ma possibile avere una gamma pi ampia di pesi Il peso si pu esprimere in diversi modi: Valori numerici: 100, 200, 800, 900 Parole chiave assolute: normal, bold Parole chiave relative: bolder, lighter normal corrisponde a 400, bold a 700
CSS 41

font-style La propriet font-style permette di definire varianti del testo rispetto al normale (tondo nel linguaggio tipografico) normal: valore di default (tondo) italic: testo in corsivo oblique: testo obliquo, simile a italic In tipografia: il corsivo viene progettato separatamente e pu essere anche molto diverso dal tondo:

Prova Prova
Il testo obliquo invece derivato per deformazione dal tondo
CSS 42

font-variant La propriet font-variant simile a font-style e permette di impostare unaltra variante del testo: il maiuscoletto (small-caps) Ammette due valori: normal e small-caps Come per il corsivo anche per il maiuscoletto in tipografia abbiamo una variante progettata ad-hoc (in pratica per un font si ha la serie dei caratteri maiuscoli, quella dei minuscoli e quella dei maiuscoletti) Nei computer per questa variante non quasi mai disponibile e si usa un carattere maiuscolo di un corpo pi piccolo (falso maiuscoletto)

CSS

43

La propriet font La propriet font una propriet sintetica che consente di definire tutti gli attributi dei caratteri in un colpo solo, nellordine:
font-style font-variant font-weight font-size font-family font di sistema

Es: p {font: italic bold 10px Arial,Serif;} I font di sistema permettono di adattare le pagine allaspetto del sistema operativo, sono 6 valori: caption: font usato per bottoni e combo-box icon: font usato per il testo delle icone menu: carattere usato nei menu delle varie finestre message-box: carattere usato per i popup small-caption: carattere per i controlli pi piccoli status-bar: font usato per la barra di stato
CSS 44

line-height line-height permette di definire laltezza di una riga di testo allinterno di un elemento blocco In pratica consente di definire linterlinea (lo spazio fra le righe) usando i seguenti valori: normal: spaziatura di default stabilita dal browser valore numerico: moltiplicatore applicato al corpo del carattere (es. 1.5= una volta e mezza il corpo) valore con unit di misura: altezza esatta della riga percentuale: altezza riga pari a una % del corpo In tipografia la spaziatura giusta uguale al corpo, un testo con spaziatura maggiore si dice interlineato, con spaziatura minore si dice sterlineato La scelta migliore il p {line-height: 1.5;} valore numerico p {line-height: 15px;}
CSS 45

Allineamento e decorazione del testo Con text-align possiamo definire lallineamento di un paragrafo scegliendo fra 4 opzioni: left: allineamento a sinistra (bandiera a sinistra) right: allineamento a destra (bandiera a destra) center: centratura (epigrafe) justify: giustificazione (blocchetto) text-decoration permette invece di definire alcune decorazioni (sottolineato, barrato ecc.): none: nessuna decorazione underline: sottolineato overline: linea sopra il testo line-through: barrato
CSS 46

text-indent e text-transform text-indent definisce l'indentazione della prima riga in ogni elemento contenente del testo Pu essere espressa in due modi valore numerico con unit di misura valore in percentuale rispetto alla larghezza del blocco di testo (giustezza) text-transform serve a cambiare gli attributi del testo relativamente a maiuscole e minuscole none: nessuna trasformazione capitalize: la prima lettera di ogni parola in maiuscolo, le altre tutte in minuscolo uppercase: tutto il testo maiuscolo lowercase: tutto il testo minuscolo Utile, ad esempio, per dare un aspetto accettabile a pezzi di testo tutti in maiuscolo
CSS 47

Il modello dei riquadri (box model) Per box model si intende l'insieme delle regole per la definizione degli stili per gli elementi blocco Il modello comprende cinque elementi base rappresentati nella figura

CSS

48

Box model - Elementi Area del contenuto: testo, immagine, ecc. di cui possibile definire altezza e larghezza (width e height) Padding (cuscinetto): spazio vuoto tra il contenuto e il bordo dell'elemento Bordo (border): di cui possiamo definire colore, stile e spessore Margine (margin): spazio tra l'elemento e gli altri elementi adiacenti Nel caso di due box allineati in orizzontale, la loro distanza la somma dei due margini Se sono allineati verticalmente, si ha il cosiddetto margin collapsing
la distanza pari al massimo fra il margine inferiore del primo e il margine superiore del secondo
CSS 49

Larghezza e altezza del box La larghezza complessiva data dalla formula: margine sx + bordo sx + padding sx + width + padding dx + bordo dx + margine dx Se non si imposta specificamente il valore width (o si specifica il valore auto) la dimensione del contenuto viene stabilita automaticamente dal browser Per laltezza complessiva vale un ragionamento analogo ma bisogna tener conto del margin collapsing per cui il valore dipende anche da cosa c vicino

CSS

50

Gestione del box model: dimensioni del contenuto height: altezza, si applica a tutti gli elementi blocco escluse le colonne delle tabelle min-height e max-height: permettono di fissare laltezza minima o quella massima anzich un valore esatto (min-height non funziona con IE) width: larghezza min-width e max-width: permettono di fissare la larghezza minima o quella max anzich quella esatta Valori ammessi: auto: dimensione determinata dal contenuto (solo per width e height) valore numerico con unit di misura valore percentuale Le propriet del box model non vengono ereditate
CSS 52

Overflow La propriet overflow permette di definire il comportamento da adottare quando il contenuto (tipicamente testo) deborda dalle dimensioni fissate Valori: visible (default): il contenuto eccedente viene mostrato, i browser si comportano in modi diversi! hidden: il contenuto eccedente non viene mostrato scroll: vengono mostrate barre di scorrimento che consentono di accedere al contenuto eccedente auto: Il browser tratta il contenuto eccedente secondo le sue impostazioni predefinite (di solito barre di scorrimento) In condizioni normali non conviene definire laltezza in modo fisso: si creano effetti imprevedibili
CSS 53

Margini I margini consentono di definire la spaziatura fra elementi Quattro propriet singole: margin-top, marginright, margin-bottom, margin-left Una propriet sintetica: margin(con i valori nellordine esposto sopra) Valori valore numerico con unit di misura valore in percentuale div { auto: distanza margin-top: 8px; automaticamente margin-right: 16px; margin-bottom: 8px; calcolata rispetto margin-left: 24px; } alla larghezza dell'elemento contenitore
CSS 54

Padding Il padding consente di definire lo spazio intorno ad un elemento (internamente al bordo) Quattro propriet singole: padding-top, paddingright, padding-bottom, margin-left Una propriet sintetica: padding(con i valori nellordine esposto sopra) Valori valore numerico con unit di misura valore in percentuale. div { auto: distanza padding-top: 8px; automaticamente padding-right: 16px; padding-bottom: 8px; calcolata rispetto padding-left: 24px; } alla larghezza dell'elemento contenitore
CSS 55

Bordi Le propriet di bordo permettono di definire: stile, colore e spessore di ognuno dei quattro bordi Dodici propriet singole (3 per ogni bordo): border-top-color, border-top-style, border-top-width border-right-color, border-right-style, border-right-width Propriet sintetiche di tre tipi: border-top, border-right, border-bottom, border-left border-color, border-width, border-style border: si pu usare solo quando i 4 bordi hanno le stesse caratteristiche
CSS 56

Valori per i bordi Colore: colore (espresso nei vari modi possibili) Stile: none o hidden: nessun bordo e spessore pari a 0 dotted, dashed: a puntini, a trattini solid: intero double: doppio groove, ridge, inset, outset: effetti tridimensionali Spessore: valore numerico con unit di misura thin: bordo sottile medium: bordo di medio spessore thick: bordo molto spesso

CSS

57

Esempi di stili per i bordi


<style type="text/css"> p.solid { border: solid thin red; padding: 4 px; } p.dotted { border: dotted thin red; padding: 4 px; } p.dashed { border: dashed thin red; padding: 4 px; } p.double { border: double thick red; padding: 4 px; } p.groove { border: groove thick red; padding: 4 px; } p.ridge { border: ridge thick red; padding: 4 px; } p.inset { border: inset thick red; padding: 4 px; } p.outset { border: outset thick red; padding: 4 px; } </style>

CSS

58

Liste - 1 CSS definisce alcune propriet che agiscono sulle liste puntate (<ul>) e numerate (<ol>), o meglio sugli elementi delle liste (<li>) In virt dellereditariet, se applichiamo una propriet alle liste la applichiamo a tutti gli elementi list-style-image: definisce limmagine da utilizzare come punto elenco e ammette i valori: url(<url_immagine>) none list-style-position: indica la posizione del punto e ammette i valori inside: il punto fa parte del testo outside: il punto esterno al testo
CSS 59

Liste - 2 list-style-type: aspetto del punto-elenco I valori possibili sono molti, ne citiamo alcuni: none: nessun punto disc, circle, square: cerchietto pieno, cerchietto vuoto, quadratino decimal: conteggio con cifre arabe 1, 2, 3 decimal-leading-zero: cifre arabe precedute da zero: 01, 02 lower-roman: cifre romane in minuscolo i, ii, iii upper-roman: cifre romane in maiuscolo I, II, III... lower-alpha, lower-latin: lettere minuscole a, b... upper-alpha, upper-latin: lettere maiuscole A, B... lower-greek: lettere minuscole in greco antico Il colore pu essere modificato per tutti i tipi con la propriet color
CSS 60

display HTML classifica gli elementi in tre categorie: blocco, inline e lista Ogni elemento appartiene per default ad una di queste categorie ma la propriet display permette di cambiare questa appartenenza I valori pi comuni sono: inline: l'elemento diventa di tipo inline block: l'elemento diventa di tipo blocco list-item: l'elemento diventa di tipo lista none: l'elemento viene trattato come se non ci fosse (non viene mostrato e non genera alcun box) Attenzione: dire che lelemento trattato come non presente diverso da dire che nascosto. Lo scopriremo meglio andando avanti
CSS 61

float
Con float possibile estrarre un elemento dal normale flusso del documento e spostarlo su uno dei lati (destro o sinistro) del suo elemento contenitore Il contenuto che circonda l'elemento scorre intorno ad esso sul lato opposto rispetto a quello indicato come valore di float. La propriet non ereditata In HTML questa possibilit era riservate alle immagini marcate con lattributo align: CSS lo estende a tutti gli elementi Valori left: l'elemento viene spostato sul lato sinistro del box contenitore, il contenuto scorre a destra right: L'elemento viene spostato sul lato destro, il contenuto scorre a sinistra none: l'elemento mantiene la sua posizione normale (default) Attenzione: le immagini hanno una dimensione intrinseca e quindi non ci sono problemi ma se si usa questa propriet con elementi che non hanno una dimensione naturale (per esempio un paragrafo) bisogna definire anche la propriet width
CSS 62

Esempio: immagine senza float


<html> <head> </head> <body> <p><img border="0" src="images/galotti.gif" width="65" height="57">Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7...<p> </body> </html>

CSS

63

Esempio: immagine con float left e right


<html> <head> <style type="text/css"> img.sx { border-width: none; float: 'left'} img.dx { border-width: none; float: 'right'} </style> </head> <body> <p><img border="0" src="images/galotti.gif" class=sx width="65" height="57">Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7...<p> <p><img border="0" src="images/galotti.gif" class=dx width="65" height="57">Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7... <p> </body> </html>

CSS

64

Esempio con paragrafo floating


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <style type="text/css"> img.sx { border-width: none; float: 'left'} div.dx {background: #F0F0F0; padding: 4px; float: 'right'; width='200px'} </style> </head> <body> <p><img border="0" src="images/galotti.gif" class=sx width="65" height="57"><div class=dx>Come si arriva al museo: prendere l'autobus n. 11 e scendere alla fermata di via Darwin </div>Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7 ai 10 anni. Dai personaggi di Walt Disney ai Gormiti, dalle Winx a Ben 10, sono tanti i cartoni animati che affascinano i ragazzi di tutte le et, ma ancora pi affascinante poter diventare per un giorno un disegnatore, creando i propri personaggi e scoprendo i segreti dellanimazione.</p> </html>

CSS

65

Esempio: paragrafo giustificato con capoverso


<html> <head> <style type="text/css"> p { text-align: justify; } p:first-letter { font-family: 'Times New Roman'; font-size=xx-large; float: left; color: red} </style> </head> <body> <p>Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7 ai 10 anni. Dai personaggi di Walt Disney ai Gormiti, dalle Winx a Ben 10, sono tanti i cartoni animati che affascinano i ragazzi di tutte le et, ma ancora pi affascinante poter diventare per un giorno un disegnatore, creando i propri personaggi e scoprendo i segreti dellanimazione.</p> </html>

CSS

66

clear La propriet clear serve a impedire che al fianco di un elemento compaiano altri elementi marcati come float Il float toglie un elemento dal flusso normale del documento e pu capitare che esso venga a trovarsi a fianco di elementi successivi a quello che contiene lelemento floating Si applica solo agli elementi blocco e non ereditata Valori: none: gli elementi float possono stare sia a destra e sinistra dell'elemento left: impedisce il posizionamento a sinistra right: impedisce il posizionamento a destra both: impedisce il posizionamento su entrambi i lati
CSS 67

Esempio senza clear


<html> <head> <style type="text/css"> img.sx { border-width: none; float: left; } </style> </head> <body> <p><img border="0" src="images/galotti.gif" class= sx width="65" height="57">Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7 ai 10 anni.</p> <p>Dai personaggi di Walt Disney ai Gormiti, dalle Winx a Ben 10, sono tanti i cartoni animati che affascinano i ragazzi di tutte le et, ma ancora pi affascinante poter diventare per un giorno un disegnatore, creando i propri personaggi e scoprendo i segreti dellanimazione. <p> </html>

CSS

68

Esempio con clear: left


<html> <head> <style type="text/css"> img.sx { border-width: none; float: left; } p.cl { clear: left } </style> </head> <body> <p><img border="0" src="images/galotti.gif" class=sx width="65" height="57">Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7 ai 10 anni.</p> <p class='cl'>Dai personaggi di Walt Disney ai Gormiti, dalle Winx a Ben 10, sono tanti i cartoni animati che affascinano i ragazzi di tutte le et, ma ancora pi affascinante poter diventare per un giorno un disegnatore, creando i propri personaggi e scoprendo i segreti dellanimazione. <p> </html>

CSS

69

Posizionamento: position position la propriet fondamentale per la gestione della posizione degli elementi, di cui determina la modalit di presentazione sulla pagina Non ereditata e ammette i seguenti valori: static: (default) posizionamento naturale nel flusso absolute: il box dell'elemento viene rimosso dal flusso ed posizionato rispetto al box contenitore del primo elemento antenato non static (al limite <html>) relative: l'elemento viene posizionato relativamente al box che l'elemento avrebbe occupato nel normale flusso del documento fixed: come absolute ma riferito al viewport (area visibile del doc.) e quindi non scrolla con la pagina
CSS 70

Altre propriet di posizionamento left,top,right,bottom: coordinate del posizionamento (assoluto o relativo) visibility determina la visibilit e ammette 2 valori: visible: lelemento visibile hidden: lelemento invisibile ma il suo posto rimane visibile, anche se appare vuoto z-index: CSS gestisce gli elementi come se fossero fogli di carta e questa propriet permette di stabilire quale sta sopra e quale sta sotto Valori ammessi:
auto: lascia al browser la decisione di che ordine attribuire agli elementi valore numerico: pi alto e pi lelemento in cima al mucchio di fogli

CSS

71

Esempio: paragrafo rientrato


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <style type="text/css"> p { text-align: justify; width: 350 } p.rientro { position: relative; left: 50; width:300 } </style> </head> <body> <p>Domenica 27 dicembre 2009 alle ore 15.30, il Museo del Patrimonio Industriale propone su prenotazione (massimo 25 partecipanti) il laboratorio Making toons dedicato ai bambini dai 7 ai 10 anni. </p> <p class='rientro'>Tutto questo sar possibile al Museo del Patrimonio industriale con Making Toons, un laboratorio dedicato ai ragazzi per imparare a fare semplici cartoni animati, approfondendone la scienza e la storia.</p> </body> </html>

CSS

72

Tabelle Alcune propriet permettono di gestire le tabelle table-layout: non ereditata e ammette due valori: auto: layout trattato automaticamente dal browser fixed: layout controllato dal CSS border-collapse: definisce il trattamento dei bordi interni e degli spazi fra celle e ammette due valori: collapse: se viene impostato un bordo, le celle della tabella lo condividono separate: se viene impostato un bordo, ogni cella ha il suo, separato dalle altre Se di usa separate lo spazio tra le celle e tra i bordi si imposta con la propriet border-spacing, che ammette come valore un numero con unit di misura
CSS 73

Riferimenti Specifiche ufficiali W3C: http://www.w3.org/TR/CSS2/ Ottimo riferimento, con possibilit di fare esercizi: http://www.w3schools.com/css/default.asp Un sito di CSS estremo che permette di cambiare radicalmente laspetto delle pagine applicando diversi stili: http://www.csszengarden.com/tr/italiano/

CSS

74

Tecnologie Web T Introduzione a XML

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 2.01.XML.pdf Versione elettronica: 2.01.XML-2p.pdf
XML 1

Che cos XML? XML: Extensible Markup Language: un linguaggio che consente la rappresentazione di documenti e dati strutturati su supporto digitale uno strumento potente e versatile per la creazione, memorizzazione e distribuzione di documenti digitali la sua sintassi rigorosa e al contempo flessibile consente di utilizzarlo nella rappresentazione di dati strutturati anche molto complessi

XML

Le origini XML stato sviluppato dal World Wide Web Consortium Nel 1996 stato formato un gruppo di lavoro con lincarico di definire un linguaggio a markup estensibile di uso generale Le specifiche sono state rilasciate come W3C Recommendation nel 1998 e aggiornate nel 2004 XML deriva da SGML, un linguaggio di mark-up dichiarativo sviluppato dalla International Standardization Organization (ISO), e pubblicato ufficialmente nel 1986 con la sigla ISO 8879 XML nasce come un sottoinsieme semplificato di SGML orientato all utilizzo su World Wide Web Ha assunto ormai un ruolo autonomo e una diffusione ben maggiore del suo progenitore
XML 3

SGML SGML (Standard Generalized Markup Language ) il padre sia di HTML che di XML Pregi Potente e flessibile (standard ISO, espandibile, fortemente strutturato, non proprietario, indipendente dalla piattaforma) Difetti Struttura pesante Sono obbligatori un DTD e uno StyleSheet Obbligatoria la validazione del documento Le istanze SGML sono troppo pesanti e non robuste per applicazioni WEB

XML

XML come linguaggio di markup Come SGML XML un linguaggio a marcatori (markup) Un linguaggio di markup composto da istruzioni, definite tag o marcatori, che descrivono la struttura e la forma di un documento Ogni marcatore (o coppia di marcatori) identifica un elemento o componente del documento I marcatori vengono inseriti all'interno del documento Sia il testo, sia i marcatori sono memorizzati in formato ASCII XML usa la codifica dei caratteri Unicode Un documento XML leggibile da un utente umano senza la mediazione di software specifico

XML

Esempio Un documento XML leggibile ,chiaro, intuibile: <documento> <corpo> Testo del mio primo documento </corpo > Marcatore di fine </documento> Attenzione: XML case sensitive nei nomi dei tag distingue fra maiuscole e minuscole
Marcatore di inizio

XML

Altro esempio <prenotazione> <idVolo>PA321</idVolo> <idCliente>PP2305</idCliente> <data>22-10-2001</data> <prezzo valuta=Euro>245</prezzo> </prenotazione>

XML

XML: caratteristiche XML indipendente dal tipo di piattaforma hardware e software su cui viene utilizzato Permette la rappresentazione di qualsiasi tipo di documento (e di struttura) indipendentemente dalle finalit applicative E indipendente dai dispositivi di archiviazione e visualizzazione pu essere archiviato su qualsiasi tipo di supporto digitale pu essere visualizzato su qualsiasi dispositivo di output pu essere facilmente trasmesso via Internet tramite i protocolli HTTP, SMTP, FTP

XML

XML: caratteristiche XML uno standard di pubblico dominio ogni software conforme a XML in grado di gestire dati in formato XML sono disponibili numerose applicazioni e librerie open source per la manipolazione di dati in formato XML basate su diversi linguaggi di programmazione (Java, C, C#, Python, Perl, PHP) una applicazione in grado di elaborare dati in formato XML viene definita elaboratore XML

XML

XML come metalinguaggio XML un metalinguaggio Definisce un insieme regole (meta)sintattiche, attraverso le quali possibile descrivere formalmente un linguaggio di markup, detto applicazione XML Ogni applicazione XML: eredita un insieme di caratteristiche sintattiche comuni definisce una sua sintassi formale dotata di una semantica

XML

10

Metalinguaggio e linguaggi
XML
Metalinguaggio

Metasintassi

SVG
(Scalable Vector Graphic)

XHTML
(eXtensible HyperText Markup Language)

MathML
(Mathematical Markup Language)

Linguaggi

Sintassi

Documenti

XML

11

Linguaggi e grammatiche

Per definire un linguaggio necessario un meccanismo che vincoli l'utilizzo dei tag all'interno dei documenti Si deve poter stabilire quali tag possono essere utilizzati e come, secondo una precisa struttura logica Abbiamo cio bisogno di definire una grammatica Una grammatica un insieme di regole che indica quali vocaboli (elementi) possono essere utilizzati e con che struttura possibile comporre frasi (documenti) Se un documento XML rispetta le regole definite da una grammatica detto valido per un particolare linguaggio di markup

XML

12

Documenti ben formati e documenti validi In XML ci sono regole sintattiche (o meglio metasintattiche) come dobbiamo scrivere le informazioni allinterno dei documenti Ci possono essere (ma non obbligatorio) regole semantiche cosa possiamo scrivere in un documento XML Un documento XML che rispetta le regole sintattiche si dice ben formato (well-formed) Un documento XML che rispetta le regole sintattiche e le regole semantiche si dice valido Un documento ben formato pu non essere valido rispetto ad una grammatica, mentre un documento valido necessariamente ben formato
XML 13

Struttura logica di un documento XML Un documento XML strutturato in modo gerarchico composto da elementi Un elemento rappresenta un componente logico del documento pu contenere un frammento di testo oppure altri elementi (sotto-elementi) Ad un elemento possono essere associate informazioni descrittive chiamate attributi Gli elementi sono organizzati ad albero con radice root Ogni documento XML pu essere rappresentato come un albero document-tree
XML 14

Struttura fisica di un documento XML Un documento XML un semplice file di testo (.xml) La struttura del documento viene rappresentata mediante marcatori (markup) Gli elementi sono rappresentati mediante tag coppie di marcatori che racchiudono il contenuto dellelemento I sottoelementi sono tag contenuti allinterno di un altro tag Gli attributi vengono rappresentati sotto forma di coppie nome-valore allinterno dei tag La radice un tag che racchiude tutto il resto del documento ( e quindi tutti gli altri tag) Un documento pu inoltre contenere spazi bianchi, a capo e commenti
XML 15

Aspetti di sintassi generale Un documento XML una stringa di caratteri ASCII o Unicode Nomi di elementi, attributi e entit sono case-sensitive Il mark-up separato dal contenuto testuale mediante caratteri speciali: < > & (parentesi angolari e ampersand) I caratteri speciali non possono comparire come contenuto testuale e devono essere eventualmente sostituiti mediante i riferimenti a entit &lt; (<), &gt; (>), &amp; (&)

XML

16

Struttura logica e fisica Esiste una corrispondenza diretta fra struttura fisica e struttura logica (tree) <root> <child> <subchild> </subchild> </child> <child> </child> </root>

root

child

child

subchild

XML

17

Struttura formale di un documento XML Un documento costituito da due parti Prologo: contiene una dichiarazione XML ed il riferimento (opzionale) ad altri documenti che ne definiscono la struttura o direttive di eleborazione Corpo: il documento XML vero e proprio
<?xml version=1.0 encoding=UTF-8?> <?xml-stylesheet type=text/css href=gree.css?> <root> <!-- Questo un commento --> <child> </child> <child> </child> </root>
XML

Prologo

Corpo

18

Prologo: XML Declaration Ogni documento XML inizia con un prologo che contiene una XML declaration Forme di XML declaration: <?xml version="1.0"?> <?xml version="1.0 encoding=UTF-8?> Contiene informazioni su: Versione: per ora solo 1.0 Set di caratteri (opzionale): Esempi di set di caratteri: ASCII: set di caratteri a 7 bit UTF-8: unicode a 8 bit UTF-16: unicode a 16 bit ISO-8859-1: set Latin 1 con lettere accentate
XML 19

Prologo: riferimenti a documenti esterni Il prologo pu contenere riferimenti a documenti esterni utili per il trattamento del documento Processing instructions: istruzioni di elaborazione Esempio 1: rappresentazione mediante CSS:
<?xml-stylesheet type=text/css href=gree.css?>

Esempio 2: trasformazione XSLT (EXtensible Stylesheet


Language Transformations)

<?xml-stylesheet type="text/xsl href=go.xslt"?>

Doctype declaration: grammatica da utilizzare per la validazione del documento


grammatica contenuta in un file locale
<!DOCTYPE book SYSTEM book.dtd>

grammatica accessibile ad un URL pubblico


<!DOCTYPE book PUBLIC http://www.books.org/book.dtd>
XML 20

Commenti I commenti possono apparire ovunque in un documento XML (sia nel prologo che nel corpo) I commenti sono utili per spiegare la struttura del documento XML commentare parti del documento durante le fasi di sviluppo e di test del nostro software I commenti non vengono mostrati dai browser ma sono visibili da parte di chi guarda il codice sorgente del documento XML <!-- Questo un commento -->

XML

21

Elementi e Tag Un elemento un frammento di testo racchiuso fra uno start tag e un end tag Uno start tag costituito da un nome pi eventuali attributi (v. slide succ.) racchiusi dai simboli <, > <TagName attribute-list> Un end tag costituito da un nome (lo stesso dello start tag) racchiuso da </,>: </TagName> Un tag vuoto rappresentabile come: <TagName attribute-list /> Equivale a <TagName attribute-list></TagName> Attenzione: I tag non possono avere nomi che iniziano per XML, XMl, Xml, xml
XML 22

Attributi A ogni elemento possono essere associati uno o pi attributi che ne specificano ulteriori caratteristiche o propriet non strutturali Ad esempio: la lingua del suo contenuto testuale un identificatore univoco un numero di ordine Gli attributi XML sono caratterizzati da un nome che li identifica un valore

XML

23

Esempio di documento con attributi


<?xml version="1.0" ?> <articolo titolo="Titolo dellarticolo"> <paragrafo titolo="Titolo del primo paragrafo"> <testo>Blocco di testo del primo paragrafo</testo> <immagine file="immagine1.jpg"></immagine> </paragrafo> <paragrafo titolo="Titolo del secondo paragrafo"> <testo>Blocco di testo del secondo paragrafo</testo> <codice>Esempio di codice</codice> <testo>Altro blocco di testo</testo> </paragrafo> <paragrafo tipo="bibliografia"> <testo>Riferimento ad un articolo</testo> </paragrafo> </articolo>
XML 24

Elementi o attributi? Qualche regola per decidere: Un elemento estendibile in termini di contenuto (con elementi figli) e di attributi Un attributo non estendibile: pu solo modellare una propriet di un elemento in termini di valore Un elemento unentit a se stante (un oggetto?) Un attributo strettamente legato ad un elemento Un attributo pu solamente contenere un valore atomico In pratica non c una regola valida in assoluto La scelta dipende da diversi fattori: leggibilit, semantica, tipo di applicazione, efficienza

XML

25

Elementi o attributi: esempio

Vediamo tre varianti dello stesso pezzo di documento che usano in modo diverso elementi e attributi
<libro isbn=1324AX titolo=On the road /> <libro isbn=1324AX> <titolo>On the road</titolo> </libro> <libro> <isbn>1324AX</isbn> <titolo>On the road</titolo> </libro>

XML

26

Riferimenti ad entit I riferimenti ad entit servono per rappresentare caratteri riservati (per esempio, < > o &)
Nome entit lt gt amp apos quot Riferimento &lt; &gt; &amp; &apos; &quot; Carattere < > &

Oppure per rappresentare caratteri UNICODE mediante la notazione &#XXXX: &#0189; &#0232:
XML 27

Sezione CDATA Per poter inserire brani di testo (porzioni di codice XML o XHTML) senza preoccuparsi di sostituire i caratteri speciali si possono utilizzare le sezioni CDATA (Character Data) Il testo contenuto in una sezione CDATA NON viene analizzato dal parser Una sezione CDATA pu contenere caratteri normalmente proibiti Si utilizza la seguente sintassi: <![CDATA[ Contenuto della sezione ]]> Lunica sequenza non ammessa ]] (chiusura ) Esempi: <El> <![CDATA[ <<!] && ]]> </El>
<E> <![CDATA[<Elemento/><A>Ciao</A>]]> </E>
XML 28

Conflitti sui nomi Capita abbastanza comunemente, soprattutto in documenti complessi, di dare nomi uguali ed elementi (o attributi) con significati diversi Ad esempio: <libro> <autore> <titolo>Sir</titolo> <nome>William Shakespeare</nome> </autore> <titolo>Romeo and Juliet</titolo> </libro>

XML

29

Namespace Per risolvere il problema si ricorre al concetto di spazio dei nomi (namespace) Si usano prefissi che identificano il vocabolario di appartenenza di elementi ed attributi Ogni prefisso associato ad un URI (Uniform Resource Identifier) ed un alias per lURI stesso LURI in questione normalmente un URL: si ha quindi la certezza di univocit E un meccanismo simile ai nomi lunghi delle classi in Java (i package definiscono un sistema di namespace): Nome breve: JButton Nome lungo: javax.swing.JButton
XML 30

Esempio di uso di namepace Riprendiamo lesempio del libro usando i namespace:


Prefisso

Dichiarazione del prefisso e associazione allURI

URI

<lb:libro xmlns:lb=mysite.com/libri> <au:autore xmlns:au=mysite.com/autori> <au:titolo>Sir</au:titolo> <au:nome>William Shakespeare</au:nome> </au:autore> <lb:titolo>Romeo and Juliet</lb:titolo> </lb:libro>

XML

31

Definizione di namespace Per definire un namespace si usa la seguente sintassi: xmlns:NamespacePrefix=NamespaceURI La definizione un attributo di un elemento e pu essere messa ovunque allinterno del documento Lo scope del namespace lelemento allinterno del quale stato dichiarato Si estende a tutti i sottoelementi Se si dichiara un namespace nellelemento radice, il suo scope lintero documento LURI pu essere qualsiasi (il parser non ne controlla lunivocit) ma dovrebbe essere scelto in modo da essere effettivamente univoco

XML

32

Esempio
<DC:Docenti xmlns:DC="www.unibo.it/docenti"> <DC:Docente DC:codAteneo="112233"> <DC:Nome>Ilaria</DC:Nome> <DC:Cognome>Bartolini</DC:Cognome> <CR:Corso id="123 xmlns:CR=www.unibo.it/corsi"> <CR:Nome>Tecnologie Web T</CR:Nome> </CR:Corso> <CO:Corso id="124" xmlns:CO="www.unibo.it/corsi"> <CO:Nome>Sistemi Informativi L-A</CO:Nome> </CO:Corso> </DC:Docente> 1. CR e CO sono prefissi collegati allo stesso </DC:Docenti> namespace
2. Nel secondo elemento Corso necessario ripetere la dichiarazione di namespace poich ricade fuori dallo scope della prima dichiarazione

Per evitare la seconda dichiarazione basta dichiarare il namespace in un elemento pi in alto nella gerarchia
XML 33

Namespace di default E possibile definire un namespace di default associato al prefisso nullo Tutti gli elementi non qualificati da prefisso appartengono al namespace di default Attenzione: riduce la leggibilit di un documento
<Docenti xmlns="www.unibo.it/docenti"> <Docente codAteneo="112233"> <Nome>Ilaria</Nome> <Cognome>Bartolini</Cognome> <CR:Corso id="123 xmlns:CR=www.unibo.it/corsi"> <CR:Nome>Tecnologie Web T</CR:Nome> </CR:Corso> </Docente> </Docenti>

XML

34

Ridefinizione di prefissi Un prefisso di namespace (anche quello vuoto di default) pu essere associato a diversi namespace allinterno di uno stesso documento E per preferibile evitare le ridefinizioni: riducono la leggibilit del documento
<PR:Docenti xmlns:PR="www.unibo.it/docenti"> <PR:Docente codAteneo="112233"> <PR:Nome>Ilaria</PR:Nome> <PR:Cognome>Bartolini</PR:Cognome> <PR:Corso id="123 xmlns:PR=www.unibo.it/corsi"> <PR:Nome>Tecnologie Web T</PR:Nome> </PR:Corso> </PR:Docente> </PR:Docenti>

XML

35

Vincoli di buona formazione Affinch un documento XML sia ben formato: Deve contenere una dichiarazione corretta Il corpo deve avere un unico elemento radice Ogni elemento deve avere un tag di apertura e uno di chiusura
se lelemento vuoto si pu utilizzare la forma abbreviata (<nometag/>)

Gli elementi devono essere opportunamente nidificati, cio i tag di chiusura devono seguire lordine inverso dei rispettivi tag di apertura I nomi dei tag di apertura e chiusura devono coincidere
anche in termini di maiuscole e minuscole

I valori degli attributi devono sempre essere racchiusi tra singoli o doppi apici
XML 36

Documenti ben formati e documenti validi Come gi detto, in XML ci sono regole sintattiche come dobbiamo scrivere le informazioni allinterno dei documenti Ci possono essere regole semantiche (definite da grammatiche) cosa possiamo scrivere in un documento XML Un documento XML che rispetta le regole sintattiche si dice ben formato Un documento XML che rispetta le regole sintattiche e le regole semantiche si dice valido

XML

37

Validazione: Document Type Definition Un primo strumento per definire grammatiche costituito dalla Document Type Definition Un DTD costituito da un elenco di dichiarazioni (markup declaration) che descrivono la struttura del documento Le dichiarazioni di un DTD definiscono: gli elementi strutturali (element) di un documento mediante un identificatore generico il modello di contenuto di ogni elemento (content model), ovvero gli elementi che contiene e le loro relazioni (un elemento pu essere vuoto) la lista degli attributi associati a ciascun elemento e il loro tipo
XML 38

Limiti e problemi dei DTD I DTD sono difficili da comprendere Sono scritti in un linguaggio diverso da quello usato per descrivere le informazioni Soffrono di alcune limitazioni: Non permettono di definire il tipo dei dati Non consentono di specificare il numero minimo o massimo di occorrenze di un tag in un documento

XML

39

Validazione: XML Schema (XSD) Dato che XML pu descrivere tutto perch non usarlo per descrivere anche lo schema di un documento? E stato quindi definito lo standard XSD (XML Schema Definition) XSD nasce dallidea di utilizzare XML per descrivere la struttura di XML: Descrive le regole di validazione di un documento Permette di tipizzare i dati (intero, stringa, ora, data, ecc.) E estensibile ed aperto alla possibilit di supportare modifiche

XML

40

Elementi di XSD Un documento XML Schema (XSD) comprende: Namespace di riferimento: http://www.w3.org/2001/XMLSchema

Dichiarazione di: Elementi Attributi Definizione di tipi Semplici Complessi Estesi

XML

41

HTML e XML: XHTML HTML una grammatica XML? Quasi, per sono ammessi pasticci che XML non prevede: Tag non chiusi: <br> (in XML <br></br> o <br/>) Tag incrociati <b><u>Ciao</b><u> HTML una grammatica SGML ma non XML E stata definita una versione di HTML corretto in modo da rispettare la sintassi XML: XHTML Un documento XHTML un documento XML ben formato che pu essere validato su uno schema definito dal W3C Quindi XHTML una grammatica XML

XML

42

DOM Il DOM (Document Object Model) un modello ad oggetti definito dal W3C per navigare e creare contenuti XML Rappresenta il contenuto di un documento XML tramite un albero in memoria Permette di navigare lalbero ragionando per gradi di parentela (nodi figli, nodo padre, ecc.) Esistono 3 interfacce base Node ( praticamente la base di tutto) NodeList (collezione di nodi) NamedNodeMap (collezione di attributi) Un parser DOM unapplicazione in grado di leggere un file XML e creare un DOM e viceversa
XML 43

Presentazione di documenti XML Un documento XML definisce il contenuto informativo e non come deve essere rappresentato tale contenuto La presentazione di un documento XML viene controllata da uno o pi fogli di stile I linguaggi di stile utilizzabili con XML sono Extensible Stylesheet Language (XSL) Cascading Style Sheet (CSS) (usati con XHTML)

XML

44

XSL XSL = eXtensible Stylesheet Language Si occupa della trasformazione e della impaginazione di contenuti XML Si basa principalmente su: XSLT (XSL for Transformations): gestisce la trasformazioni e non la impaginazione dei contenuti XSL-FO (XSL Formatting Objects): orientato alla visualizzazione ed impaginazione dei contenuti (es. in PDF) XPath (XML Path Language): serve per costruire percorsi di ricerca di informazioni allinterno di documenti XML

XML

45

XSLT XSLT un linguaggio di programmazione a tutti gli effetti Permette di gestire variabili, parametri, cicli, condizioni, funzioni una grammatica XML Lavora sulla struttura del documento Costruisce lalbero del documento Lo attraversa cercando le informazioni indicate Produce un nuovo documento - di solito XHTML applicando le regole definite

XML

46

My CD Collection http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

XML

47

Un esempio tipico completo

Documento XML
Documento XSLT

Processore XSLT Foglio stile CSS

Documento XHTML

Web Server

Browser Pagina Web visualizzata


XML 48

Riferimenti XML Specification : http://www.w3.org/XML/ XSL Specification : http://www.w3.org/Style/XSL/ Guida in inglese (molto completa e ben fatta) http://www.w3schools.com/xml/default.asp

XML

49

Tecnologie Web T DTD Document Type Definition

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 2.02.XML-DTD.pdf Versione elettronica: 2.02.XML-DTD-2p.pdf
DTD 1

Che cos DTD? DTD: Document Type Definition E un linguaggio per definire la grammatica che descrive la composizione degli elementi costituenti una certa classe di documenti XML Fornisce uno strumento per la validazione dei documenti XML Non un linguaggio XML (non rispetta la sintassi XML)

DTD

Perch usare un linguaggio di schema? XML ha supporti standard per la validazione dei documenti Se volessimo farne a meno ci troveremmo nella situazione per cui almeno il 60% del codice che scriviamo sarebbe orientato alla validazione di documenti. Il problema sarebbe complesso Usando XML ed i linguaggi di schema possiamo: aumentare la produttivit sviluppare sistemi aperti ed interoperabili Inoltre uno schema definisce un contratto fra chi produce il dato e chi lo utilizza In qualunque momento possibile applicare lo schema per verificare il rispetto del contratto

DTD

Dichiarazione del DTD Per applicare un DTD ad un documento XML nel suo prologo dobbiamo inserire una dichiarazione con questa sintassi: <!DOCTYPE root-element SYSTEM "filename"> Dove: root-element il nome dellelemento radice SYSTEM definisce documenti di utilizzo locale filename il file che contiene il DTD In alternativa a SYSTEM si pu usare la parola chiave PUBLIC che serve per definire documenti di utilizzo pubblico La dichiarazione va posta sotto lXML Declaration: <?xml version="1.0"?> <!DOCTYPE message SYSTEM message.dtd>
DTD 4

Esempio: il file XML


<?xml version="1.0"?> <!DOCTYPE message SYSTEM message.dtd> <message> <to>Bob</to> <from>Janet</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </message>

Cosa deve specificare il DTD? Lelemento message composto da: Un elemento to contenente testo Un elemento from contenente testo Un elemento heading contenente testo Un elemento body contenente testo
DTD 5

Esempio: il DTD
<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT message (to,from,heading,body)> to (#PCDATA)> from (#PCDATA)> heading (#PCDATA)> body (#PCDATA)>

Lelemento message vincolato a contenere gli elementi specificati nellordine di apparizione PCDATA (Parsed Character Data) rappresenta lunico tipo di dato possibile, ovvero di tipo carattere immune al parsing Non possibile vincolare il testo in alcun modo!!!

DTD

Struttura di un DTD Un DTD costituito da un elenco di dichiarazioni (markup declarations) che descrivono la struttura del documento Le dichiarazioni di un DTD definiscono: gli elementi (element) di un documento XML il modello di contenuto di ogni elemento (content model), ovvero gli elementi che contiene e le loro relazioni (un elemento pu essere vuoto) la lista degli attributi associati a ciascun elemento, il loro tipo e il loro valore

DTD

Elementi Per dichiarare un elemento si usa la sintassi: <!ELEMENT element-name content-model> Il contenuto (content-model) pu essere di 4 tipi: EMPTY: parola chiave che indica lelemento vuoto ANY: indica che si pu inserire testo o elementi qualsiasi (purch dichiarati nel DTD) Elenco di elementi figli specifici con ordine determinato (content-model Children) Testo pi elenco di elementi figli senza ordine specifico (Content model Mixed) I due ultimi tipi non sono indicati da una parola chiave ma attraverso la notazione usata nella definizione Tutte le dichiarazioni sono globali Un elemento pu essere indicato una sola volta
DTD 8

Esempi: EMPTY e ANY


<!ELEMENT ElementoVuoto EMPTY> <ElementoVuoto />

<!ELEMENT Elemento ANY> <!ELEMENT Child EMPTY> <!ELEMENT Child1 EMPTY>

<Elemento> <Child/> <Child1/> qualcosa <Child/> </Elemento>


DTD 9

Content model - Children


Si pu specificare una sequenza di elementi figli che devono comparire nellordine specificato: (E1,E2,,En) Oppure una scelta: lista di elementi figli che possono comparire in alternativa: (E1|E2||En) La differenza data dal separatore: virgola per le sequenze, | per le scelte E anche possibile stabilire loccorrenza di ogni elemento tramite gli operatori ?, +, *: ? = zero o 1 + = 1 o pi * = zero o pi possibile innestare liste e operatori: (A?,(B|(C,D)*)) #PCDATA indica che il contenuto dellelemento solo testo: <!ELEMENT Elemento (#PCDATA)>

DTD

10

Esempio
<!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT <!ELEMENT ADDRESSBOOK (PERSON)*> PERSON (LASTNAME, FIRSTNAME, COMPANY, EMAIL)> LASTNAME (#PCDATA)> FIRSTNAME (#PCDATA)> COMPANY (#PCDATA)> EMAIL (#PCDATA)>

DTD

11

Content mode - Mixed Consente di specificare testo senza markup pi elenco di elementi figli senza ordine specifico Il content-model Mixed non specificato tramite una parola chiave ma, come Children, tramite una notazione particolare: (#PCDATA|E1|E2||En)* #PCDATA deve essere sempre il primo elemento della lista di scelta La lista di scelta deve poter comparire zero o pi volte (si usa quindi il modificatore *)
Esempio: la dichiarazione seguente specifica che un elemento paragraph (paragrafo) puo contenere, oltre a testo, qualsiasi numero di elementi name, profession, footnote, emphasize e date (#PCDATA|name|profession|footnote|emphasize|date)*
DTD 12

Attributi Per definire una lista di possibili attributi per un elemento si usa la sintassi: <!ATTLIST ElementName AttrName1 AttrType1 Value1 AttrName2 AttrType2 Value2 >

Dove il significato dei vari termini il seguente: ElementName: nome dellelemento AttrNamen: nome dellattributo n-esimo AttrTypen: tipo dellattributo n-esimo Valuen: valore di default dellattributo n-esimo o modificatore di presenza
13

DTD

Tipi e valori degli attributi


Tipo CDATA Significato
Testo Valore scelto da una lista di enumerazione Identificatore univoco a livello di documento

(en1|en2||enn)
ID
altre possibilit (rif. specifiche)

Valore VALUE #REQUIRED #IMPLIED #FIXED VALUE

Significato
Lattributo ha valore di default pari a VALUE
Lattributo deve essere presente Lattributo opzionale Lattributo deve avere un valore fisso pari a VALUE
DTD 14

Attributi: tipi CDATA ed enumerati I valori ammessi per il tipo sono: CDATA: valore di tipo testo (en1|en2||enn): valore scelto da una lista DTD: <!ELEMENT payment EMPTY> <!ATTLIST payment mode (check|cash) cash> XML: <payment mode=check /> <payment mode=cash /> <payment mode=creditcard /> Ok Ok Errore!!

DTD

15

Attributi: tipo ID ID: valore di tipo identificatore il valore dellattributo deve essere univoco a livello di documento ID viene normalmente utilizzato con #REQUIRED DTD
<!ELEMENT orders (order+)> <!ELEMENT order EMPTY> <!ATTLIST order code ID #REQUIRED>

XML
<orders> <order code=a101/> <order code=a102/> </orders>
DTD

Il valore di un attributo di tipo ID deve essere un nome XML valido non pu iniziare con un numero

16

Attributi: valore di default DTD: <!ELEMENT square EMPTY> <!ATTLIST square width CDATA "0"> XML: <square width="100" /> Se allattributo non viene assegnato un valore esplicito, il suo valore di default 0 Lautore del documento non obbligato a specificare un valore per un attributo cui stato associato un valore di default: Quindi se scriviamo: <square /> Il valore di width non nullo, ma 0
DTD 17

Attributi: valore #implied DTD: <!ELEMENT contact EMPTY> <!ATTLIST contact fax CDATA #IMPLIED> XML: <contact fax="555-667788" /> Si utilizza il valore #implied quando un attributo non obbligatorio non possibile stabilire un valore di default Se scriviamo <contact /> Il valore dellattributo fax nullo

DTD

18

Attributi: valore #required DTD: <!ELEMENT person EMPTY> <!ATTLIST person number CDATA #REQUIRED> XML: <person number="5677" /> Si utilizza il valore #required quando non possibile specificare un valore di default occorre forzare la presenza di tale attributo Quindi se scriviamo: <person /> Otteniamo un errore!

DTD

19

Attributi: valore #fixed DTD:


<ELEMENT sender EMPTY> <!ATTLIST sender person CDATA #FIXED Ilaria>

XML:
<sender person=Ilaria />

Utilizzare un attributo di tipo #fixed quando occorre che tale attributo abbia un valore prefissato Il parser riporta un errore nel caso in cui venga incontrato un valore diverso da quello previsto Se lattributo non presente, ne viene inserito uno col valore fixed Quindi se scriviamo: <sender person=Mario /> errore! <sender /> ok, e lattributo person vale Ilaria
DTD 20

Esempio: catalogo di film Si modelli un documento XML di catalogazione Film e relativo DTD di validazione in cui: Un Catalogo pu contenere zero o pi Film Un Film descritto da un Titolo, almeno un Regista, zero o pi Attore ed eventualmente un Genere Un Film dotato di propriet quali un codice identificativo univoco (cod), unindicazione di originalit del supporto (originale s no) in cui si assume di default lacquisto legale, unindicazione del tipo di formato (obbligatoria) che pu essere VHS, DVD, DIVX, un voto (opzionale)

DTD

21

Catalogo film - 1 Un Catalogo pu contenere zero o pi Film <!ELEMENT Catalogo (Film*)> Un Film descritto da un Titolo, almeno un Regista, zero o pi Attore ed eventualmente un Genere <!ELEMENT Film (Titolo,Regista+,Attore*,Genere?)> <!ELEMENT Titolo (#PCDATA)> <!ELEMENT Regista (#PCDATA)> <!ELEMENT Attore (#PCDATA)> <!ELEMENT Genere (#PCDATA)>

DTD

22

Catalogo film - 2 Un Film dotato di propriet quali un codice identificativo univoco (cod) unindicazione di originalit del supporto (originale s no) in cui si assume di default lacquisto legale unindicazione del tipo di formato (obbligatorio) che pu essere VHS, DVD, DIVX un voto (opzionale) <!ATTLIST Film cod ID #REQUIRED originale (si|no) si formato (VHS|DVD|DIVX) #REQUIRED voto CDATA #IMPLIED >
DTD 23

Catalogo film - 3 Ecco il DTD completo Lo salviamo nel file catalogo.dtd


<!ELEMENT Catalogo (Film*) > <!ELEMENT Titolo (#PCDATA)> <!ELEMENT Regista (#PCDATA)> <!ELEMENT Attore (#PCDATA)> <!ELEMENT Genere (#PCDATA)> <!ELEMENT Film (Titolo,Regista+,Attore*,Genere?)> <!ATTLIST Film cod ID #REQUIRED originale (si|no) 'si formato (VHS|DVD|DIVX) #REQUIRED voto CDATA #IMPLIED>

DTD

24

Catalogo film - 4 Ecco un documento XML valido secondo il DTD appena definito:
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE Catalogo SYSTEM "catalogo.dtd" <Catalogo> <Film cod="f1" formato="DVD" voto="10"> <Titolo>Blade Runner</Titolo> <Regista>Ridley Scott</Regista> <Attore>Harrison Ford</Attore> <Attore>Rutger Hauer</Attore> <Genere>Fantascienza</Genere> </Film> <Film cod="f2" formato="DIVX"> <Titolo>Fantozzi</Titolo> <Regista>Luciano Salce</Regista> </Film> </Catalogo>
DTD 25

Limiti dei DTD Nessun supporto per i namespace Non possibile vincolare i dati oltre la stringa generica niente interi, reali, date Non possibile creare tipi di dato Gli identificatori univoci hanno scope pari al documento Non possibile creare chiavi con scope limitato Il formato non XML Bassa estensibilit

DTD

26

Riferimenti DTD Specification : http://www.w3.org/XML/1998/06/xmlspecreport-19980910.htm

Guida in inglese (molto completa e ben fatta) http://www.w3schools.com/dtd/default.asp

DTD

27

Tecnologie Web T XML Schema

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 2.03.XMLSchema.pdf Versione elettronica: 2.03.XMLSchema-2p.pdf
XML Schema 1

Che cos XML Schema? E unalternativa ai DTD basata su XML Gli schemi XML (XSD = XML Schema Definition) sono in formato XML; possono quindi essere analizzati da un parser XML XML Schema permette di definire: Elementi Attributi Quali elementi sono elementi figli Lordine e il numero degli elementi figli Se un elemento vuoto, oppure contiene testo o altri elementi Tipi di dati per elementi e attributi Valori fissi o di default per elementi e attributi
XML Schema 2

Estensibilit Creazione di tipi di dato personalizzati tramite derivazione dai tipi di dato disponibili Utilizzo di pi schemi per la validazione di un singolo documento Riutilizzo di schemi in altri schemi

XML Schema

Gestione dei tipi E importante la possibilit di gestire in modo completo e flessibile i tipi di dati: Supporto di tipi di dati primitivi e possibilit di crearne di nuovi Supporto di namespace Supporto di ereditariet di tipi e di polimorfismo possibile descrivere il contenuto in maniera puntuale: integer, float, date, string, possibile lavorare in modo sicuro con dati estratti da database: strong typing semplice la definizione di restrizioni sui dati: espressioni regolari, enumerativi, numero caratteri, intervalli numerici,
XML Schema 4

Esempio: il file XML


<?xml version="1.0"?> <!DOCTYPE message SYSTEM message.dtd> <message> <to>Bob</to> <from>Janet</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </message>

Cosa deve specificare lo schema ? Lelemento message composto da: Un elemento to contenente una stringa Un elemento from contenente una stringa Un elemento heading contenente una stringa Un elemento body contenente una stringa
XML Schema 5

Esempio: il file XSD


<?xml version="1.0" encoding="utf-8" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="message" type="messageType"/> <xs:complexType name="messageType"> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema>

E un documento XML costituito da elementi Gli elementi svolgono un ruolo analogo alle dichiarazioni nei DTD
XML Schema 6

Gli elementi dellXSD Lelemento schema: E la radice dei documenti XSD Contiene la dichiarazione del namespace degli schemi Altre dichiarazioni: Elemento element: dichiarazione di elemento di nome name e di tipo type Elemento complexType: definizione di tipo di nome name Elemento sequence: specifica di un content-model di tipo sequenza

XML Schema

Collegamento di un file XML ad uno schema XSD Il collegamento allo schema viene fatto mediante un attributo inserito nel tag dellelemento radice:
<?xml version="1.0"?> <message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance xsi:noNamespaceSchemaLocation="http://mysite.it/msg.xsd"> <to>Bob</to> <from>Janet</from> <heading>Reminder</heading> <body>Don't forget me this weekend</body> </message>

Attenzione: solo un collegamento e non implica la validazione automatica; la cosa importante il namespace Il documento XML associato ad uno schema prende il nome di documento istanza
XML Schema 8

Tipi di dati (Data Type) XML schema permette di attribuire un tipo ad elementi ed attributi (sono come i tipi di Java) Tipi semplici (simpleType): valore Tipi primitivi: predefiniti nella specifica XML Schema (string, float, integer, date) Tipi derivati: sono definiti in termini di tipi primitivi (derivazione per restrizione) Tipi complessi (complexType): dotati di struttura Definizione di nuovi tipi da zero Derivazione per estensione o restrizione Gli elementi possono essere di tipo semplice o complesso mentre gli attributi possono essere solo di tipo semplice
XML Schema 9

Tassonomia dei tipi di dati

XML Schema

10

Definizione e dichiarazione Vale anche qui la distinzione fra definizione e dichiarazione che troviamo nei linguaggi di programmazione Definizione: crea un nuovo tipo di dato semplice o complesso Dichiarazione: fa riferimento ad una definizione per creare unistanza La definizione di un tipo pu essere inline nella dichiarazione: definizione anonima Una dichiarazione ha la seguente sintassi: <xs:element name="elementName" type="elementType" />

XML Schema

11

Esempio: definizione e dichiarazione


Definizione

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="message" type="messageType"/> </xs:schema>
Dichiarazione XML Schema 12

Esempio: definizione inline


Dichiarazione

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="message"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Definizione inline XML Schema 13

Dichiarazione di tipo semplice predefinito XSD


<xs:element name=Nome type=xs:string /> <xs:element name=Eta type=xs:positiveInteger /> <xs:element name=DataNascita type=xs:date />

Istanza
<Nome>Mario</Nome> <Eta>30</Eta> <DataNascita>1980-06-03</DataNascita>

XML Schema

14

Dichiarazione di tipo complesso XSD


<xs:complexType name=PersonaType> <xs:sequence> <xs:element name=Nome type=xs:string/> <xs:element name=DataNascita type=xs:date/> </xs:sequence> </xs:complexType> <xs:element name=Persona type=PersonaType/>

Istanza
<Persona> <Nome>Mario</Nome> <DataNascita>1980-06-03</DataNascita> </Persona>

XML Schema

15

Definizione inline di tipo complesso XSD


<xs:element name=Persona> <xs:complexType> <xs:sequence> <xs:element name=Nome type=xs:string/> <xs:element name=DataNascita type=xs:date/> </xs:sequence> </xs:complexType> </xs:element>

Istanza
<Persona> <Nome>Mario</Nome> <DataNascita>1980-06-03</DataNascita> </Persona>
16

XML Schema

Tipi semplici: elementi costitutivi Un tipo di dato consiste di: Uno spazio dei valori: insieme dei valori che un certo tipo di dato pu assumere Uno spazio lessicale: rappresentazioni dei valori che un certo tipo di dato pu assumere (insieme delle stringhe che rappresentano i valori) Un insieme di facet (aspetti): un facet una propriet che definisce il tipo di dato
si utilizzano per restringere lo spazio dei valori del tipo base e creare un tipo derivato

XML Schema

17

Tipi predefiniti string: stringa di caratteri esclusi i caratteri di controllo di XML decimal: numero di precisione arbitraria (xxx.yy) Tipi derivati: integer, positiveInteger, negativeInteger, float: numero reale a singola precisione (32 bit) double: numero reale a doppia precisione (64 bit) boolean: valore logico true o false dateTime: rappresenta uno specifico momento temporale nel formato CCYY-MM-DDThh:mm:ss date: rappresentazione di una data time: rappresentazione di unora Esistono altri tipi per rappresentare URI, colori, ecc.
XML Schema 18

Derivazione di tipi semplici Sono DataType di tipo valore content model simpleType Gli elementi di tipo semplice possono contenere solo caratteri alfanumerici e non altri elementi La definizione di nuovi tipi avviene derivando per restrizione dai tipi predefiniti La restrizione avviene specificando vincoli (facet) sullo spazio dei valori o sullo spazio lessicale La sintassi per definire un tipo semplice derivato :
<xs:simpleType name="derivedType"> <xs:restriction base="baseType"> facets </xs:restriction> </xs:simpleType>
XML Schema 19

Tipologie di derivazione Le facet individuano diverse tipologie di derivazione La loro applicabilit dipende dal tipo base da cui si deriva Tipologie di derivazioni (e di restrizioni): Intervalli numerici e di date (aperti e chiusi) Limitazioni di lunghezza sulle stringhe Rappresentazioni specifiche di tipi numerici Enumerazioni Vincoli di restrizione sui valori ammissibili di un tipo di dato espressi mediante espressioni regolari (pattern)

XML Schema

20

Facet Intervalli Per definire intervalli numerici si usano le facet: maxExclusive - minExclusive maxInclusive - minInclusive definiscono estremi di intervalli aperti (exclusive) e chiusi (inclusive) Sono applicabili a tutti i valori numerici compresi dateTime, duration, ecc. Vanno in AND con altri facet sia presenti in una stessa derivazione, sia presenti in derivazioni successive

XML Schema

21

Esempio di tipo semplice derivato - 1 Definiamo un tipo semplice derivato dal tipo predefinito positiveInteger in modo tale che un elemento o un attributo dichiarato di questo tipo possa assumere valori compresi fra 13 e 19 estremi inclusi
XSD

<xs:simpleType name=teenAgeType> <xs:restriction base="xs:positiveInteger"> <xs:minInclusive value="13"/> <xs:maxInclusive value=19"/> </xs:restriction> </xs:simpleType>

Facets in AND

<xs:element name=teenAge type=teenAgeType/>


Istanza

<teenAge>15</teenAge>
22

XML Schema

Facet Lunghezza delle stringhe Per limitare la lunghezza delle stringhe si usano le facet: length maxLength minLength Definiscono rispettivamente una lunghezza fissa o un intervallo di lunghezze Sono applicabili a tutti i valori di tipo stringa e derivati Vanno in AND con altri facet sia presenti in una stessa derivazione, sia presenti in derivazioni successive

XML Schema

23

Esempio di tipo semplice derivato - 2 Dichiariamo un tipo semplice derivato minMaxStr in modo tale che un elemento di questo tipo possa contenere stringhe di lunghezza variabile fra 7 e 14 Operiamo in due passi derivando prima minStr da string e poi minMaxStr da minStr: le facet vanno comunque in AND
<xs:simpleType name=minStr> <xs:restriction base=xs:string> <xs:minLength value=7/> </xs:restriction> </xs:simpleType> <xs:simpleType name=minMaxStr> <xs:restriction base=minStr> <xs:maxLength value=14/> </xs:restriction> </xs:simpleType>
XML Schema 24

Facet Rappresentazione dei tipi numerici Possiamo definire il numero di cifre complessive e dei decimali nella rappresentazione dei tipi numerici usando le facet: totalDigits fractionDigits Si applicano a decimal e derivati Vanno in AND con altri facet Esempio: tipo derivato che accetta numeri con al pi due cifre decimali (utile per gli importi in Euro)
<xs:simpleType name="EuroType"> <xs:restriction base="xs:decimal"> <xs:fractionDigits value="2" /> </xs:restriction> </xs:simpleType>
XML Schema 25

Facet Enumerazioni enumeration consente di definire tipi enumerati Applicabile a tutti i tipi predefiniti Va in OR con altri enumeration e in AND con altre facet
<xs:simpleType name=AVType> <xs:restriction base="xs:string"> <xs:enumeration value=VHS /> <xs:enumeration value=DVD /> Formati su supporto ottico <xs:enumeration value=DIVX /> (sottoinsieme dei formati <xs:enumeration value=BETAMAX /> di audiovisivi) <xs:enumeration value=MINIDV /> <xs:enumeration value=VCD /> <xs:simpleType name=AVDiscType> </xs:restriction> <xs:restriction base=AVType"> </xs:simpleType> <xs:enumeration value=DVD /> <xs:enumeration value=DIVX /> Formati di audiovisivi <xs:enumeration value=VCD /> </xs:restriction> </xs:simpleType>

XML Schema

26

Facet Pattern La facet pattern consente di restringere i valori ammissibili mediante espressioni regolari Applicabile a tutti i tipi predefiniti Va in OR con altri pattern e in AND con altre facet Esempio: Euro tipo derivato che accetta numeri con esattamente due cifre decimali
<xs:simpleType name="StrictEuroType"> <xs:restriction base="EuroType"> <xs:pattern value=[0-9]*\.[0-9]{2}" /> </xs:restriction> </xs:simpleType>
Tutte le cifre che vogliamo basta che ci sia il carattere . seguito da 2 cifre. Per inserire . abbiamo dovuto usare un carattere di escape \. XML Schema 27

Facet Whitespace whitespace indica al processore come trattare i caratteri spazio (#x20), tab (#x9), line feed (#xA), carriage return (#xD) nel tipo di dato derivato Pu assumere i valori: preserve: nessuna operazione replace: i caratteri tab, line feed, carriage return vengono sostituiti da spazi collapse: viene effettuato il replace
le sequenze di spazi vengono collassate in un unico spazio e gli spazi allinizio ed alla fine vengono eliminati
<xs:simpleType name=myStr"> <xs:restriction base=xs:string"> <xs:whiteSpace value=collapse /> </xs:restriction> </xs:simpleType> <xs:element name=S type=myStr />
XML Schema

<S> C diventa

o </S>

<S>C i a o</S>
28

Valori di default E possibile specificare un valore di default per un elemento con la sintassi:
<xs:element name=nome type=tipo default=valore/>

Il valore di default viene utilizzato se lelemento presente ed vuoto Il valore deve essere compatibile col tipo di dato La definizione di vuoto varia in base al tipo di dato nella dichiarazione dellelemento In tutti i tipi che ammettono come valore valido la stringa vuota il valore di default non mai utilizzato I tipi numerici invece non ammettono un valore vuoto e quindi usano il default
<xs:element name=nome type=xs:integer default=0/>

XML Schema

29

Valori fissi (fixed) E possibile assegnare ad un elemento un valore fisso con la sintassi:
<xs:element name=nome type=tipo fixed=valore/>

In questo caso: Elemento vuoto (tenendo conto del significato di vuoto descritto per il default): viene inserito automaticamente il valore fisso Elemento con valore: il valore inserito deve corrispondere al valore fisso Esempio:
<xs:element name=domenica type=xs:integer fixed=7/>

Attenzione: default e fixed sono mutuamente esclusivi!!


XML Schema 30

Valori nulli possibile specificare valori nil con significato identico ai valori NULL nellambito dei database Nella dichiarazione dellelemento occorre valorizzare a true il valore dellattributo nillable Nel documento istanza si specifica il valore nil valorizzando a true il valore dellattributo xsi:nil
dove xsi il prefisso del namespace associato allURL http://www.w3.org/2001/XMLSchema-instance

XSD: <xs:element name=size type=xs:integer nillable=true/> Istanza: <size xsi:nil=true/> Ok <size xsi:nil=true>10</size> Errore!
XML Schema 31

Nil, fixed e default Nelle combinazioni di attributi che si ottengono usando insieme nil, fixed e default valgono alcune regole di compatibilit Se nillable=true non possibile specificare un valore fixed Se nillable=true ed specificato un valore di default: Se xsi:nil=true il valore di default non entra in gioco Se xsi:nil=false o non compare, il valore di default entra in gioco Attenzione: pur avendo a che fare con simpleType che in generale non supportano attributi, comuqnue sempre possibile specificare lattributo xsi:nil
XML Schema 32

Tipi complessi Gli elementi dichiarati di tipo complesso possono avere attributi e, in alternativa, elementi figli o contenuto di tipo semplice content model complexType Abbiamo quindi quattro possibilit: Contenuto semplice: solo testo e non elementi figli Solo elementi figli: solo elementi figli e non caratteri Contenuto mixed: sia caratteri, sia elementi figli Nessun contenuto: gli elementi devono essere vuoti Attenzione: ricordiamo che gli attributi non possono mai essere di tipo complesso, ma solo di tipo semplice

XML Schema

33

Tipi con nome e tipi anonimi Ricordiamo che possibile definire: Tipi con nome: definiti separatamente e utilizzati successivamente in una o pi dichiarazioni Tipi anonimi (inline): definiti allinterno della dichiarazione di un elemento
<xs:complexType name=typeName> tipo di contenuto attributi </xs:complexType>
Definizione con nome

Definizione anonima

<xs:element name=myElement> <xs:complexType> tipo di contenuto attributi </xs:complexType> </xs:element>


XML Schema 34

Solo elementi figli Nel caso di tipi che comprendono solo elementi figli la definizione pu comprendere tre sezioni: sequence: gli elementi dichiarati in questa sezione devono comparire nel documento istanza nellordine indicato e con le cardinalit specificate choice: nel documento istanza deve comparire uno solo degli elementi dichiarati in questa sezione, con la cardinalit specificata all: tutti gli elementi dichiarati nella sezione all possono comparire al pi una volta con ordine qualsiasi nel documento istanza

XML Schema

35

Cardinalit La cardinalit viene espressa mediante gli attributi minOccur e maxOccur inseriti allinterno dei vari elementi che compongono il tipo complesso minOccur: indica il numero minimo di volte che lelemento pu comparire: Il valore di default 1 maxOccur: indica il numero massimo di volte che lelemento pu comparire: Il valore di default 1 Per specificare una massima cardinalit pari ad infinito si usa la parola chiave unbounded Attenzione: il valore di default non zero, 1!
XML Schema 36

Esempio di sequence
<xs:complexType name=mySeq> <xs:sequence> <xs:element name=e1 type=xs:string minOccur=0 maxOccur=unbounded/> <xs:element name=e2 type=xs:string maxOccur=2/> </xs:sequence> </xs:complexType> <xs:element name=seq1 type=mySeq/>
XSD

Cardinalit: 0..n

Cardinalit: 1..2

Istanza

<seq1> <e1>Ciao</e1> <e1>Riciao</e1> <e2>A tutti</e2> </seq1>


37

XML Schema

Esempio di choice
<xs:complexType name=myCh> <xs:choice> <xs:element name=e1 type=xs:string minOccur=0 maxOccur=unbounded/> <xs:element name=e2 type=xs:string maxOccur=2/> </xs:choice> </xs:complexType> <xs:element name=ch1 type=myCh/>
XSD

Cardinalit: 0..n

Cardinalit: 1..2

Istanza

<ch1> <e2>Ecco qua</e2> </ch1>

XML Schema

38

Cardinalit di gruppo I gruppi sequence e choice possono a loro volta avere una cardinalit Si usano sempre gli attributi minOccur e maxOccur Esempio: La sequenza deve essere ripetuta da 2 a 3 volte e ogni ripetizione deve contenere esattamente una volta lelemento e1 e una volta lelemento e2 (cardinalit di default = 1)
<xs:complexType name=typeName> <xs:sequence minOccur=2 maxOccur=3> <xs:element name=e1 type=xs:string/> <xs:element name=e2 type=xs:string/> </xs:sequence> </xs:complexType>
XML Schema 39

Combinazione di sequence e choice I gruppi sequence e choice possono essere innestati:

<xs:complexType name=typeName> <xs:sequence> <xs:choice> <xs:element name=a type=xs:string/> <xs:element name=b type=xs:string/> <xs:choice> <xs:choice> <xs:element name=c type=xs:string/> <xs:element name=d type=xs:string/> <xs:choice> </xs:sequence> </xs:complexType>

XML Schema

40

All Consente di indicare che tutti gli elementi conformi a quelli dichiarati al suo interno possono comparire in qualsiasi ordine al pi una volta Pu contenere solo dichiarazioni di elementi Non pu comparire allinterno di altri gruppi (es: sequence, choice) Non possibile specificare cardinalit con minOccur e maxOccur a livello di gruppo I valori validi di minOccur e maxOccur negli elementi contenuti nel gruppo sono rispettivamente (0,1) e 1

XML Schema

41

Esempio di all
<xs:complexType name=myAll> <xs:all> <xs:element name=e1 type=xs:string/> <xs:element name=e2 type=xs:string/> <xs:element name=e3 type=xs:string minOccur=0 maxOccur=1/> </xs:all> </xs:complexType> <xs:element name=all1 type=myAll/>
XSD Istanza Cardinalit 1 (default)

Cardinalit: 0..1

e1 ed e2 devono per forza comparire (in qualsiasi ordine, mentre e3 pu non comparire

<all1> <e2>A tutti</e2> <e1>Ciao</e1> </all1>

XML Schema

42

Contenuto mixed Consente la presenza di caratteri e di elementi Ha senso parlare di contenuto mixed solo per tipi complessi Per avere un modello mixed sufficiente indicare nella definizione del tipo complesso lattributo mixed e attribuirgli il valore true

XML Schema

43

Esempio di mixed
<xs:complexType name="LetterType" mixed="true"> <xs:sequence> <xs:element name=nome" type=xs:string/> <xs:element name=cognome" type=xs:string/> <xs:element name=prodotto type=xs:string/> <xs:element name=taglia type=xs:positiveInteger/> </xs:sequence> </xs:complexType> <xs:element name=letter type=LetterType/> </xs:schema>
Schema Istanza

La sequenza degli elementi deve essere rispettata!!

<letter> Sono <nome>Mario</nome> <cognome>Rossi</cognome> e compro un <prodotto>maglione</prodotto> taglia <taglia>50</taglia> </letter>


XML Schema 44

Contenuto empty Per avere un content model empty sufficiente definire un complexType privo di contenuto Gli elementi di questo tipo devono essere vuoti
<xs:complexType name=myEmpty> </xs:complexType>

XML Schema

45

Attributi Gli attributi possono essere contenuti solo da elementi di tipo complexType Devono essere dichiarati dopo il modello di contenuto Si usa la sintassi: <xs:attribute name=attributeName type=attributeSimpleType use=optional | prohibited | required/> Dove: name: nome dellattributo type: tipo dellattributo (solo simpleType) use: optional: lattributo pu non comparire prohibited: lattributo non deve comparire required: lattributo deve comparire
XML Schema 46

Esempio duso di attributi

<xs:complexType name=WAttrType> <xs:sequence> <xs:element name=a type=xs:string/> <xs:element name=b type=xs:string/> </xs:sequence> <xs:attribute name=at type=xs:string/> </xs:complexType >

XML Schema

47

Dichiarazione di attributi con definizione del tipo inline Gli attributi possono anche essere di un tipo semplice derivato Pu essere un tipo definito in precedenza oppure si pu ricorrere anche in questo caso a una definizione inline con questa sintassi: <xs:attribute name=attributeName use=optional|prohibited|required> <xs:simpleType> </xs:simpleType> </xs:attribute>

XML Schema

48

Default e fixed E possibile definire valori di default o fissi per un attributo usando la sintassi: <xs:attribute name=attrName type=attrType default=value/> <xs:attribute name=attrName type=attrType fixed=value/> La logica uguale a quella delle dichiarazioni DTD: Default: se lattributo non presente, viene inserito il valore di default, altrimenti il valore di default non entra in gioco Fixed: se lattributo non presente, viene inserito il valore fixed, altrimenti il valore nel documento istanza deve essere uguale al valore fixed fixed e default sono mutuamente esclusivi!
XML Schema 49

Elementi a contenuto semplice e attributi Gli attributi possono essere dichiarati solo su elementi complessi E per possibile derivare un tipo complesso da un tipo semplice ed estenderlo aggiungendo attributi Per far ci si utilizza il content model simpleContent con questa sintassi:
<xs:complexType name=typeName> <xs:simpleContent> <xs:extension base=baseType> <xs:attribute name=attName type=attType/> </xs:extension> </xs:simpleContent> </xs:complexType>

XML Schema

50

Esempio di simpleContent con estensione Dichiariamo un tipo taglia utile per gestire le taglie dei vestiti, il cui valore dipende dalla nazione Estendiamo il tipo semplice integer come tipo complesso in modo da poter aggiungere lattributo nazione
<xs:element name=taglia"> <xs:complexType> Definizione inline <xs:simpleContent> <xs:extension base="xs:integer"> <xs:attribute name=nazione" type="xs:string"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element>
Schema Istanza

<taglia nazione=Italia">48</taglia>
XML Schema 51

Dichiarazioni globali e riferimenti possibile effettuare dichiarazioni globali di elementi ed attributi e referenziare tali dichiarazioni per effettuare altre dichiarazioni Le dichiarazioni globali compaiono al primo livello dello schema, come figli diretti dellelemento schema La sintassi per i riferimenti a dichiarazioni globali : <xs:element ref=aGlobalElement/> Lelemento o attributo dichiarato per riferimento ha le stesse propriet (nome, tipo, ecc.) dellelemento o attributo riferito Tali propriet non possono essere ridefinite

XML Schema

52

Esempio di dichiarazioni globali e riferimenti


<xs:schema > <xs:element name=comment type=xs:string/> <xs:attribute name=att type=xs:integer/> <xs:element name=myRoot> <xs:complexType> <xs:sequence> <xs:element name=a type=xs:float/> <xs:element ref=comment/> </xs:sequence> <xs:attribute ref=att/> </xs:complexType> </xs:element> </xs:schema>

Dichiarazioni globali

Riferimenti

Ok in base al riferimento

<myRoot att=5> <a/> <comment>Sono nato stanco!</comment> </myRoot>


XML Schema 53

Namespace Uno schema un insieme di definizioni e dichiarazioni i cui nomi appartengono ad un particolare namespace detto targetNamespace (namespace obiettivo) Ogni schema pu avere un solo targetNamespace Lattributo targetNamespace va posto nellelemento schema Usando i namespace possibile distinguere i nomi del vocabolario XML Schema dai nomi del vocabolario che si sta definendo In un documento XMLSchema che vuole definire un namespace dovremo dichiarare due namespace: Il namespace degli schemi: http://www.w3.org/2001/XMLSchema Il namespace obiettivo
XML Schema 54

Esempio di namespace
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:po="http://example.com/PO1" targetNamespace="http://example.com/PO1" ... > ... </schema>

Tutte le definizioni e le dichiarazioni allinterno del documento faranno parte del namespace obiettivo Gli identificatori presi dal namespace degli schemi saranno senza prefisso (lo abbiamo definito come namespace di default)

XML Schema

55

Qualificazione -1 La specifica XML Schema impone che tutti gli elementi globali (di primo livello) definiti in uno schema devono essere qualificati con un prefisso di namespace Questobbligo viene meno se nel documento istanza il namespace dello schema dichiarato come namespace di default Esiste invece la possibilit di definire una politica di uso dei presfissi per quanto riguarda le dichiarazioni locali ovvero: gli elementi interni ai tipi complessi esclusi quelli definiti per riferimento gli attributi

XML Schema

56

Qualificazione -2 Per far ci si usano due attributi


elementFormDefault="unqualified|qualified" attributeFormDefault="unqualified|qualified

Per default il loro valore unqualified Vengono di soliti impostati nellelemento schema e quindi valgono per lintero schema Possono per essere impostati anche negli elementi pi interni consentendo cos la definizione di politiche pi flessibili

XML Schema

57

Riferimenti XSD Specification : http://www.w3.org/2001/XMLSchema Guida in inglese (molto completa e ben fatta) http://www.w3schools.com/schema/default.asp

XML Schema

58

Tecnologie Web T XML e Java

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 2.04.XML-Java.pdf Versione elettronica: 2.04.XML-Java-2p.pdf
XML e Java 1

Elaborazione di documenti XML Un elemento importante che ha consentito la diffusione dei linguaggi e delle tecnologie XML il supporto fornito da strumenti per il parsing analisi sintattica Ogni applicazione che vuole fruire di XML deve includere un supporto per il parsing I parser XML sono diventati strumenti standard nello sviluppo delle applicazioni per esempio, JDK, a partire dalla versione 1.4, integra le sue API di base con API specifiche per il supporto al parsing specifiche JAXP, Java API for XML Processing

XML e Java

Compiti del parser Decomporre i documenti XML (istanza) nei loro elementi costitutivi elementi, attributi, testo, ecc. Eseguire controlli sul documento Controllare che il documento sia ben formato Controllare eventualmente che il documento sia valido (DTD, XML Schema) Non tutti i parser consentono la validazione dei documenti: si parla quindi di parser validanti e non validanti La validazione una operazione computazionalmente costosa e quindi opportuno potere scegliere se attivarla o meno
XML e Java 3

Modelli di parsing per XML Dal punto di vista dellinterfacciamento tra applicazioni e parser esistono due grandi categorie di API Interfacce basate su eventi Interfacce SAX (Simple API for XML) sfruttano un modello a callback Interfacce Object Model W3C DOM Recommendation

XML e Java

Interfacce ad eventi Lapplicazione implementa un insieme di metodi di callback che vengono invocati dal parser mentre elabora il documento Le callback sono invocate al verificarsi di specifici eventi (es. start-tag, end-tag, ) I parametri passati al metodo di callback forniscono ulteriori informazioni sullevento Nome dellelemento Nome e valore assunto dagli attributi Valore delle stringhe contenute E una modalit semplice ed efficiente non mantiene in memoria una rappresentazione del documento
usato per grossi file XML o per accessi veloci
XML e Java 5

Schema di parsing ad eventi


Applicazione

Main Application Routines

<?xml version='1.0'?> <a i="1"> Ciao </a>

Parsing Routines startDocument() startElement()


A i="1" "Ciao" A

characters()
endElement() endDocument()

Parser

XML e Java

Interfacce Object Model Lapplicazione interagisce con una rappresentazione object-oriented del documento Il documento rappresentato da un albero (parsetree) costituito da vari oggetti quali document, element, attribute, text, Il livello di astrazione che le interfacce Obiect Model forniscono al programmatore maggiore rispetto a quello fornito dalle interfacce basate su eventi Facile accedere ai figli, ai fratelli, ecc. di un elemento e/o aggiungere, rimuovere dinamicamente nodi Problema: mantiene in memoria lintero parse-tree; dunque richiede la disponibilit di memoria
adatto per documenti di ridotta dimensione
XML e Java 7

Schema di parsing object model

Application Rappresentazione del documento in memoria

Parser

Document A
<?xml version='1.0'?> <a i="1"> Ciao </a>

I=1

Ciao

XML e Java

Ricapitolando I parser XML rendono disponibile alle applicazioni la struttura ed il contenuto dei documenti XML e si interfacciano mediante due tipologie di API Event-based API (es. SAX) Notificano alle applicazioni eventi generati nel parsing dei documenti Usano poche risorse ma non sono sempre comodissime da usare Object-model based API (es. DOM) Forniscono accesso al parse-tree che rappresenta il documento XML; molto comode ed eleganti Richiedono per maggiori risorse in termini di memoria I parser pi diffusi supportano sia SAX sia DOM spesso i parser DOM sono sviluppati su parser SAX
XML e Java 9

Parser in Java: JAXP JAXP (Java API for XML Processing) un framework che ci consente di istanziare ed utilizzare parser XML (sia SAX che DOM) nelle applicazioni Java JAXP 1.1 inclusa nella JDK a partire dalla versione JDK 1.4 Fornisce vari package: org.xml.sax: interfacce SAX org.w3c.dom: interfacce DOM javax.xml.parsers: inizializzazione ed uso dei parser JAXP permette di operare indipendentemente dalleffettiva implementazione del parser utilizzata utilizza un parser presente allinterno del sistema usa il pattern factory per ottenere questa indipendenza
XML e Java 10

JAXP: factory e parser javax.xml.parsers espone due classi factory, una per SAX e una per DOM:
SAXParserFactory DocumentBuilderFactory

Sono classi astratte ed espongono il metodo statico newInstance() che consente di ottenere unistanza di una classe discendente concreta:
SAXParserFactory spf = SAXParserFactory.newInstance(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

Una volta ottenuta una factory possiamo invocarla per creare un parser con interfaccia SAX o DOM:
SAXParser saxParser = spf.newSAXParser(); DocumentBuilder builder = dbf.newDocumentBuilder();
XML e Java 11

Interfacce SAX Le applicazioni interagiscono con parser conformi a SAX utilizzando interfacce stabilite Le interfacce di SAX possono essere divise in 3 categorie: Interfacce Parser-to-Application (callback): consentono di definire funzioni di callback e di associarle agli eventi generati dal parser mentre questi processa un documento XML Interfacce Application-to-Parser: consentono di gestire il parser Interfacce Ausiliarie: facilitano la manipolazione delle informazioni fornite dal parser

XML e Java

12

Interfacce Parser-to-Application (callback) Vengono implementate dallapplicazione per imporre un preciso comportamento a seguito del verificarsi di un evento Sono quattro: ContentHandler: metodi per elaborare gli eventi generati dal parser DTDHandler: metodi per ricevere notifiche su entit esterne al documento e loro notazione dichiarata in DTD ErrorHandler: metodi per gestire gli errori ed i warning nellelaborazione di un documento EntityResolver: metodi per personalizzare lelaborazione di riferimenti ad entit esterne Se uninterfaccia non viene implementata il comportamento di default ignorare levento
XML e Java 13

Interfacce Application-to-Parser Sono implementate dal parser XMLReader: interfaccia che consente allapplicazione di invocare il parser e di registrare gli oggetti che implementano le interfacce di callback XMLFilter: interfaccia che consente di porre in sequenza vari XMLReaders come una serie di filtri

XML e Java

14

Interfacce Ausiliarie Attributes: Metodi per accedere ad una lista di attributi Locator: metodi per individuare lorigine degli eventi nel parsing dei documenti (es. systemID, numeri di linea e di colonna, ecc.)

XML e Java

15

ContentHandler Metodi per ricevere informazioni sugli eventi generali che si manifestano nel parsing di un documento XML setDocumentLocator(Locator locator)
riceve un oggetto che determina lorigine di un evento SAX (ad esempio, potremmo usare il metodo per fornire informazioni agli utenti)

Inizio e fine documento: startDocument(); endDocument() Inizio e fine di un elemento: startElement(String namespaceURI, String localname, String qName, Attributes atts); endElement(String namespaceURI, String localname, String qName); Si noti che i due ultimi metodi supportano i namespaces
XML e Java 16

Altri metodi di ContentHandler


characters(char ch[], int start, int length)

notifica la presenza di character data


ignorableWhitespace(char ch[], int start, int length)

notifica della presenza di whitespace ignorabili nellelement content


<!DOCTYPE A [<!ELEMENT A (B)> <!ELEMENT B (#PCDATA)> ]> <A> <B> Ignorable </B> whitespace </A> Text content

XML e Java

17

Attivazione di un parser SAX


Si crea prima una factory, poi il parser e infine il reader
SAXParserFactory spf = SAXParserFactory.newInstance(); try { SAXParser saxParser = spf.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); };

XML e Java

18

Esempio SAX - 1 Consideriamo il seguente file XML:


<?xml version="1.0" encoding="ISO-8859-1"?> <db> <person idnum="1234"> <last>Rossi</last><first>Mario</first> </person> <person idnum="5678"> <last>Bianchi</last><first>Elena</first> </person> <person idnum="9012"> <last>Verdi</last><first>Giuseppe</first> </person> <person idnum="3456"> <last>Rossi</last><first>Anna</first> </person> </db>
XML e Java 19

Esempio SAX - 2 Stampare a video nome, cognome e identificativo di ogni persona: Mario Rossi (1234) Elena Bianchi (5678) Giuseppe Verdi (9012) Anna Rossi (3456)

Strategia di soluzione con un approccio event-based: Allinizio di person, si registra idnum (e.g., 1234) Si tiene traccia dellinizio degli elementi last e first, per capire quando registrare nome e cognome (e.g., Rossi and Mario) Alla fine di person, si stampano i dati memorizzati

XML e Java

20

Esempio SAX - 3 Incominciamo importando le classi che ci servono


import org.xml.sax.XMLReader; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; // Implementazione di default di ContentHandler: import org.xml.sax.helpers.DefaultHandler;
// Classi JAXP usate per accedere al parser SAX: import javax.xml.parsers.*;

XML e Java

21

Esempio SAX - 4 Definiamo una classe che discende da DefaultHandler e ridefinisce solo i metodi di callback che sono rilevanti nella nostra applicazione
public class SAXDBApp extends DefaultHandler { // Flag per ricordare dove siamo: private boolean InFirst = false; private boolean InLast = false; // Attributi per i valori da visualizzare private String FirstName, LastName, IdNum;

XML e Java

22

Esempio SAX - 5 Implementiamo i metodi di callback che ci servono Start element registra linizio degli elementi first e last, ed il valore dellattributo idnum dellelemento person
public void startElement (String namespaceURI, String localName, String rawName, Attributes atts) { if (localName.equals("first")) InFirst = true; if (localName.equals("last")) InLast = true; if (localName.equals("person")) IdNum = atts.getValue("idnum"); }

XML e Java

23

Esempio SAX - 6 Il metodo di callback characters intercetta il contenuto testuale Registriamo in modo opportuno il valore del testo a seconda che siamo dentro first o last
public void characters (char ch[], int start, int length) { if (InFirst) FirstName = new String(ch, start, length); if (InLast) LastName = new String(ch, start, length); }

XML e Java

24

Esempio SAX - 7 Quanto abbiamo trovato la fine dellelemento person, scriviamo i dati; quando troviamo la fine dellelemento first o dellelemento last aggiorniamo i flag in modo opportuno
public void endElement(String namespaceURI, String localName, String qName) { if (localName.equals("person")) System.out.println(FirstName + " " + LastName + " (" + IdNum + ")" ); //Aggiorna i flag di contesto if (localName.equals("first")) InFirst = false; if (localName.equals("last")) InFirst = false; }
XML e Java 25

Esempio SAX Il main


public static void main (String args[]) throws Exception { // Usa SAXParserFactory per istanziare un XMLReader SAXParserFactory spf = SAXParserFactory.newInstance(); try { SAXParser saxParser = spf.newSAXParser(); XMLReader xmlReader = saxParser.getXMLReader(); ContentHandler handler = new SAXDBApp(); xmlReader.setContentHandler(handler); for (int i=0; i<args.length; i++) xmlReader.parse(args[i]); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(1); }; }
XML e Java 26

DOM DOM (Document Object Model) una API per accedere e manipolare documenti XML (e HTML) Consente alle applicazioni di costruire documenti, navigare la loro struttura, aggiungere, modificare o cancellare elementi e contenuto DOM object-based DOM uno standard W3C supportato da numerosi linguaggi che utilizzano le stesse API Mentre SAX fornisce un meccanismo sequenziale per il parsing dei documenti, DOM permette un accesso diretto senza imporre una particolare sequenza

XML e Java

27

Modello di DOM DOM basato sui concetti tradizionali della programmazione ad oggetti: Metodi: regolano laccesso e consentono di alterare lo stato degli oggetti Interfacce: consentono di dichiarare un insieme di metodi Oggetti: incapsulano dati e metodi Il modello rappresenta i documenti XML come alberi (parse-tree) La struttura ad albero determinata dalle interfacce stabilite dalla specifica di DOM Tipicamente la struttura ad albero viene mantenuta nellimplementazione dei parser DOM
XML e Java
28

Esempio
<invoice> <invoicepage form="00" type="estimatedbill"> <addressee> <addressdata> <name>Leila Laskuprintti</name> <address> <streetaddress>Pyynpolku 1 </streetaddress> <postoffice>70460 KUOPIO </postoffice> </address> </addressdata> </addressee> ...

invoice form="00" type="estimatedbill"

invoicepage

addressee

addressdata

Document Element

name

address

Leila Laskuprintti Text NamedNodeMap

streetaddress

postoffice

Pyynpolku 1 XML e Java

70460 KUOPIO 29

Interfaccia Node: metodi


getNodeType() getNodeValue() getOwnerDocument() getParentNode() hasChildNodes() getChildNodes() getFirstChild() getLastChild() getPreviousSibling() getNextSibling() hasAttributes() getAttributes() appendChild(newChild) insertBefore(newChild,refChild) replaceChild(newChild,oldChild) removeChild(oldChild)
XML e Java 30

Object Creation in DOM DOM specifica diverse classi Loggetto X di DOM inserito nel contesto di un Document X.getOwnerDocument() Gli oggetti che implementano linterfaccia X sono creati da una factory D.createX() , dove D loggetto Document Esempi: createElement("A"), createAttribute("href"), createTextNode("Hello!") Creazione e salvataggio di Document sono demandati alle specifiche implementazioni
XML e Java 31

Interfacce Document ed Element Document getDocumentElement() createAttribute(name) createElement(tagName) createTextNode(data) getDocType() getElementById(IdVal) Element getTagName() getAttributeNode(name) setAttributeNode(attr) removeAttribute(name) getElementsByTagName(name) hasAttribute(name)
XML e Java 32

Propriet di Node Node.getNodeName() Se applicato ad Element equivale a getTagName() Se applicato ad Attr restituisce il nome dellattributo Node.getNodeValue() Restituisce il contenuto di un text node, il valore di un attributo, ecc. Se applicato ad Element restituisce null Node.getNodeType():

Restituisce un valore numerico costante (es. 1, 2, 3, , 12) che corrisponde a ELEMENT_NODE,


ATTRIBUTE_NODE, TEXT_NODE, , NOTATION_NODE

XML e Java

33

Manipolazione di Content e Element Manipolazione di CharacterData: substringData(offset, count) appendData(string) insertData(offset, string) deleteData(offset, count) replaceData(offset, count, string) (= delete + insert) Accesso e manipolazione degli attributi di un Element: getAttribute(name) setAttribute(name, value) removeAttribute(name)

XML e Java

34

Interfacce NodeList e NamedNodeMap NodeList rappresenta liste ordinate di nodi Per esempio, tutti i nodi figli di un nodo: Node.getChildNodes() Oppure tutti i discendenti di tipo "name" nellordine in cui appaiono nel documento Element.getElementsByTagName("name") Si pu usare la wild-card * per ottenere tutti gli elementi Esempio: iteriamo su tutti i nodi figli di un nodo:
for (i=0;i<node.getChildNodes().getLength();i++) process(node.getChildNodes().item(i));

NamedNodeMap permette di accedere a insiemi non ordinati di nodi individuati per nome Per esempio, tutti gli attributi di un nodo: Node.getAttributes()
XML e Java 35

Attivazione e uso di un parser DOM in JAXP Si crea prima una factory, poi il document builder Si crea un oggetto di tipo File passando il nome del file che contiene il documento Si invoca il metodo parse del parser per ottenere un istanza di Document che pu essere navigata
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); documentBuilder builder = dbf.newDocumentBuilder(); File file = new File (prova.xml); Document doc = dbf.parse(file)

XML e Java

36

Gestione del Parsing JAXP consente la gestione degli errori individuati durante il parsing di documenti DOM Si crea una classe che implementa linterfaccia ErrorHandler di SAX (metodi error, fatalError e warning) Unistanza di questa classe viene passata al parser DOM usando il metodo setErrorHandler esposto da DocumentBuilder La validazione ed i namespace vengono gestiti sia per SAXParserFactories che per DocumentBuilderFactories con setValidating(boolean) setNamespaceAware(boolean)
XML e Java 37

Esempio DOM Il documento XML Consideriamo un semplice documento XML:


<?xml version="1.0"?> <student> <firstname>Paolo</firstname> <lastname>Rossi</lastname> <address>via Verdi 15</address> <city>Genova</city> </student>

student Document

Element
Text

firstname

lastname

address

city

Paolo

Rossi

via Verdi 15

Genova

XML e Java

38

Esempio DOM Caricamento del documento


import java.io.*; import javax.xml.parsers.*; import org.w3c.dom.*;
public class AccessingXmlFile { public static Document loadDocument(String fileName) { try { File file = new File(fileName); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); return db.parse(file); } catch (Exception e) e.printStackTrace(); } ...
XML e Java 39

Esempio DOM Navigazione nel documento


... public static void main(String argv[]) { Document document = loadDocument(); Element root = document.getDocumentElement(); root.normalize(); System.out.println("Root " + root.getNodeName()); System.out.println("Informazioni sugli studenti"); NodeList nodes = root.getChildNodes(); for (int i = 0; i < nodes.getLength(); i++) { Node el = nodes.items(i); String elName= el.getName() Node tx = el.getFirstChild(); String elText=tx.getNodeValue(); System.out.println(elname+"=+elText); } }

XML e Java

40

Altre API Java per il Parsing di XML JDOM variante di DOM; maggiormente allineato alla programmazione orientata agli oggetti http://www.jdom.org/ DOM4J Simile a JDOM ma con maggiori funzionalit http://www.dom4j.org/ JAXB (Java Architecture for XML Binding) Compila i DTD in classi Java DTD-specific che consentono di leggere, scrivere e manipolare documenti XML validi http://java.sun.com/xml/jaxb/

XML e Java

41

Riferimenti JAXP Documentation: http://download.oracle.com/javase/6/docs/t echnotes/guides/xml/jaxp/index.html

Tutorial http://java.sun.com/webservices/reference/ tutorials/jaxp/html/intro.html

XML e Java

42

Evoluzione del modello: Web dinamico

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 3.01.WebDinamico.pdf Versione elettronica: 3.01.WebDinamico-2p.pdf
1

Modello Web statico Il modello che abbiamo analizzato finora, basato sul concetto di ipertesto distribuito, ha una natura essenzialmente statica Anche se lutente pu percorrere dinamicamente lipertesto in modi molto diversi linsieme dei contenuti prefissato staticamente: Pagine vengono preparate staticamente a priori Non esistono pagine composte dinamicamente in base allinterazione con lutente un modello semplice, potente, di facile implementazione efficiente, ma presenta dei limiti

Modello Web Statico


Macchina server Macchina client URL Web Server Browser Documento HTML

Risorse (documenti HTML)

documenti HTML costruiti a priori

Limiti del modello statico Per capire quali sono i limiti del modello statico e come possono essere superati proviamo a ragionare su un semplice esempio Vogliamo costruire unenciclopedia dei Dinosauri consultabile via Web: http://www.dino.it Possiamo creare una pagina HTML per ogni specie di dinosauro con testi e immagini Possiamo poi creare una pagina iniziale che fa da indice basandoci sulla classificazione scientifica Ogni voce un link alla pagina che descrive un dinosauro
4

Limiti del modello statico Se vogliamo rendere pi agevole laccesso alle schede possiamo anche predisporre unaltra pagina con un indice analitico che riporta le specie di

dinosauri in ordine alfabetico

Tutto questo pu essere realizzato facilmente con gli strumenti messi a disposizione dal Web statico Il modello va per in crisi se proviamo ad aggiungere

una funzionalit molto semplice: la ricerca per nome Quello che ci serve una pagina con un form,

costituito da un semplice campo di input e da un bottone, che ci consenta di inserire il nome di un dinosauro e di accedere direttamente alla pagina che lo descrive

Ricerca Vediamo il codice della pagina HTML: abbiamo usato il metodo GET per semplicit
<html> <head> <title> Ricerca dinosauri </title> </head> <body> <p>Enciclopedia dei dinosauri - Ricerca</p> <form method="GET" action="http://www.dino.it/cerca"> <p>Nome del dinosauro <input type="text" name="nomeTxt" size="20"> <input type="submit" value="Cerca" name="cercaBtn"> </p> </form> </body> </html>

Eseguire la ricerca Se scriviamo il nome di un dinosauro e premiamo il bottone cerca si attiva una invocazione HTTP di tipo GET con un URL di questo tipo:
www.dino.it/cerca?nomeTxt=diplodocus&cercaBtn=Cerca

Web server non in grado di interpretare immediatamente questa chiamata (URL con query) perch richiede lesecuzione dinamica di unapplicazione legata al particolare contesto quindi necessaria unestensione specifica: un programma scritto appositamente per lenciclopedia che: Interpreta i parametri passati nel GET Cerca nel file system la pagina diplodocus.html La restituisce al Web server per linvio al client
7

CGI La prima soluzione proposta per risolvere questo problema prende il nome di Common Gateway Interface (CGI) CGI uno standard per interfacciare applicazioni esterne con Web server Le applicazioni che usano questo standard prendono il nome di programmi CGI Un programma CGI viene eseguito dinamicamente in risposta alla chiamata e produce output che costituisce la risposta alla richiesta http (informazione dinamica) Pu essere scritto in qualunque linguaggio: ad esempio in C o in un linguaggio di script (tipicamente Perl)
8

Modello di interazione CGI

Le operazioni si svolgono nel seguente ordine: Il client, tramite HTTP, invia al server la richiesta di eseguire un programma CGI con alcuni parametri e dati in ingresso Il server, attraverso l'interfaccia standard CGI (accordo standardizzato), chiama il programma passandogli i parametri e i dati inviati dal client Eseguite le operazioni necessarie, il programma CGI rimanda al server i dati elaborati (pagina HTML), sempre facendo uso dell'interfaccia CGI Il server invia al client i dati elaborati dal programma CGI tramite protocollo HTTP
9

Comunicazione fra server e programma CGI I programmi CGI e il server comunicano in quattro modi (sono parte dellinterfaccia standard CGI): Variabili di ambiente del sistema operativo Parametri sulla linea di comandi: il programma CGI viene lanciato in una shell di sistema operativo e quindi pu interpretare i parametri passati (usato soprattutto con il metodo GET) Standard Input (usato soprattutto con il metodo POST) Standard Output: per restituire al server la pagina HTML da inviare al client

10

Parametri: metodo GET Con il metodo GET il server passa il contenuto della form al programma CGI come se fosse da linea di comando di una shell Nel nostro esempio la URL era
www.dino.it/cerca?nomeTxt=diplodocus&cercaBtn=Cerca Dove:

lindirizzo del server web cerca il nome del programma CGI nomeTxt=diplodocus&cercaBtn=Cerca la riga di comandi passata al programma cerca Linea di comando ha una lunghezza finita dipendente da SO (massimo 256 caratteri su SO UNIX) La quantit di dati che possono essere inviati con il metodo GET molto limitata
www.dino.it
11

Parametri: metodo POST


Come abbiamo gi visto,

usando POST non viene aggiunto nulla alla URL specificata da ACTION Quindi la linea comando nella shell contiene solo il nome del programma CGI Nel nostro esempio la URL sar semplicemente www.dino.it/cerca a cui corrisponde un comando di linea cerca senza alcun parametro I dati del form, contenuti nellheader HTTP, vengono inviati al programma CGI tramite lo standard input In questo modo si possono inviare dati lunghi a piacimento, senza i limiti di GET In C per accedere ai dati si apre aprire un file su stdin e si leggono i campi del post con fgetc(): nome = fgetc(stdin); // nomeTxt=diplodocus btn = fgetc(stdin); // cercaBtn=Cerca
12

Variabili di ambiente Prima di chiamare il programma CGI, Web server imposta alcune variabili di sistema corrispondenti agli header HTTP, ad esempio: REQUEST_METHOD: metodo usato dalla form QUERY_STRING: parte di URL che segue il "?" REMOTE_HOST: host che ha inviato la richiesta CONTENT_TYPE: tipo MIME dellinformazione contenuta nel body della richiesta (nel POST) CONTENT_LENGTH: lunghezza dei dati inviati HTTP_USER_AGENT: nome e versione del browser usato dal client Se si implementa la CGI in C, si pu usare getenv(): utente = getenv(REMOTE_HOST);
13

Output Il programma CGI elabora i dati in ingresso ed emette un output per il client in attesa di risposta Per passare i dati al server il programma CGI usa stdout: ad es. in C si pu usare la funzione printf() Il server preleva i dati dallo standard output e li invia al client incapsulandoli in messaggio HTTP, ad esempio:
HTTP/1.0 200 OK Date: Wednesday, 02-Feb-94 23:04:12 GMT Server: NCSA/1.1 MIME-version: 1.0 Last-modified: Monday, 15-Nov-93 23:33:16 GMT Content-type: text/html Content-length: 2345 <HTML><HEAD><TITLE> ...

Parte generata da Web server

Parte generata dal programma CGI

14

Configurazione Web server Se arriva la URL www.dino.it/cgi-bin/cerca il server deve rendersi conto che cerca non un documento HTML ma un programma CGI Perch ci accada necessario che: I programmi CGI siano tutti in un'apposita directory Nella configurazione del server sia specificato il path ove trovare i programmi CGI e l'identificatore che indica che richiesta l'esecuzione di una applicazione Di solito si sceglie come identificatore /cgi-bin/ Tutto ci che segue l'identificatore viene interpretato dal server come nome di programma da eseguire Il server cerca il programma specificato nel path che stato indicato nella configurazione
15

CGI e dinosauri Un meccanismo come quello appena descritto consente di risolvere il problema della ricerca nellesempio dellenciclopedia Il browser usando il metodo GET invia il contenuto del campo di ricerca nella parte query dellURL:
www.dino.it/cgi-bin/cerca?nomeTxt=diplodocus&cercaBtn=Cerca

Web server usa linterfaccia CGI per passare i parametri presenti nellURL ad un programma denominato cerca cerca usa il valore del parametro nomeTxt per cercare le pagine che contengono il termine inserito nel campo di ricerca (diplodocus) Usa stdout per costruire una pagina con un elenco di link alle pagine che contengono il termine
16

Altri problemi La nostra enciclopedia ha anche un problema di manutenibilit


Se vogliamo aggiungere un dinosauro dobbiamo infatti: Creare una nuova pagina con una struttura molto simile alle altre Aggiungere il link alla pagina nellindice principale (quello basato sulla classificazione delle specie) Aggiungere un link nellindice alfabetico

La pagina di ricerca invece non richiede alcuna modifica Se poi volessimo cambiare laspetto grafico della nostra enciclopedia dovremmo rifare una per una tutte le pagine (a meno dellutilizzo di css e xhtml di cui siete ormai
massimi esperti mondiali)
17

DynamicDino.it
Una soluzione ragionevole quella di separare gli aspetti di contenuto da quelli di presentazione Ad esempio, utilizziamo un database relazionale per memorizzare le informazioni relative ad ogni dinosauro Realizziamo alcuni programmi CGI che generano dinamicamente lenciclopedia scheda: crea una pagina con la scheda di un determinato dinosauro indice: crea la pagina di indice per specie (tassonomia) alfabetico: crea lindice alfabetico cerca: restituisce una pagina con i link alle schede che contengono il testo inserito dallutente Tutti e 4 i programmi usano il DB per ricavare le informazioni utili per la costruzione della pagina

18

Struttura del database Per semplicit possiamo utilizzare una sola tabella con la struttura sotto riportata (non normalizzata) Il campo testo contiene la pagina HTML Gli altri campi permettono di costruire agevolmente lindice basato sulla tassonomia
Specie Dicraeosaurus hansemanni Ordine Saurischia Famiglia Dicraeosauridae Genere Dicreaosaurus Testo <p>Il <b>dicreosauro</b> (gen. Dicraeosaurus) un dinosauro erbivoro vissuto in Africa orientale nel Giurassico superiore (Kimmeridgiano, circa 150 milioni di anni fa). ...

19

Vantaggi della nuova soluzione In questo modo la gestione dellenciclopedia sicuramente pi semplice: Basta inserire un record nel database per aggiungere una nuova specie Lindice tassonomico e quello alfabetico si aggiornano automaticamente anche possibile cambiare agevolmente layout di tutte le pagine Possibile utilizzare una pagina HTML di base (template) con tutte le parti fisse Il programma scheda si limita a caricare il template e a inserire le parti variabili Per cambiare laspetto grafico di tutte le schede sufficiente agire una sola volta sul template
20

Un nuovo modello Il modello cambiato in modo significativo Abbiamo aggiunto una forma di elaborazione lato server Linsieme delle CGI che gestiscono lenciclopedia costituisce unapplicazione distribuita Ogni CGI pu essere vista come una procedura remota invocata tramite HTTP
URL (usualmente in /cgi-bin/) /scheda?specie=Diplodocus /indice /alfabetico /cerca?testo=diplod Procedura scheda(Diplodocus); indice(); alfabetico(); cerca(diplod);

21

Modello Web dinamico


Macchina server Macchina client URL Web Server

Interfaccia CGI Browser Documento HTML scheda indice alfab cerca

Database I documenti HTML non sono costruiti a priori

22

Tutto a posto? Larchitettura che abbiamo appena visto presenta numerosi vantaggi ma soffre anche di diversi problemi Le CGI, soprattutto se scritte in C, possono essere

poco robuste (soggette a errori bloccanti) Ci sono problemi di prestazioni: ogni volta che viene invocata una CGI si crea un processo che viene distrutto alla fine dellelaborazione Ogni programma CGI deve reimplementare tutta una serie di parti comuni: accesso al DB, logica di

interpretazione delle richieste HTTP e di costruzione delle risposte, gestione dello stato ecc. Abbiamo scarse garanzie sulla sicurezza Esistono varianti di CGI che risolvono alcuni problemi di prestazioni (FastCGI). Come, secondo voi?
23

Una sola applicazione Per ovviare al penultimo punto si potrebbe realizzare una sola CGI (enc) che implementa tutte e quattro le funzionalit (vedi schema sottostante) In questo modo per si ha unapplicazione monolitica e si perdono i vantaggi della modularit Gli altri problemi rimangono invariati
URL /enc?azione=scheda&specie=Diplodocus /enc?azione=indice /enc?azione=alfabetico /enc?azione=cerca&testo=diplod Procedura scheda(Diplodocus); indice(); alfabetico(); cerca(diplod);

24

Le due soluzioni a confronto

Web Server

Web Server

Interfaccia CGI

Interfaccia CGI

scheda

indice

alfab

cerca

enc

Database

Database

25

Application server La soluzione migliore quella di realizzare un contenitore in cui far vivere le funzioni server-side Il contenitore si preoccupa di fornire i servizi di cui le applicazioni hanno bisogno: Interfacciamento con il Web Server Interfacciamento con il database Gestione della sicurezza Gestione del tempo di vita (attivazione on-demand delle funzioni) Si ha cos una soluzione modulare in cui le funzionalit ripetitive vengono portate a fattor comune Un ambiente di questo tipo prende il nome di application server
26

Parentesi su Modelli a Contenimento Che cosa vi ricordate di modelli componenti-container? Esempi di tecnologie a componenti? CONTENIMENTO
Spesso molte funzionalit possono essere non controllate direttamente ma lasciate come responsabilit ad una entit delegata supervisore (contenitore) che se ne occupa spesso introducendo politiche di default evitando che si verifichino errori controllando eventuali eventi I contenitori (entit dette anche CONTAINER, ENGINE, MIDDLEWARE, ) possono occuparsi di azioni automatiche da cui viene sgravato lutilizzatore che deve specificare solo la parte contenuta tipicamente di alto livello, non ripetitiva, fortemente dipendente dalla logica applicativa
27

Modelli a Contenimento
CONTAINER Un servizio utente potrebbe essere integrato in un ambiente (middleware) che si occupa in modo autonomo di molti aspetti diversi Vedrete ad esempio CORBA - tutti aspetti C/S Engine per framework a GUI Container per servlet Container possono ospitare componenti pi trasportabili, riutilizzabili e mobili

CONTAINER

Richieste
Cliente 1

OPERAZIONI VARIE

Cliente 2

OPERAZIONE SEMPLIFICATA
Cliente i Cliente i Cliente i

28

Delega al Container Il container pu fornire automaticamente molte delle funzioni per supportare il servizio applicativo verso lutente Supporto al ciclo di vita
Attivazione/deattivazione del servitore Mantenimento dello stato (durata della sessione?) Persistenza trasparente e recupero delle informazioni (interfaccia DB)

Supporto al sistema dei nomi


Discovery del servitore/servizio Federazione con altri container

Supporto alla qualit del servizio


Tolleranza ai guasti, selezione tra possibili deployment Controllo della QoS richiesta e ottenuta

Sicurezza
29

Architettura basata su application server


Application server

scheda

indice

alfab

cerca

Web Server Interfaccia Web Server Interfaccia DB Gestione tempo di vita Gestione della sessione

Database

30

Application server e tecnologie server side Le due tecnologie pi diffuse nellambito degli application server oggi sono: .NET di Microsoft Java J2EE Altre tecnologie interessanti: Ad esempio quelle basate su python (zope) Altre soluzioni hanno una struttura pi semplice e non sono application server a tutti gli effetti (si parla di moduli di estensione del Web server comunque

interessanti per applicazioni Web a rapida prototipazione e basso costo):

PHP (molto diffuso e di semplice utilizzo) Le vecchie tecnologie ISAPI e ASP di Microsoft Quelle basate su linguaggio ruby (ruby on rails)
31

Altri aspetti: lo stato Lenciclopedia dei dinosauri unapplicazione

stateless

Il server e i programmi CGI non hanno necessit di tener traccia delle chiamate precedenti Linterazione tra un Client e un Server pu essere infatti di due tipi: Stateful: esiste lo stato dellinterazione e quindi lnesimo messaggio pu essere messo in relazione con gli n-1 precedenti Stateless: non si tiene traccia dello stato, ogni messaggio indipendente dagli altri

32

Interazione stateless In generale, uninterazione stateless possibile solo se protocollo applicativo progettato con operazioni idempotenti Operazioni idempotenti producono sempre lo stesso risultato, indipendentemente dal numero di messaggi M ricevuti dal Server stesso. Ad es. un server fornisce
sempre la stessa risposta a un messaggio M

Nel nostro caso tutte e 4 le operazioni gestite dallenciclopedia (indice, alfabetico, scheda e cerca) sono idempotenti. In generale, molto spesso abbiamo a che fare con operazioni idempotenti nelle applicazioni Web Esempi di operazioni non-idempotenti?

33

Interazione stateful Non tutte le applicazioni possono fare a meno dello stato
Esempio banale: se prevista unautenticazione diventa necessario tener traccia fra una chiamata e laltra del fatto che lutente si autenticato e quindi nasce lesigenza di avere uno stato

In generale, tutte le volte in cui abbiamo bisogno di personalizzazione delle richieste Web, possiamo beneficiare di interazione stateful
Ad es. se estendiamo la nostra applicazione per consentire a utenti autorizzati di modificare le schede dei dinosauri via Web o

se vogliamo fornire pagine iniziali di accesso differenziate sull base di storia precedente o livello di expertise utente, anche la

nostra applicazione cessa di essere stateless

34

Diversi tipi di stato Parlando di applicazioni Web possibile classificare lo stato in modo pi preciso: Stato di esecuzione (insieme dei dati parziali per una elaborazione): rappresenta un avanzamento in una esecuzione; per sua natura uno stato volatile; pu essere mantenuto in memoria lato server come stato di uno o pi oggetti Stato di sessione (insieme dei dati che caratterizzano una interazione con uno specifico utente): la sessione viene gestita di solito in modo unificato attraverso luso di istanze di oggetti specifici (supporto a oggetti sessione) Stato informativo persistente (ad esempio gli ordini inseriti da un sistema di eCommerce): viene normalmente mantenuto in una struttura persistente come un database
35

Il concetto di sessione La sessione rappresenta lo stato associato ad una sequenza di pagine visualizzate da un utente: Contiene tutte le informazioni necessarie durante lesecuzione Informazioni di sistema: IP di provenienza, lista delle pagine visualizzate, ... Informazioni di natura applicativa: nome e cognome, username, quanti e quali prodotti ha inserito nel carrello per un acquisto, Lo scope di sessione dato da: Tempo di vita della interazione utente (lifespan) Accessibilit: usualmente concesso alla richiesta corrente e a tutte le richieste successive provenienti dallo stesso processo browser
36

Il concetto di conversazione La conversazione rappresenta una sequenza di pagine di senso compiuto (ad esempio linsieme delle pagine necessarie per comperare un prodotto) univocamente definita dallinsieme delle pagine che la compongono e dallinsieme delle interfacce di input/output per la comunicazione tra le pagine (flusso della conversazione)

37

Esempio di conversazione: acquisto online


1. Lutente inserisce username e password: inizio della conversazione Server riceve i dati e li verifica con i dati presenti nel DB dei registrati: viene creata la sessione 2. Lutente sfoglia il catalogo alla ricerca di un prodotto Server lo riconosce attraverso i dati di sessione 3. Lutente trova il prodotto e lo mette nel carrello Sessione viene aggiornata con informazioni del prodotto 4. Lutente compila i dati di consegna 5. Lutente provvede al pagamento, fine della conversazione di acquisto Lordine viene salvato nel DB (stato persistente) La sessione ancora attiva e lutente pu fare un altro acquisto o uscire dal sito
38

Tecniche per gestire lo stato Lo stato della conversazione deve presentare i seguenti requisiti: Deve essere condiviso da Client e Server associato a una o pi conversazioni effettuate da un singolo utente Ogni utente possiede il suo singolo stato Ci sono due tecniche di base per gestire lo stato: Utilizzo della struttura dei cookie Gestione di uno stato sul server per ogni utente

collegato (sessione)

La gestione della sessione uno dei servizi messi a disposizione da un application server

39

Applicazioni multilivello Sviluppare applicazioni secondo una logica ad oggetti e/o a componenti significa scomporre lapplicazione in blocchi, servizi e funzioni molto utile separare logicamente le funzioni necessarie in una struttura multilivello (multi-tier) al fine di fornire astrazioni via via pi complesse e potenti a partire da funzionalit pi elementari Nel tempo si affermata una classificazione indipendente dalla implementazione tecnologica,

basata su una struttura a 4 livelli principali

Questa struttura non fornisce dettagli implementativi, non specifica quali moduli debbano essere implementati client-side o server-side, n nessuna altra specifica tecnica: una architettura essenzialmente logico-funzionale
40

Schema di struttura multilivello


Presentation
Livello di presentazione si occupa della visualizzazione dei risultati generati secondo il percorso definito nel flusso sottostante

Business Flows
A questo livello vengono implementati i flussi delle diverse conversazioni che interagiscono per comporre una applicazione

Business Logic

La logica di business contiene le caratteristiche delle applicazioni e dipende sia dal modello dei dati che, ancora pi rilevante, dalle logiche di utilizzo degli stessi

Services

Servizi devono fornire tutte le funzionalit base (API) necessarie per limplementazione rapida ed efficace della logica di business, dalla gestione della concorrenza al supporto alle transazioni, dallinterfacciamento ai db al monitoraggio/controllo/gestione delle performance

41

Servizi
I servizi realizzano le funzioni di base per sviluppo di applicazioni:

Accesso e gestione risorse


Sistemi di naming Sistemi di messaging e gestione code (queue) Sistemi di monitoring e management Sistemi legacy (termine generico che identifica applicazioni esterne per la gestione aziendale OS390, AS400, UNIX systems, ) Stampanti, sistemi fax, sms, e-mail, dispositivi specifici, macchine automatiche,

Gestione transazioni Gestione sicurezza Accesso e gestione delle sorgenti dati


Database locali Sistemi informativi remoti
42

Business logic linsieme di tutte le funzioni offerte dallapplicazione Si appoggia sui servizi per implementare i diversi algoritmi di risoluzione e provvedere alla generazione dei dati di output Esempi di moduli di business logic possono essere: Gestione delle liste di utenti Gestione cataloghi online A questo livello: non significativo quali siano le sorgenti di dati (gestite dal livello dei servizi) non significativo come arrivino le richieste di esecuzione dei servizi e come vengano gestiti i risultati ai livelli superiori Cos modellata, business logic presenta un elevato grado di riuso
43

Business flow Una conversazione realizzata da un insieme di pagine collegate in un flusso di successive chiamate Il business flow raccoglie linsieme delle chiamate necessarie per realizzare una conversazione Ogni chiamata deve: Caricare i parametri in ingresso Chiamare le funzioni di business logic necessarie per effettuare lelaborazione Generare loutput che dovr essere visualizzato Un flusso identifica quindi univocamente una conversazione Lastrazione fornita dal livello della business logic permette di definire lesecuzione delle singole pagine in modo indipendente dalla struttura dei dati e degli algoritmi sottostanti
44

Presentazione
Come abbiamo gi detto,

business flow in grado di fornire i dati di output necessari Il livello di presentazione ha il compito di interpretare questi dati e generare linterfaccia grafica per la visualizzazione dei contenuti (rendering) Questi due livelli sono concettualmente divisi poich la generazione dei dati logicamente separata dalla sua rappresentazione e formattazione Questo permette di avere facilmente diverse modalit/tipologie di presentazione degli stessi dati,
per esempio una rappresentazione in italiano ed una in inglese, o una in HTML ed una in XML

45

Strutture semplificate Non tutte le tecnologie permettono di rispettare questa suddivisione In molti casi i sistemi vengono realizzati a 2 o 3 livelli Queste semplificazioni portano in certi casi a miglioramenti nelle performance e nella rapidit di sviluppo, ma comportano una netta riduzione della leggibilit e della manutenibilit Come sempre il compromesso viene deciso in base al contesto: non esiste soluzione ideale per ogni situazione, set di requisiti applicativi, vincoli di deployment, costi, ... Esempio di semplificazione a 2 livelli:
Presentation Business Logic Business Flows Services
46

Architettura frequente nei sistemi Web Architettura a 3 livelli, che pu collassare a due in assenza di application server (sempre pi raro al giorno doggi)
Web Server Web Server

Application Server Application Server

DataBase Server DataBase Server

47

Distribuzione dei servizi La struttura a 3 livelli rispecchia i 3 principali servizi che realizzano un sistema Web Questi 3 servizi possono risiedere sullo stesso HW oppure essere divisi su macchine separate (distribuzione verticale dellarchitettura) Non necessita di nessun accorgimento specifico Viene realizzata essenzialmente per motivi di performance, soprattutto quando si il livello applicativo da quello database Non prevede replicazione, non quindi utile per risolvere problemi di fault tolerance

48

Distribuzione dei servizi Orizzontalmente ad ogni livello possibile replicare il servizio su diverse macchine Si parla in questo caso di distribuzione orizzontale Necessit di importanti accorgimenti strettamente dipendenti dalla tecnologia duso Quali vi vengono in mente? Essendo una distribuzione per replicazione possibile implementare politiche per la gestione della fault tolerance e anche del bilanciamento di carico a fine di maggiori performance

49

Distribuzione verticale e orizzontale

Distribuzione Verticale

Distribuzione Orizzontale

50

Replicazione: database Il database server (normalmente) un server stateful. Perch? Con quali problemi conseguenti? La replicazione molto delicata perch deve mantenere il principio di atomicit delle transazioni I database commerciali, come Oracle e Microsoft SQL Server prevedono delle configurazioni di clustering
(forse, lo vedrete meglio allinterno del corso di Sistemi Distribuiti M) in grado di gestire in modo trasparente un numero

variabile di CPU e macchine distinte Sistemi RAID (Redundant Array of Independent Disks) per i dati

51

Replicazione: applicazione Lunico stato necessario a livello applicativo la sessione Pu accadere per che application server utilizzi oggetti o componenti con stato per motivi di performance (cache) o altre necessit specifiche Alcuni framework disponibili sul mercato permettono la replicazione attraverso tecniche di clustering molto Altri framework non sono in grado di replicare orizzontalmente Se si mantiene lo stato concentrato allinterno della sessione e la sessione viene gestita attraverso i cookie, possibile realizzare un framework applicativo completamente stateless, ottenendo cos realizzazione pi semplice e primitiva di configurazione completam. replicabile orizzontalm.
52

simili a quelle dei sistemi database

Replicazione: Web server Web server stateless per la natura del protocollo HTTP; per questo, molto facile da replicare Lunicit degli URL pu essere gestita attraverso diverse soluzioni sia hardware che software Si possono applicare politiche di load balancing con diverse euristiche usando dispositivi appositi

Load balancer

53

Servlet

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 3.02.Servlet.pdf Versione elettronica: 3.02.Servlet-2p.pdf
1

Larchitettura Java J2EE


Ne riparleremo in modo ampio e pi dettagliato nella seconda parte del corso Modello a Componente-Container Architetture multi-tier Servizi ad alta scalabilit per applicazioni distribuite enterprise, anche Web-based

Web Client I Web Client hanno sostituito, in molte situazioni, i pi tradizionali fat client sono spesso costituiti dal semplice browser Web senza bisogno di alcuna installazione ad hoc comunicano via HTTP e HTTPS con il server (come sapete, browser , tra le altre cose, un client HTTP) effettuano il rendering della pagina in HTML (o altre tecnologie mark-up come, ad es. XML e XSL) possono essere sviluppati utilizzando varie tecnologie (tra cui J2EE) sono spesso implementati come parti di

architetture multi-tier

J2EE Web Application e Web Container Una Web Application un gruppo di risorse serverside che nel loro insieme creano una applicazione interattiva fruibile via Web Le risorse server-side includono: Classi server-side (Servlet e classi standard Java) Java Server Pages (le vedremo in seguito) Risorse statiche (documenti HTML, immagini, css,
javascript, ...)

Applet e/o altri componenti attivi client-side Informazioni di configurazione e deployment I Web Container forniscono un ambiente di esecuzione per Web Application In generale, Container garantiscono servizi di base alle applicazioni sviluppate secondo un paradigma a componenti
4

Accesso ad una Web Application Laccesso a Web Application un processo multi-step:

J2EE Server che fa da Web Container


HTTP

1: richiesta GET o POST 2: mappatura della URL su una Web App

Web Application

Web
4: ritorno della risposta al client 3: elaborazione richiesta & generazione risposta

Che cos una Servlet (vi ricordate CGI?) Una Servlet una classe Java che fornisce risposte a richieste HTTP In termini pi generali una classe che fornisce un servizio comunicando con il client mediante protocolli di tipo request/response: tra questi protocolli il pi noto e diffuso HTTP Le Servlet estendono le funzionalit di un Web server

generando contenuti dinamici

Eseguono direttamente in un Web Container In termini pratici sono classi che derivano dalla classe HttpServlet HttpServlet implementa vari metodi che possiamo ridefinire
6

Esempio di Servlet: Hello World! Ridefiniamo doGet() e implementiamo la logica di risposta a HTTP GET Produciamo in output un testo HTML che costituisce la pagina restituita dal server HTTP:
... public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<title>Hello World!</title>"); } ... }
7

Gerarchia delle Servlet Le servlet sono classi Java che elaborano richieste seguendo un protocollo condiviso Le servlet HTTP sono il tipo pi comune di servlet e possono processare richieste HTTP, producendo response HTTP Abbiamo quindi la catena di ereditariet mostrata a lato Nel seguito ragioneremo sempre e solo su servlet HTTP Le classi che ci interessano sono contenute nel package javax.servlet.http.*
8

Il modello request-response Allarrivo di una richiesta HTTP il Servlet Container crea un oggetto request e un oggetto response e li passa alla servlet:
Servlet Container
Request HTTP

Request WebServer Servlet

Browser

Response

Response

Request e Response Gli oggetti di tipo Request rappresentano la chiamata al server effettuata dal client Sono caratterizzate da varie informazioni Chi ha effettuato la Request Quali parametri sono stati passati nella Request Quali header sono stati passati Gli oggetti di tipo Response rappresentano le informazioni restituite al client in risposta ad una Request Dati in forma testuale (es. html, text) o binaria (es. immagini) HTTP header, cookie,

10

Classi e interfacce per Servlet


Servlet

interface ServletRequest GenericServlet +init() +destroy() +service() interface HttpServletRequest HttpServlet +init() +destroy() +service() +doGet() +doPost() +...()

interface ServletResponse

interface HttpServletResponse

interface ServletContext

interface HttpSession

11

Il ciclo di vita delle Servlet Servlet container controlla e supporta automaticamente il ciclo di vita di una servlet Se non esiste una istanza della servlet nel container Carica la classe della servlet Crea una istanza della servlet Inizializza la servlet (invoca il metodo init()) Poi, a regime: Invoca la servlet (doGet() o doPost() a seconda del tipo di richiesta ricevuta) passando come parametri due oggetti di tipo HttpServletRequest e HttpServletResponse Quale modello di concorrenza? Con quali pericoli?

Quanti thread sono associati ad una istanza di servlet?

12

Servlet e multithreading
Modello normale: un thread assegnato ad ogni richiesta http per servlet, anche se richieste per quella servlet sono gi in esecuzione
Nella modalit normale pi thread condividono la stessa istanza di una servlet e quindi si crea una situazione di concorrenza Il metodo init() della servlet viene chiamato una sola volta quando la servlet caricata dal Web container I metodi service() e destroy() possono essere chiamati solo dopo il completamento dellesecuzione di init() Il metodo service() (e quindi doGet() e doPost()) pu essere invocato da numerosi client in modo concorrente ed quindi necessario gestire le sezioni critiche: Uso di blocchi synchronized Semafori Mutex

13

Modello single-threaded Alternativamente si pu indicare al container di creare unistanza della servlet per ogni richiesta concorrente Questa modalit prende il nome di Single-Threaded Model onerosa in termine di risorse ed deprecata nelle specifiche 2.4 delle servlet Se un servlet vuole operare in modo single-threaded deve implementare linterfaccia marker SingleThreadModel Altri esempi di interfacce marker in Java? Serializable

14

Metodi per il controllo del ciclo di vita init(): viene chiamato una sola volta al caricamento della servlet In questo metodo si pu inizializzare listanza: ad esempio si crea la connessione con un database service(): viene chiamato ad ogni HTTP Request Chiama doGet() o doPost() a seconda del tipo di HTTP Request ricevuta destroy(): viene chiamato una sola volta quando la servlet deve essere disattivata (es. quando rimossa) Tipicamente serve per rilasciare le risorse acquisite (es. connessione a db)

15

Metodi per il controllo del ciclo di vita I metodi init(), destroy() e service() sono definiti nella classe astratta GenericServlet service() un metodo astratto HTTPServlet fornisce una implementazione di service() che delega lelaborazione della richiesta ai metodi: doGet() doPost() doPut() doDelete()
GenericServlet +init() +destroy() +service()

16

Anatomia di Hello World Usiamo lesempio Hello World per affrontare i vari aspetti della realizzazione di una servlet Importiamo i package necessari Definiamo la classe HelloServlet che discende da HttpServlet Ridefiniamo il metodo doGet()
import java.io.* import javax.servlet.* import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) ... }
17

Hello World - doGet


Dobbiamo tener conto che in doGet() possono essere sollevate eccezioni di due tipi: quelle specifiche delle Servlet quelle legate allinput/output Decidiamo di non gestirle per semplicit e quindi ricorriamo alla clausola throws In questo semplice esempio, non ci servono informazioni sulla richiesta e quindi non usiamo il parametro request Dobbiamo semplicemente costruire la risposta e quindi usiamo il solo parametro response
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... }
18

Loggetto response Contiene i dati restituiti dalla Servlet al Client: Status line (status code, status phrase) Header della risposta HTTP Response body: il contenuto (ad es. pagina HTML) Ha come tipo linterfaccia HttpResponse che espone metodi per: Specificare lo status code della risposta HTTP Indicare il content type (tipicamente text/html) Ottenere un output stream in cui scrivere il contenuto da restituire Indicare se loutput bufferizzato Gestire i cookie
19

Il formato della risposta HTTP

status line status line (protocollo, status (protocollo, status code, status code, status phrase) phrase)

Header Header

HTTP/1.1 200 OK Connection: close Date: Thu, 06 Aug 1998 12:00:15 GMT Server: Apache/1.3.0 (Unix) Last-Modified: Mon, 22 Jun 1998 ... Content-Length: 6821 Content-Type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html>...</html

Contenuto: per Contenuto: per esempio la pagina esempio la pagina HTML richiesta HTML richiesta

20

Gestione dello status code Per definire lo status code HttpServletResponse fornisce il metodo public void setStatus(int statusCode) Esempi di status Code 200 OK 404 Page not found Per inviare errori possiamo anche usare:
public void sendError(int sc) public void sendError(int code, String message)

21

Gestione degli header HTTP


public void setHeader(String headerName, String headerValue) imposta un header arbitrario public void setDateHeader(String name, long millisecs) imposta la data public void setIntHeader(String name, int headerValue) imposta un header con un valore intero (evita la conversione intero-stringa) addHeader, addDateHeader, addIntHeader aggiungono una nuova occorrenza di un dato header setContentType configura il content-type (si usa sempre) setContentLength utile per la gestione di connessioni persistenti addCookie consente di gestire i cookie nella risposta sendRedirect imposta location header e cambia lo status code in modo da forzare una ridirezione
22

Gestione del contenuto Per definire il response body possiamo operare in due modi utilizzando due metodi di response public PrintWriter getWriter: restituisce uno stream di caratteri (unistanza di PrintWriter) utile per restituire un testo (tipicamente HTML) public ServletOutputStream getOuputStream(): restituisce uno stream di byte (unistanza di ServletOutputStream) pi utile per restituire un contenuto binario (per esempio un immagine)

23

Implementazione di doGet() Abbiamo tutti gli elementi per implementare correttamente il metodo doGet() di HelloServlet:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>") out.println("<head><title>Hello</title></head>"); out.println("<body>Hello World!</body>"); out.println("</html>"); } HTTP/1.1 200 OK
Risposta generata

Content-Type: text/html <html> <head><title>Hello</title></head>" <body>Hello World!</body> </html>"


24

Rendiamo Hello World un poco pi dinamica Proviamo a complicare leggermente il nostro esempio, avvicinandoci a un esempio di utilit realistica La servlet non restituisce pi un testo fisso ma una

pagina in cui un elemento variabile

Anzich scrivere Hello World scriver Hello pi un nome passato come parametro Ricordiamo che in un URL (e quindi in una GET possiamo inserire una query string che ci permette di passare parametri con la sintassi:
<path>?<nome1>=<valore1>&<nome2>=<valore2>&...

Per ricavare il parametro utilizzeremo il parametro request passato a doGet() Analizziamo quindi le caratteristiche di HttpServletRequest
25

request request contiene i dati inviati dal client HTTP al server Viene creata dal servlet container e passata alla servlet come parametro ai metodi doGet() e doPost() unistanza di una classe che implementa linterfaccia HttpServletRequest Fornisce metodi per accedere a varie informazioni HTTP Request URL HTTP Request header Tipo di autenticazione e informazioni su utente Cookie Session (lo vedremo nel dettaglio in seguito)

26

Struttura di una richiesta HTTP

Request line Request line contiene i icomandi contiene comandi (GET, POST), (GET, POST), lURL eela versione lURL la versione di protocollo di protocollo

Header Header lines lines

GET /search?q=Introduction+to+XML HTTP/1.1 Host: www.google.com User-Agent: Mozilla/5.0 Accept: text/html, image/gif Accept-Language: en-us, en Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8 Keep-Alive: 300 Connection: keep-alive Referer: http://www.google.com/

27

Request URL Una URL HTTP ha la sintassi


http://[host]:[port]/[request path]?[query string]

La request path composta dal contesto e dal nome della Web application La query string composta da un insieme di parametri che sono forniti dallutente Non solo da compilazione form; pu apparire in una pagina Web in un anchor:
<a href=/bkstore1/catg?Add=101>Add To Cart</a>

Il metodo getParameter() di request ci permette di accedere ai vari parametri Ad esempio se scriviamo:


String bookId = request.getParameter("Add);

bookID varr "101"


28

Metodi per accedere allURL String getParameter(String parName)restituisce il valore di un parametro individuato per nome String getContextPath() restituisce informazioni sulla parte dellURL che indica il contesto della Web application String getQueryString() restituisce la stringa di query String getPathInfo() per ottenere il path String getPathTranslated() per ottenere informazioni sul path nella forma risolta

29

Metodi per accedere agli header String getHeader(String name) restituisce il valore di un header individuato per nome sotto forma di stringa Enumeration getHeaders(String name) restituisce tutti i valori dellheader individuato da name sotto forma di enumerazione di stringhe (utile ad esempio per Accept che ammette n valori) Enumeration getHeaderNames() elenco dei nomi di tutti gli header presenti nella richiesta int getIntHeader(name) valore di un header convertito in intero long getDateHeader(name) valore della parte Date di header, convertito in long
30

Autenticazione, sicurezza e cookie String getRemoteUser() nome di user se la servlet ha accesso autenticato, null altrimenti String getAuthType() nome dello schema di autenticazione usato per proteggere la servlet boolean isUserInRole(java.lang.String role) restituisce true se lutente associato al ruolo specificato Cookie[] getCookies() restituisce un array di oggetti cookie che il client ha inviato alla request

31

Il metodo doGet() con request


http://.../HelloServlet?to=Mario

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String toName = request.getParameter("to"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>") out.println("<head><title>Hello to</title></head>"); out.println("<body>Hello to "+toName+"!</body>"); out.println("</html>"); HTTP/1.1 200 OK }
Content-Type: text/html <html> <head><title>Hello</title></head>" <body>Hello to Mario!</body> </html>"
32

Esempio di doPost(): gestione dei form I form dichiarano i campi utilizzando lattributo name Quando il form viene inviato al server, il nome dei campi e i loro valori sono inclusi nella request: agganciati alla URL come query string (GET) inseriti nel body del pacchetto HTTP (POST)
<form action="myServlet" method="post"> First name: <input type="text" name="firstname/><br/> Last name: <input type="text" name=lastname/> </form> public class MyServlet extends HttpServlet { public void doPost(HttpServletRequest rq, HttpServletResponse rs) { String firstname = rq.getParameter(firstname)); String lastname = rq.getParameter(lastname)); } }
33

Altri aspetti di request HttpRequest espone anche il metodo InputStream getInputStream(); Consente di leggere il body della richiesta (ad esempio il dati di post)
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); InputStream is = request.getInputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(is)); out.println("<html>\n<body>"); out.println(Contenuto del body del pacchetto: "; while ((String line = in.readLine()) != null) out.println(line) out.println("</body>\n</html>"); }

34

Ridefinizione di service() Se non viene ridefinito, il metodo service effettua il dispatch delle richieste ai metodi doGet, doPost, a seconda del metodo HTTP usato nella request Ad es. se si vuole trattare in modo uniforme get e post, si pu ridefinire il metodo service facendogli elaborare direttamente la richiesta:
public void service(HttpServletRequest req, HttpServletResponse res) { int reqId = Integer.parseInt(req.getParameter("reqID"); switch(reqId) { case 1: handleReq1(req, res); break; case 2: handleReq2(req, res); break; default : handleReqUnknown(req, res); } }
35

Deployment Prima di proseguire con lesame delle varie caratteristiche delle servlet vediamo come fare per far funzionare il nostro esempio Unapplicazione Web deve essere installata e questo processo prende il nome di deployment Il deployment comprende: La definizione del runtime environment di una Web Application La mappatura delle URL sulle servlet La definizione delle impostazioni di default di unapplicazione, ad es. welcome page e pagine di errore La configurazione delle caratteristiche di sicurezza dellapplicazione
36

Web Archives Gli Archivi Web (Web Archives) sono file con estensione .war. Rappresentano la modalit con cui avviene la distribuzione/deployment delle applicazioni Web Sono file jar con una struttura particolare Per crearli si usa il comando jar:
jar {ctxu} [vf] [jarFile] files
-ctxu: create, get the table of content, extract, update content -v: verbose -f: il JAR file sar specificato con jarFile option -jarFile: nome del JAR file -files: lista separata da spazi dei file da includere nel JAR

Esempio

jar cvf newArchive.war myWebApp\)


37

Struttura interna del war La struttura di directory delle Web Application basata sulle Servlet 2.4 specification
MyWebApplication META-INF WEB-INF classes lib web.xml Root della Web Application Informazioni per i tool che generano archivi (manifest) File privati (config) che non saranno serviti ai client Classi server side: servlet e classi Java std Archivi .jar usati dalla Web app Web Application deployment descriptor

web.xml in sostanza un file di configurazione (in formato XML) che contiene una serie di elementi descrittivi Contiene lelenco delle servlet e per ognuna di loro permette di definire una serie di parametri come coppie nome-valore
38

Il descrittore di deployment web.xml in sostanza un file di configurazione (in formato XML) che descrive la struttura dellapplicazione Web Contiene lelenco delle servlet e per ogni servlet permette di definire nome classe Java corrispondente una serie di parametri di configurazione (coppie nome-valore, valori di inizializzazione) Contiene anche la mappatura fra URL e servlet che compongono lapplicazione

39

Mappatura servlet-URL Esempio di descrittore con mappatura:


<web-app> <servlet> <servlet-name>myServlet</servlet-name> <servlet-class>myPackage.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myURL</url-pattern> </servlet-mapping> </web-app>

Esempio di URL che viene mappato su myServlet:


http://MyHost:8080/MyWebApplication/myURL

40

Servlet configuration Una servlet accede ai propri parametri di configurazione mediante linterfaccia ServletConfig Ci sono 2 modi per accedere a oggetti di questo tipo: Il parametro di tipo ServletConfig passato al metodo init() il metodo getServletConfig()della servlet, che pu essere invocato in qualunque momento ServletConfig espone un metodo per ottenere il valore di un parametro in base al nome: String getInitParameter(String parName)
Esempio di parametro di configurazione

<init-param> <param-name>parName</param-name> <param-value>parValue</param-value> </init-param>

41

Esempio di parametri di configurazione Estendiamo il nostro esempio rendendo parametrico il titolo della pagina HTML e la frase di saluto:
<web-app> <servlet> <servlet-name>HelloServ</servlet-name> <servlet-class>HelloServlet</servlet-class> <init-param> <param-name>title</param-name> <param-value>Hello page</param-value> </init-param> <init-param> <param-name>greeting</param-name> <param-value>Ciao</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>HelloServ</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
42

HelloServlet parametrico Ridefiniamo quindi anche il metodo init(): memorizziamo i valori dei parametri in due attributi
import java.io.* import java.servlet.* import javax.servlet.http.*; public class HelloServlet extends HttpServlet { private String title, greeting; public void init(ServletConfig config) throws ServletException { super.init(config); title = config.getInitParameter("title"); greeting = config.getInitParameter("greeting"); } ...
43

Il metodo doGet() con parametri


http://.../hello?to=Mario
Notare leffetto della mappatura tra lURL hello e il servlet

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String toName = request.getParameter("to"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>+title+</title></head>"); out.println("<body>+greeting+ "+toName+"!</body>"); out.println("</html>"); }
HTTP/1.1 200 OK Content-Type: text/html <html> <head><title>Hello page</title></head>" <body>Ciao Mario!</body> </html>"
44

Servlet context Ogni Web application esegue in un contesto: corrispondenza 1-1 tra una Web-app e suo contesto Linterfaccia ServletContext la vista della Web application (del suo contesto) da parte della servlet Si pu ottenere unistanza di tipo ServletContext allinterno della servlet utlizzando il metodo getServletContext() Consente di accedere ai parametri di inizializzazione e agli attributi del contesto Consente di accedere alle risorse statiche della Web application (es. immagini) mediante il metodo getResourceAsStream(String path) Il contesto viene condiviso tra tutti gli utenti, le richieste e le servlet della Web application
45

Parametri di inizializzazione del contesto Parametri di inizializzazione del contesto definiti allinterno di elementi di tipo context-param in web.xml
<web-app> <context-param> <param-name>feedback</param-name> <param-value>feedback@deis.unibo.it</param-value> </context-param> ... </ web-app >

Sono accessibili a tutte le servlet della Web application


ServletContext ctx = getServletContext(); String feedback = ctx.getInitParameter(feedback);
46

Attributi di contesto Gli attributi di contesto sono accessibili a tutte le servlet e funzionano come variabili globali Vengono gestiti a runtime: possono essere creati, scritti e letti dalle servlet Possono contenere oggetti anche complessi (serializzazione/deserializzazione)
scrittura

ServletContext ctx = getServletContext(); ctx.setAttribute(utente1, new User(Giorgio Bianchi)); ctx.setAttribute(utente2, new User(Paolo Rossi)); ServletContext ctx = getServletContext(); Enumeration aNames = ctx.getAttributeNames(); while (aNames.hasMoreElements) { String aName = (String)aNames.nextElement(); User user = (User) ctx.getAttribute(aName); ctx.removeAttribute(aName); }
47

lettura

Gestione dello stato


Come abbiamo gi detto pi volte,

stateless: non fornisce in modo nativo meccanismi per


il mantenimento dello stato tra diverse richieste provenienti dallo stesso client

HTTP un protocollo

state definite due tecniche per mantenere traccia delle informazioni di stato uso dei cookie: meccanismo di basso livello uso della sessione (session tracking): meccanismo di alto livello La sessione rappresenta unutile astrazione ed essa stessa pu far ricorso a due tecniche di implementazione: Cookie URL rewriting

Applicazioni Web hanno spesso bisogno di stato. Sono

48

Cookie Il cookie ununit di informazione che Web server deposita sul browser, cio sul client Pu contenere valori che sono propri del dominio funzionale dellapplicazione (in genere informazioni associate allutente) Sono parte dellheader HTTP, trasferiti in formato testuale Vengono mandati avanti e indietro nelle richieste e nelle risposte Vengono memorizzati dal browser (client maintained state) Attenzione per: possono essere rifiutati dal browser (tipicamente perch disabilitati) sono spesso considerati un fattore di rischio
49

La classe cookie Un cookie contiene un certo numero di informazioni, tra cui: una coppia nome/valore il dominio Internet dellapplicazione che ne fa uso path dellapplicazione una expiration date espressa in secondi (-1 indica che il cookie non sar memorizzato su file associato) un valore booleano per definirne il livello di sicurezza La classe Cookie modella il cookie HTTP Si recuperano i cookie dalla request utilizzando il metodo getCookies() Si aggiungono cookie alla response utilizzando il metodo addCookie()
50

Esempi di uso di cookie Con il metodo setSecure(true) il client viene forzato ad utilizzare un protocollo sicuro (HTTPS)
creazione

Cookie c = new Cookie(MyCookie, test); c.setSecure(true); c.setMaxAge(-1); c.setPath(/); response.addCookie(c); Cookie[] cookies = request.getCookies(); if(cookies != null) { for(int j=0; j<cookies.length(); j++) { Cookie c = cookies[j]; out.println(Un cookie: + c.getName()+=+c.getValue()); } }
51

lettura

Uso della sessione La sessione Web unentit gestita dal Web container condivisa fra tutte le richieste provenienti dallo stesso client: consente di mantenere, quindi, informazioni di stato Pu contenere dati di varia natura ed identificata in modo univoco da un session ID Viene usata dai componenti di una Web application per mantenere lo stato del client durante le molteplici interazioni dellutente con la Web application
Servlet A

Client-1 Client-2

Servlet B Servlet C Servlet D

Client-1 Session Client-2 Session


52

Accesso alla sessione Laccesso avviene mediante linterfaccia HttpSession Per ottenere un riferimento ad un oggetto di tipo HttpSession si usa il metodo getSession() dellinterfaccia HttpServletRequest
public HttpSession getSession(boolean createNew);

Valori di createNew: true: ritorna la sessione esistente o, se non esiste, ne crea una nuova false: ritorna, se possibile, la sessione esistente, altrimenti ritorna null Uso del metodo in una servlet:
HttpSession session = request.getSession(true);

53

Gestione del contenuto di una sessione Si possono memorizzare dati specifici dellutente negli attributi della sessione (coppie nome/valore) Sono simili agli attributi del contesto e consentono di memorizzare e recuperare oggetti
Cart sc = (Cart)session.getAttribute(shoppingCart); sc.addItem(item); session.setAttribute(shoppingCart, new Cart()); session.removeAttribute(shoppingCart); Enumeration e = session.getAttributeNames(); while(e.hasMoreElements()) out.println(Key; + (String)e.nextElements());

54

Altre operazioni con le sessioni String getID() restituisce lID di una sessione boolean isNew() dice se la sessione nuova void invalidate() permette di invalidare (distruggere) una sessione long getCreationTime() dice da quanto tempo attiva la sessione (in millisecondi) long getLastAccessedTime () d informazioni su quando stata utilizzata lultima volta
String sessionID = session.getId(); if(session.isNew()) out.println(La sessione e nuova); session.invalidate(); out.println(Millisec: + session.getCreationTime()); out.println(session.getLastAccessedTime());

55

Session ID e URL Rewriting Il session ID usato per identificare le richieste provenienti dallo stesso utente e mapparle sulla corrispondente sessione Una tecnica per trasmettere lID quella di includerlo in un cookie (session cookie): sappiamo per che non sempre i cookie sono attivati nel browser Unalternativa rappresentata dallinclusione del session ID nella URL: si parla di URL rewriting buona prassi codificare sempre le URL generate dalle servlet usando il metodo encodeURL() di HttpServletResponse Il metodo encodeURL() dovrebbe essere usato per: hyperlink (<a href=>) form (<form action=>)
56

Scoped objects Gli oggetti di tipo ServletContext, HttpSession, HttpServletRequest forniscono metodi per immagazzinare e ritrovare oggetti nei loro rispettivi ambiti (scope) Lo scope definito dal tempo di vita (lifespan) e dallaccessibilit da parte delle servlet
Ambito Request Interfaccia HttpServletRequest Tempo di vita Fino allinvio della risposta Lo stesso della sessione utente Lo stesso dellapplicazione Accessibilit Servlet corrente e ogni altra pagina inclusa o in forward Ogni richiesta dello stesso client Ogni richiesta alla stessa Web app anche da clienti diversi e per servlet diverse
57

Session Application

HttpSession ServletContext

Funzionalit degli scoped object Gli oggetti scoped forniscono i seguenti metodi per immagazzinare e ritrovare oggetti nel rispettivi ambiti (scope): void setAttribute(String name, Object o) Object getAttribute(String name) Void removeAttribute(String name) Enumeration getAttributeNames()

58

Inclusione di risorse Web Includere risorse Web (altre pagine, statiche o dinamiche) pu essere utile quando si vogliono aggiungere contenuti creati da unaltra risorsa (ad es. unaltra servlet) Inclusione di risorsa statica: includiamo unaltra pagina nella nostra (ad es. banner) Inclusione di risorsa dinamica: la servlet inoltra una request ad un componente Web che la elabora e restituisce il risultato Il risultato viene incluso nella pagina prodotta dalla servlet La risorsa inclusa pu lavorare con il response body (problemi comunque con lutilizzo di cookie)
59

Ridirezione del browser anche possibile inviare al browser una risposta che lo forza ad accedere ad unaltra pagina (ridirezione) Si usa uno dei codici di stato di HTTP: sono i codici che vanno da 300 a 399 e in particolare 301 Moved permanently: URL non valida, il server indica la nuova posizione Possiamo ottenere questo risultato in due modi, agendo sulloggetto response: Invocando il metodo
public void sendRedirect(String url)

Lavorando pi a basso livello con gli header:


response.setStatus(response.SC_MOVED_PERMANENTLY); response.setHeader("Location", "http://...");

60

Come si fa linclusione Per includere una risorsa si ricorre a un oggetto di tipo RequestDispatcher che pu essere richiesto al contesto indicando la risorsa da includere Si invoca quindi il metodo include passando come parametri request e response che vengono cos condivisi con la risorsa inclusa Se necessario, lURL originale pu essere salvato come un attributo di request

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/inServlet"); dispatcher.include(request, response);

61

Inoltro (forward) Si usa in situazioni in cui una servlet si occupa di parte dellelaborazione della richiesta e delega a qualcun altro la gestione della risposta

Attenzione perch in questo caso la risposta di competenza esclusiva della risorsa che riceve linoltro
Se nella prima servlet stato fatto un accesso a ServletOutputStream o PrintWriter si ottiene una IllegalStateException

62

Come si fa un forward Anche in questo caso si deve ottenere un oggetto di tipo RequestDispatcher da request passando come parametro il nome della risorsa Si invoca quindi il metodo forward passando anche in questo caso request e response Se necessario, lURL originale pu essere salvato come un attributo di request

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/inServlet"); dispatcher.forward(request, response);

63

Servizi del container Il container mette a disposizione delle servlet una serie di servizi JMS per gestire code di messaggi JNDI per accedere a servizi di naming JDBC per accedere ai database JTA per gestire transazioni Java Mail per inviare e ricevere messaggi di posta elettronica RMI per laccesso ad oggetti remoti Esaminiamo brevemente due di questi servizi: JNDI e JDBC (altri servizi, se vorrete, li vedrete allinterno del
corso di Sistemi Distribuiti M)

64

Servizi del container: JNDI JNDI una API Java standard per laccesso uniforme a servizi di naming Permette di accedere a qualsiasi servizio di naming: LDAP server DNS server File System RDBMS Ha una struttura ad albero (JNDI-tree) ed basata su coppie chiave-valore Permette di accedere ad oggetti identificati da nomi logici e consente di rendere facilmente configurabile unapplicazione Le classi JNDI sono contenute in javax.naming Il container mette a disposizione delle servlet un servizio JNDI
65

Parentesi su Naming, Discovery, Directory Ruolo cruciale del servizio di nomi in ogni sistema distribuito Vi ricordate, vero , che cosa si intende per: sistema di naming?
quali funzionalit? Esempi?

protocollo di discovery?
quali funzionalit? In quali scenari? Esempi?

sistema di directory?
quali funzionalit? Esempi? Quali differenze rispetto ai precedenti?

66

66

Naming Naming service mantiene un insieme di binding fra nomi e oggetti (o riferimenti a oggetti ad es. DNS) Java Naming & Directory Interface (JNDI) come interfaccia che supporta funzionalit comuni ai vari differenti sistemi di nomi

67

67

Naming JNDI come workable abstraction che permette di lavorare con servizi di nomi diversi nonostante loro differenze
Ad esempio, differenze in naming convention: in DNS, nomi come composizione di elementi separati da punti e letti da destra verso sinistra www.unibo.it in LDAP, situazione leggermente pi complessa. Nomi composti da elementi separati da virgole, letti da destra a sinistra, ma specificati come coppie nome/valore - "cn=Paolo Bellavista, o=UniBO, c=IT

JNDI risolve il problema delleterogeneit attraverso classe Name, le sue sottoclassi e classi helper Name come rappresentazione di un nome composto da una sequenza non ordinata di sequenze di subname
68
68

Discovery
Directory soluzioni di nomi globali servizi completi e complessi costo elevato delle operazioni

Discovery soluzioni di nomi locali

servizi essenziali e funzioni limitate

costo limitato adatto a variazioni rapide Directory per informazioni globali, come descrizione dispositivi, preferenze profili utente, firme digitali e PKI, sorgenti di informazioni, ... Discovery per informazioni locali, come descrizione risorse locali gestori presenti, ...
69
69

Discovery
Directory garantisce propriet di replicazione, sicurezza, gestione multiserver, ... Supporto per memorizzare le informazioni organizzate prevedendo molti accessi in lettura e poche variazioni

Invece protocolli di Discovery


Computazione distribuita e cooperativa in ambito di localit Una unit deve ritrovarne altre, in modo veloce ed economico Si prevedono azioni come broadcast locale e solleciti periodici
1 Richiesta Multica st 1 Richiesta Mul ticast

Jini Service

Rete Lo cale Jini Cl ient

2R

i sp o st

ad

el

Lo o ku

pS e rv

i ce

Lookup Service

s ta po R is 2

Lo del

ok u

e vic Se r p

70

70

Discovery
JINI (ma anche UPnP, SSDP, SLP, ) protocollo Java per discovery: si vuole rispondere alle esigenze di chi arriva in un contesto e vuole operare senza conoscenze predefinite Protocolli di lookup Il server pu passare (tramite lookup) al cliente: anche codice (che si pu eseguire localmente) riferimento al server (da interrogare in remoto - RMI) Start up con broadcast/multicast in ambiente locale Discovery server verifica presenza risorse a intervalli opportuni
1 Richiesta Multica st 1 Richiesta Mul ticast

Jini Service
2R i sp o st

Rete Lo cale Jini Cl ient


ad el
up o ok e vic Se r

Lo o ku

pS e rv

i ce

Lookup Service
2

s ta po R is

del

71

71

Directory
Directory service come strumento per gestire storage e
distribuzione di info condivise: da indirizzi email a numeri di telefono degli impiegati di unazienda, a indirizzi IP e propriet di stampanti di un dipartimento, da info di configurazione a un insieme di application server

72

72

Directory Directory come gestore di un insieme (directory) di record (entry), conformi a un determinato schema (directory schema), riferite a persone, luoghi, servizi, oggetti concreti o concetti astratti
Entry hanno attributi associati: attributi hanno nome/identificatore e uno o pi valori. Ad esempio, per un individuo:
Name: John Doe Address: 123 Somewhere Street Email: john@xyz.com Email: jdoe@abcd.com

Directory come semplici database specializzati, spesso con funzionalit di search&filter per ricerca avanzata Lightweight Directory Access Protocol (LDAP) come comune esempio di directory con funzionalit di naming+directory (implem. OpenLDAP)
73
73

Java Naming & Directory Interface (JNDI) Esistono molti servizi di naming: Registry RMI associazione fra nomi simbolici e
riferimenti a server remoti

Common Object Service (COS) naming naming


standard per applicazioni CORBA

Domain Name System (DNS) associazione fra indirizzi


simbolici e indirizzi IP fisici

Lightweight Directory Access Protocol (LDAP) naming


standard Internet per direttori risorse (persone, risorse di rete, )

Network Information System (NIS) naming di rete


proprietario di Sun Microsystems per accedere a file system di rete (ID e password di accesso)
74

74

Java Naming & Directory Interface (JNDI) Java Naming and Directory Interface (JNDI) come interfaccia per accedere in modo uniforme a servizi di naming differenti (gi esistenti!) API JNDI indipendente dal servizio di naming supportato

Att.ne: possibilit che una certa operazione NON sia supportata dal servizio di naming dinamicam. collegato a JNDI

75

75

JNDI Provider In JNDI i servizi di naming vengono acceduti attraverso plugin chiamati (name service) provider

Provider JNDI NON servizio di naming ma uninterfaccia


di connessione verso uno specifico servizio di naming esterno (in terminologia JNDI, cliente JNDI verso vero servizio di nomi esterno) Provider JNDI si occupa di supporto alla persistenza (binding salvati e nel caso ripristinati dopo un fault) e distribuzione su rete Essenzialmente, provider JNDI scelto configurando le propriet
java.naming.factory.initial java.naming.provider.url propriet initial propriet url com.sun.jndi.rmi.registry.RegistryContextFactory rmi://lia.deis.unibo.it:5599

76

76

Esempio di Lookup su Registro RMI


Vedremo in molti esempi che tipica operazione di lookup ha laspetto: import java.rmi.Naming; IntRemota obj = (IntRemota) Naming.lookup (//lia.deis.unibo.it:5599/ServerRemoto);

Invece utilizzando JNDI:


import javax.naming.*; Properties prop = new Properties(); prop.put(Context.INITIAL_CONTEXT_FACTORY, com.sun.jndi.rmi.registry.RegistryContextFactory); prop.put(Context.PROVIDER_URL, rmi://lia.deis.unibo.it:5599); Context cxt = new InitialContext(); IntRemota cxt.lookup(lia.deis.unibo.it:5599/ServerRemoto);

Context interfaccia che specifica Naming System, con metodi per aggiungere, cancellare, cercare, ridenominare, oggetti InitialContext unimplementazione di Context e rappresenta contesto di partenza per operazioni di naming
77
77

JNDI: Context
Ora scendiamo in qualche dettaglio pi preciso

Context e InitialContext
Classe Context svolge un ruolo centrale in JNDI. Context rappresenta insieme di binding allinterno di un servizio di nomi e che condividono stessa convenzione di naming. Oggetto Context per fare binding/unbinding di nomi a oggetti, per fare renaming e per elencare binding correnti Alcuni servizi di nomi supportano subcontext (context dentro un altro context, come cartella in direttorio) Tutte le operazioni di naming in JNDI sono svolte in relazione a un context. Si parte da una classe InitialContext, istanziata con propriet che definiscono tipo di servizio di nomi in uso (eventualm. ID e password)

78

78

JNDI: Context Interfaccia Context (vi ricordate RMI Naming?):


void bind(String stringName, Object object) nome non deve essere associato gi ad alcun oggetto void rebind(String stringName, Object object) Object lookup(String stringName) void unbind(String stringName) void rename(String stringOldName, String stringNewName) NamingEnumeration listBindings(String stringName): restituisce enumeration con nomi del context specificato, insieme a oggetti associati e loro classi In generale, anche per altre API: anche versione con Name object invece di String (classe Name per manipolare nomi in modo generico, senza conoscere lo specifico naming service in uso)

79

79

Esempio di utilizzo JNDI


Come connettersi a naming service, elencare tutti binding o uno specifico, usando filesystem come servizio di nomi import import import import import import javax.naming.Context; javax.naming.InitialContext; javax.naming.Binding; javax.naming.NamingEnumeration; javax.naming.NamingException; java.util.Hashtable;

public class Main { public static void main(String [] rgstring) { try { // Crea contesto iniziale. Environment specifica // quale JNDI provider utilizzare e a quale URL Hashtable hashtableEnvironment = new Hashtable(); hashtableEnvironment.put(Context.INITIAL_CONTEXT_ FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory);

80

80

Esempio di utilizzo JNDI


hashtableEnvironment.put(Context.PROVIDER_URL, rgstring[0]); Context context = new InitialContext(hashtableEnvironment); if (rgstring.length == 1) { NamingEnumeration namingenumeration = context.listBindings(""); while (namingenumeration.hasMore()) { Binding binding =(Binding)namingenumeration.next(); System.out.println(binding.getName() + " " + binding.getObject(); } } else { for (int i = 1; i < rgstring.length; i++) { Object object = context.lookup(rgstring[i]); System.out.println(rgstring[i] + " " + object); } } context.close(); } catch (NamingException namingexception) { namingexception.printStackTrace(); } } }

81

81

JDBC JDBC una API per accedere ai database in modo

uniforme

Garantisce accesso ai database in modo indipendente

dalla piattaforma I driver JDBC sono collezioni di classi Java che

implementano metodi definiti dalle specifiche JDBC I driver possono essere suddivisi in due categorie: 2-tier: client colloquiano direttamente con DB 3-tier: client comunicano con un middle-tier che accede al DB Le classi Java che realizzano funzionalit JDBC sono contenute nel package javax.SQL

82

Architettura JDBC
Java Application
JDBC API JDBC-ODBC Bridge (type 1) ODBC Driver JDBC-Native Bridge (type 2) Native API (C, C++) JDBC-Net Bridge (type 3) All Java JDBC Driver (type 4)

Network Server

RDBMS

83

Schema di uso di JDBC Accesso a DB con JDBC consiste nel: Caricare la classe del driver JDBC Ottenere una connessione dal driver Eseguire statement SQL Utilizzare risultati delle query
Class.forName("org.hsqldb.jdbcDriver"); Connection conn = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost:1701"); Statement stm = conn.createStatement(); ResultSet res = stm.executeQuery("SELECT * FROM MYTABLE"); while (res.next()) { String col1 = res.getString("MYCOL1"); int col2 = res.getInt("MYCOL2"); }

84

Connection pool Connection Pool sono oggetti, amministrati dallapplication server, preposti a gestire connessioni Sono configurabili attraverso opportuni file Il vantaggio principale nellutilizzo di Connection Pool risiede nel fatto che le connessioni sono esistenti eliminando quindi overhead dovuto alla creazione delle connessioni ad ogni richiesta Application server pu applicare un bilanciamento di carico alle applicazioni che usano DB, assegnando o rilasciando connessioni alle applicazioni in dipendenza dalle loro necessit (connection pooling) Il bilanciamento pu anche includere un incremento o riduzione del numero di connessioni nel pool al fine di adattarlo al cambiamento delle condizioni di carico
85

verso DB

quando lapplicazione necessita di connettersi a DB,

DataSource DataSource sono factory di connessioni verso sorgenti dati fisiche rappresentate da oggetti di tipo javax.sql.DataSource Oggetti di tipo DataSource vengono pubblicati su JNDI e vengono creati sulla base di una configurazione contenuta in un descrittore (es. web.xml) DataSource un wrapper di connection pool
Application Server JNDI 1-lookup 2-getConnection Java Application 3-Utilizzo della connessione come una normale JDBC connection DataSource Connection pool Connection

DB

86

Accesso a sorgente e connessione


Per accedere a DB via data source necessario fare lookup da JNDI e ottenere Connection dallistanza di tipo DataSource Il container fa in modo, automaticamente, che il contesto iniziale punti al servizio JNDI gestito dal container stesso

// Contesto iniziale JNDI Context initCtx = new InitialContext(); Context envCtx = (Context)initCtx.lookup("java:comp/env"); // Look up del data source DataSource ds = (DataSource)envCtx.lookup("jdbc/EmployeeDB"); //Si ottiene una connessione da utilizzare come una normale //connessione JDBC Connection conn = ds.getConnection(); ... uso della connessione come visto nellesempio JDBC ...
87

Definizione della risorsa Definizione della risorsa in /WEB-INF/web.xml


<resource-ref> <description> Riferimento JNDI ad un data source </description> <res-ref-name>jdbc/EmployeeDB</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref>

88

Java Server Pages

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 3.03.JSP.pdf Versione elettronica: 3.03.JSP-2p.pdf
1

Java Server Pages Le JSP sono uno dei due componenti di base della tecnologia J2EE, relativamente alla parte Web: template per la generazione di contenuto dinamico estendono HTML con codice Java custom Quando viene effettuata una richiesta ad una JSP: parte HTML viene direttamente trascritta sullo stream di output codice Java viene eseguito sul server per la generazione del contenuto HTML dinamico pagina HTML cos formata (parte statica + parte generata dinamicamente) viene restituita al client Sono assimilabili a linguaggio di script (avete visto, vero , altri esempi di linguaggi di script?): in realt vengono trasformate in servlet dal container
2

JspServlet Le richieste verso JSP sono gestite da una particolare servlet (in Tomcat si chiama JspServlet) che effettua le seguenti operazioni: traduzione della JSP in una servlet compilazione della servlet risultante in una classe esecuzione della JSP I primi due passi vengono eseguiti solo quando cambia il codice della JSP
myJsp.jsp

traduzione nessun cambiamento dallultima traduzione

Caso jsp modificata

myJsp_jsp.java

compilazione
myJsp_jsp.class

Caso jsp identica

HTML

carica/esegue output risultato

Ciclo di vita delle JSP Dal momento che le JSP sono compilate in servlet, ciclo di vita delle JSP controllato da Web container

Parte del primo avvio

Instantiation & loading: new Initialization: jspInit() Client requests

JSP

Garbage collection: finalize()

Ready: _jspService(..request,..response ) Destruction: jspDestroy() Server shutdown


Parte della servlet che rimane valida a meno di cambiamenti o di distruzione

Servlet e JSP Nella servlet la logica per la generazione del documento HTML implementata completamente in Java Il processo di generazione delle pagine timeconsuming, ripetitivo e soggetto a errori (sequenza di
println())

Laggiornamento delle pagine scomodo JSP nascono per facilitare la progettazione grafica e laggiornamento delle pagine Si pu separare agevolmente il lavoro fra grafici e programmatori Web designer possono produrre pagine senza dover conoscere i dettagli della logica server-side La generazione di codice dinamico implementata sfruttando il linguaggio Java
5

Servlet o JSP? Le JSP non rendono inutili le servlet Le servlet forniscono agli sviluppatori delle applicazioni Web un completo controllo dellapplicazione Se si vogliono fornire contenuti differenziati a seconda di diversi parametri quali lidentit dellutente, condizioni dipendenti dalla business logic, etc. conveniente lavorare con le servlet JSP rendono viceversa molto semplice presentare documenti HTML o XML allutente

Come funzionano le JSP Ogni volta che arriva una request, server compone dinamicamente il contenuto della pagina Ogni volta che incontra un tag <%...%> valuta lespressione Java contenuta al suo interno inserisce al suo posto il risultato dellespressione Questo meccanismo permette di generare pagine dinamicamente

Client

HTTP Server

WebContainer:inter preta e compila tutti i contenuti dinamici

Considerazioni sul flusso Ricordiamoci come funziona HTTP e qual la struttura delle pagine HTML Il Client si aspetta di ricevere tutto response header prima di response body: JSP deve effettuare tutte le modifiche allheader (ad es. modifica di un cookie) prima di cominciare a creare il body Una volta che Web server comincia a restituire la risposta non pu pi interrompere il processo, altrimenti browser mostra solo la frazione parziale che ha ricevuto: se JSP ha cominciato a produrre output non si pu pi effettuare forward ad unaltra JSP
8

Esempio: Hello world JSP, denominata helloWorld.jsp, che realizza il classico esempio Hello World! in modo parametrico:
<html> <body> <% String visitor=request.getParameter("name"); if (visitor == null) visitor = "World"; %> Hello, <%= visitor %>! </body> </html>
http://myHost/myWebApp/helloWord.jsp http://myHost/myWebApp/helloWord.jsp?name=Mario

<html> <body> Hello, World! </body> </html>

<html> <body> Hello, Mario! </body> </html>


9

Tag La parti variabili della pagina sono contenute allinterno di tag speciali Sono possibili due tipi di sintassi per questi tag: Scripting-oriented tag XML-Oriented tag Le scripting-oriented tag sono definite da delimitatori entro cui presente lo scripting (self-contained) Sono di quattro tipi: <%! %> Dichiarazione <%= %> Espressione <% %> Scriptlet <%@ %> Direttiva

10

XML-oriented tag XML-oriented tag seguono la sintassi XML Sono presenti XML tag equivalenti ai delimitatori visti nella pagina precedente
<jsp:declaration>declaration</jsp:declaration> <jsp:expression>expression</jsp: expression> <jsp:scriptlet>java_code</jsp:scriptlet> <jsp:directive.dir_type dir_attribute />

Nel seguito useremo scripting-oriented tag che sono pi diffusi

11

Dichiarazioni Si usano i delimitatori <%! e %> per dichiarare variabili e metodi Variabili e metodi dichiarati possono poi essere referenziati in qualsiasi punto del codice JSP I metodi diventano metodi della servlet quando la pagina viene tradotta
<%! String name = Paolo Rossi; double[] prices = {1.5, 76.8, 21.5}; double getTotal() { double total = 0.0; for (int i=0; i<prices.length; i++) total += prices[i]; return total; } %>
12

Espressioni Si usano i delimitatori <%= e %> per valutare espressioni Java Risultato dellespressione viene convertito in stringa inserito nella pagina al posto del tag
Continuando lesempio della pagina precedente:
JSP

<p>Sig. <%=name%>,</p> <p>lammontare del suo acquisto : <%=getTotal()%> euro.</p> <p>La data di oggi : <%=new Date()%></p>

Pagina HTML risultante

<p>Sig. Paolo Rossi,</p> <p>lammontare del suo acquisto : 99.8 euro.</p> <p>La data di oggi : Tue Feb 20 11:23:02 2010</p>
13

Scriptlet Si usano <% e %> per aggiungere un frammento di codice Java eseguibile alla JSP (scriptlet) Lo scriptlet consente tipicamente di inserire logiche di controllo di flusso nella produzione della pagina La combinazione di tutti gli scriptlet in una determinata JSP deve definire un blocco logico completo di codice Java

<% if (userIsLogged) { %> <h1>Benvenuto Sig. <%=name%></h1> <% } else { %> <h1>Per accedere al sito devi fare il login</h1> <% } %>

14

Direttive Sono comandi JSP valutati a tempo di compilazione Le pi importanti sono: page: permette di importare package, dichiarare pagine derrore, definire il modello di esecuzione JSP relativamente alla concorrenza, ecc. include: include un altro documento taglib: carica una libreria di custom tag implementate dallo sviluppatore Non producono nessun output visibile
<%@ <%@ <%@ <%@ page info=Esempio di direttive %> page language=java import="java.net.* %> page import=java.util.List, java.util.ArrayList %> include file=myHeaderFile.html %>

15

La direttiva page La direttiva page definisce una serie di attributi che si applicano allintera pagina Sintassi:
<%@ [ [ [ [ [ [ [ [ [ [ page language="java" ] extends="package.class" ] import="{package.class | package.*}, ..." ] session="true | false" ] buffer="none | 8kb | sizekb" ] autoFlush="true | false" ] isThreadSafe="true | false" ] info="text" ] errorPage="relativeURL" ] contentType="mimeType [ ;charset=characterSet ]"| "text/html ; charset=ISO-8859-1" ] [ isErrorPage="true | false" ] %>
N.B. valori sottolineati sono quelli di default 16

Attributi di page - 1 language="java" linguaggio di scripting utilizzato nelle parti dinamiche, allo stato attuale lunico valore ammesso java import="{package.class|package.*}," lista di package da importare. Gli import pi comuni sono impliciti e non serve inserirli (java.lang.*, javax.servlet.*,javax.servlet.jsp.*, javax.servlet.http.*) session="true|false" : indica se la pagina fa uso della sessione (altrimenti non si pu usare session) buffer="none|8kb|sizekb" dimensione in KB del buffer di uscita autoFlush="true|false" dice se il buffer viene svuotato automaticamente quando pieno. Se il valore

false viene generata uneccezione quando il buffer pieno

17

Attributi di page - 2 isThreadSafe="true|false" indica se il codice contenuto nella pagina thread-safe. Se vale false le chiamate alla JSP vengono serializzate info="text" testo di commento. Pu essere letto con il
metodo Servlet.getServletInfo()

errorPage="relativeURL" indirizzo della pagina a cui vengono inviate le eccezioni isErrorPage="true|false" indica se JSP corrente una pagina di errore. Si pu utilizzare loggetto eccezione
solo se lattributo true

contentType="mimeType [;charset=charSet ]" | "text/html;charset=ISO-8859-1" indica il tipo MIME e il codice di caratteri usato nella risposta

18

La direttiva include Sintassi: <%@ include file = "localURL"%> Serve ad includere il contenuto del file specificato possibile nidificare un numero qualsiasi di inclusioni Linclusione viene fatta a tempo di compilazione:
eventuali modifiche al file incluso non determinano una ricompilazione della pagina che lo include

Esempio: <%@ include file="/shared/copyright.html"%>

Solo alla prima richiesta viene fatto questo

19

Direttiva taglib JSP permettono di definire tag custom oltre a quelli predefiniti Una taglib una collezione di questi tag non standard, realizzata mediante una classe Java
Sintassi: <%@ uri=tagLibraryURI" prefix="tagPrefix"%>

Vedremo il dettaglio alla fine di questo blocco di lucidi, dopo aver introdotto anche il concetto, molto importante, di modello a componenti (componenti/container)

20

Built-in objects Le specifiche JSP definiscono 8 oggetti built-in (o impliciti) utilizzabili senza dover creare istanze Rappresentano utili riferimenti ai corrispondenti oggetti presenti nelle servlet
Oggetto page config request response out session application pageContext exception Classe/Interfaccia javax.servlet.jsp.HttpJspPage javax.servlet.ServletConfig javax.servlet.http.HttpServletRequest javax.servlet.http.HttpServletResponse javax.servlet.jsp.JspWriter javax.servlet.http.HttpSession javax.servlet.ServletContext javax.servlet.jsp.PageContext Java.lang.Throwable

21

Loggetto page Loggetto page rappresenta listanza corrente della servlet


Ha come tipo linterfaccia HTTPJspPage che discende da JSP page, la quale a sua volta estende Servlet

Pu quindi essere utilizzato per accedere a tutti i metodi definiti nelle servlet
JSP

<%@ page info=Esempio di uso page." %> <p>Page info: <%=page.getServletInfo() %> </p>
Pagina HTML

<p>Page info: Esempio di uso di page</p>


22

Oggetto config Contiene la configurazione della servlet (parametri di inizializzazione)


Poco usato in pratica in quanto in generale nelle JSP sono poco usati i parametri di inizializzazione

Metodi di config: getInitParameterName(): restituisce tutti i nomi dei parametri di inizializzazione getInitParameter(name): restituisce il valore del parametro passato per nome

23

Oggetto request Rappresenta la richiesta alla pagina JSP il parametro request passato al metodo service() della servlet Consente laccesso a tutte le informazioni relative alla richiesta HTTP: indirizzo di provenienza, URL, headers, cookie, parametri, ecc.
<% String xStr = request.getParameter("num"); try { long x = Long.parseLong(xStr); %> Fattoriale: <%= x %>! = <%= fact(x) %> <%} catch (NumberFormatException e) { %> Il parametro <b>num</b>non contiene un valore intero. <%} %>
24

Alcuni metodi di request String getParameter(String parName)restituisce valore di un parametro individuato per nome Enumeration getParameterNames() restituisce lelenco dei nomi dei parametri String getHeader(String name) restituisce il valore di un header individuato per nome sotto forma di stringa Enumeration getHeaderNames() elenco dei nomi di tutti gli header presenti nella richiesta Cookie[] getCookies() restituisce un array di oggetti cookie che client ha inviato alla request Per lelenco completo vedere parte su servlet
25

Oggetto response Oggetto legato allI/O della pagina JSP Rappresenta la risposta che viene restituita al client Consente di inserire nella risposta diverse informazioni: content type ed enconding eventuali header di risposta URL Rewriting i cookie
<%response.setDateHeader("Expires", 0); response.setHeader("Pragma", "no-cache"); if (request.getProtocol().equals("HTTP/1.1")) { response.setHeader("Cache-Control", "no-cache"); } %>
26

Metodi di response public void setHeader(String headerName, String headerValue) imposta header public void setDateHeader(String name, long millisecs) imposta data addHeader, addDateHeader, addIntHeader aggiungono nuova occorrenza di un dato header setContentType determina content-type addCookie consente di gestire i cookie nella risposta public PrintWriter getWriter: restituisce uno stream di caratteri (unistanza di PrintWriter) public ServletOutputStream getOuputStream(): restituisce uno stream di byte (unistanza di ServletOutputStream)
27

Oggetto out Oggetto legato allI/O della pagina JSP uno stream di caratteri e rappresenta lo stream di output della pagina
Esempio: <p>Conto delle uova <% int count = 0; while (carton.hasNext()) { count++; out.print("."); } %> <br/> Ci sono <%= count %> uova. </p>
28

Metodi delloggetto out isAutoFlush(): dice se output buffer stato impostato in modalit autoFlush o meno getBufferSize(): restituisce dimensioni del buffer getRemaining() indica quandi byte liberi ci sono nel buffer clearBuffer() ripulisce il buffer flush() forza lemissione del contenuto del buffer flose() fa flush e chiude stream

29

Oggetto session Oggetto che fornisce informazioni sul contesto di esecuzione della JSP Rappresenta la sessione corrente per un utente
Lattributo session della direttiva page deve essere true affinch JSP partecipi alla sessione

<% UserLogin userData = new UserLogin(name, password); session.setAttribute("login", userData); %> <%UserLogin userData=(UserLogin)session.getAttribute("login"); if (userData.isGroupMember("admin")) { session.setMaxInactiveInterval(60*60*8); } else { session.setMaxInactiveInterval(60*15); } %>

30

Metodi di session String getID() restituisce ID di una sessione boolean isNew() dice se sessione nuova void invalidate() permette di invalidare (distruggere) una sessione long getCreationTime() ci dice da quanto tempo attiva la sessione (in ms) long getLastAccessedTime() ci dice quando stata utilizzata lultima volta

31

Oggetto application Oggetto che fornisce informazioni su contesto di esecuzione della JSP ( ServletContext) Rappresenta la Web application a cui JSP appartiene Consente di interagire con lambiente di esecuzione: fornisce la versione del JSP Container garantisce laccesso a risorse server-side permette accesso ai parametri di inizializzazione relativi allapplicazione consente di gestire gli attributi di unapplicazione

32

Oggetto pageContext Oggetto che fornisce informazioni sul contesto di esecuzione della JSP Rappresenta linsieme degli oggetti impliciti di una JSP Consente accesso a tutti gli oggetti impliciti e ai loro attributi Consente trasferimento del controllo ad altre pagine Poco usato per lo scripting, utile per costruire custom tag

33

Oggetto exception Oggetto connesso alla gestione degli errori Rappresenta leccezione che non viene gestita da nessun blocco catch
Non automaticamente disponibile in tutte le pagine ma solo nelle Error Page (quelle dichiarate con lattributo errorPage impostato a true) Esempio: <%@ page isErrorPage="true" %> <h1>Attenzione!</h1> E stato rilevato il seguente errore:<br/> <b><%= exception %></b><br/> <% exception.printStackTrace(out); %>
34

Azioni
Le azioni sono comandi JSP valutati a request time Sono previsti 6 tipi di azioni definite dai seguenti tag: useBean: istanzia JavaBean e gli associa un identificativo getProperty: ritorna property indicata come oggetto setProperty: imposta valore della property indicata per nome include: include file nella JSP forward: cede controllo ad unaltra JSP o servlet plugin: genera contenuto per scaricare plug-in Java se necessario Sono espresse usando sintassi XML
<html> <body> <jsp:useBean id="hello" class=it.unibo.deis.my.HelloBean"/> <jsp:setProperty name="hello" property="name" param="name"/> Hello, <jsp:getProperty name="hello" property="name"/>! </body> </html>
35

Azioni: forward Sintassi: <jsp:forward page="localURL" /> Consente trasferimento del controllo dalla pagina JSP corrente ad unaltra pagina sul server locale Lattributo page definisce lURL della pagina a cui trasferire il controllo La request viene completamente trasferita in modo trasparente per il client

36

Azioni: forward possibile generare dinamicamente attributo page


<jsp:forward page=<%="message"+statusCode+".html"%>/>

Oggetti request, response e session della pagina darrivo sono gli stessi della pagina chiamante, ma viene istanziato un nuovo oggetto pageContext Attenzione: forward possibile soltanto se non stato emesso alcun output possibile aggiungere parametri alloggetto request della pagina chiamata utilizzando il tag <jsp:param>
<jsp:forward page="localURL"> <jsp:param name="parName1 value="parValue1"/> ... <jsp:param name="parNameN value="parValueN"/> </jsp:forward>

37

Azioni: include
Sintassi: <jsp:include page="localURL" flush="true" />

Consente di includere il contenuto generato dinamicamente da unaltra pagina locale allinterno delloutput della pagina corrente Trasferisce temporaneamente controllo ad unaltra pagina Lattributo page definisce lURL della pagina da includere Lattributo flush stabilisce se sul buffer della pagina corrente debba essere eseguito flush prima di effettuare linclusione Gli oggetti session e request per pagina da includere sono gli stessi della pagina chiamante, ma viene istanziato un nuovo contesto di pagina
38

Azioni: include possibile aggiungere parametri alloggetto request della pagina inclusa utilizzando il tag <jsp:param>
<jsp:include page="localURL flush=true> <jsp:param name="parName1 value="parValue1"/> ... <jsp:param name="parNameN value="parValueN"/> </jsp:include>

39

JSP e modello a componenti


Scriptlet ed espressioni consentono uno sviluppo centrato sulla pagina Questo modello non consente una forte separazione tra logica applicativa e presentazione dei contenuti Applicazioni complesse necessitano di una architettura a pi livelli A tal fine JSP consentono sviluppo basato su un modello a componenti Il modello a componenti: consente di avere una maggiore separazione fra logica dellapplicazione e contenuti Permette di costruire architetture molto pi articolate Fate mente locale su quanto avete gi visto in altri corsi sui componenti

40

Componenti software Un componente un circuito integrato software che comunica con lesterno attraverso una serie di piedini Unentit in grado di incorporare componenti viene definita container ed lequivalente software di una scheda elettronica Abbiamo tre tipi di piedini: propriet, metodi, eventi (modello PME): Propriet (property): piedini di stato, pseudovariabili che consentono di interagire in modo protetto con lo stato interno Metodi: piedini di ingresso, comandi che provocano lesecuzione di azioni Eventi: piedini di uscita, provocano lesecuzione di metodi nel container (callback) in seguito a qualcosa che si verifica nel componente
41

JavaBeans JavaBeans sono il modello di componenti di Java Un JavaBean, o semplicemente bean, non altro che una classe Java dotata di alcune caratteristiche particolari: Classe public Ha un costruttore public di default (senza argomenti) Espone propriet, sotto forma di coppie di metodi di accesso (accessors) costruiti secondo le regole che abbiamo appena esposto (get set) Espone eventi con metodi di registrazione che seguono regole precise

42

Propriet - 1 Le propriet sono elementi dello stato del componente che vengono esposti in modo protetto
In alcuni linguaggi (ad esempio C#) esiste sintassi specifica per definire le propriet

In altri (come Java) le propriet sono solo una convenzione: sono coppie di metodi di accesso che seguono regole di denominazione La propriet prop definita da due metodi getProp() e setProp() Il tipo del parametro di setProp() e del valore di ritorno di getProp() devono essere uguali e rappresentano il tipo della propriet (pu essere un tipo
primitivo o una qualunque classe java)

Per esempio void setLength(int Value) e int getLength() identificano propriet length di tipo int
43

Propriet - 2 Se definiamo solo il metodo get avremo una propriet in sola lettura (read-only) Le propriet di tipo boolean seguono una regola leggermente diversa: metodo di lettura ha la forma isProp() anzich getProp()
Per esempio la propriet empty sar rappresentata dalla coppia void setEmpty(boolean value) e boolean isEmpty()

Esiste anche la possibilit di definire propriet indicizzate per rappresentare collezioni di valori (pesudoarray). In questo caso sia get che set prevedono un parametro che ha la funzione di indice
Ad es. String getItem(int index) e setItem(int Index, String value) definiscono la propriet indicizzata String item[]
44

Componenti e container I componenti vivono allinterno di contenitori (component container) che gestiscono tempo di vita dei singoli componenti collegamenti fra componenti e resto del sistema I contenitori non conoscono a priori i componenti che devono gestire e quindi interagiscono con loro mediante meccanismi di tipo dinamico (spesso reflection) Un contenitore per JavaBean prende il nome di bean container Un bean container in grado di interfacciarsi con i bean utilizzando Java Reflection che fornisce strumenti di introspezione e di dispatching Lobbligo del costruttore di default ha proprio lo scopo di consentire creazione dinamica delle istanze
45

Introspezione e dispatching Introspezione: capacit di descrivere le proprie caratteristiche (propriet e metodi con relativi parametri) Consente lesplorazione da parte del container Dispatching (o very-late binding): capacit di invocare i metodi in modo completamente dinamico. Estende una caratteristica tipica di OOP Early-binding: sia linterfaccia che limplementazione devono essere note a tempo di compilazione Late-binding: a tempo di compilazione viene fissata solo linterfaccia mentre limplementazione dei metodi definita a runtime Very-late binding: sia interfaccia che implementazione sono definite solo a runtime
46

Esempio
Creiamo un bean che espone due propriet in sola lettura (ore e minuti) e ci d lora corrente
import java.util.* public class CurrentTimeBean { private int hours; private int minutes; public CurrentTimeBean() { Calendar now = Calendar.getInstance(); this.hours = now.get(Calendar.HOUR_OF_DAY); this.minutes = now.get(Calendar.MINUTE); } public int getHours() { return hours; } public int getMinutes() { return minutes; } }
47

JSP e JavaBean JSP prevedono una serie di tag per agganciare un bean e utilizzare le sue propriet allinterno della pagina. Tre tipi: Tag per creare un riferimento al bean (creazione di unistanza) Tag per impostare il valore delle propriet del bean Tag per leggere il valore delle propriet del bean e inserirlo nel flusso della pagina

48

Esempio di uso di bean


<jsp:useBean id="user" class="RegisteredUser" scope="session"/> <jsp:useBean id="news" class="NewsReports" scope="request"> <jsp:setProperty name="news" property="category" value="fin."/> <jsp:setProprety name="news" property="maxItems" value="5"/> </jsp:useBean> <html> <body> <p>Bentornato <jsp:getProperty name="user" property="fullName"/>, la tua ultima visita stata il <jsp:getProperty name="user" property="lastVisitDate"/>. </p> <p> Ci sono <jsp:getProperty name="news" property="newItems"/> nuove notizie da leggere.</p> </body> </html>

49

Tag jsp:useBean Sintassi: <jsp:useBean id="beanName" class="class


scope="page|request|session|application"/>

Inizializza e crea il riferimento al bean Gli attributi principali sono id e class e scope id il nome con cui listanza del bean verr indicata nel resto della pagina class classe Java che definisce il bean scope definisce ambito di accessibilit e tempo di vita delloggetto (default = page)

50

Tempo di vita dei bean Per default ogni volta che una pagina JSP viene richiesta e processata viene creata unistanza del bean (scope di default = page) Con lattributo scope possibile estendere la vita del bean oltre la singola richiesta:
Scope page request Accessibilit Solo la pagina corrente La pagina corrente, quelle incluse e quelle a cui si fa forward Richiesta corrente e tutte le altre richieste dello stesso client Richiesta corrente e ogni altra richiesta che fa parte della stessa applicazione Tempo di vita Fino a quando la pagina viene completata o fino al forward Fino alla fine dellelaborazione della richiesta e restituzione della risposta Tempo di vita della sessione

session

application

Tempo di vita dellapplicazione

HTTP Server

JSP

Servle t

JB1 JB2

51

Tag jsp:getProperty Sintassi: <jsp:getProperty name="beanName" property="propName"/> Consente laccesso alle propriet del bean Produce come output il valore della propriet del bean Il tag non ha mai body e ha solo 2 attributi: name: nome del bean a cui si fa riferimento property: nome della propriet di cui si vuole leggere il valore

52

Esempio 1: uso di CurrentTimeBean


JSP

<jsp:useBean id="time" class="CurrentTimeBean"/> <html> <body> <p>Sono le ore <jsp:getProperty name="time" property=hours"/> e <jsp:getProperty name="time" property="minutes"/> minuti. </p> </body> </html>
Output HTML

<html> <body> <p>Sono le ore 12 e 18 minuti.></p> </body> </html>

53

Esempio 2: un caso un po pi complesso


JSP

<jsp:useBean id="style" class="beans.CorporateStyleBean"/> <html> <body bgcolor="<jsp:getProperty name="style property="color"/>"> <center> <img src="<jsp:getProperty name="style" property="logo"/>"> Welcome to Big Corp! </center> </body> </html>
Output HTML

<html> <body bgcolor="pink"> <center> <img src="http://imageserver/logo.gif"> Welcome to Big Corp! </center> </body> </html>
54

Tag jsp:setProperty Sintassi: <jsp:setProperty name="beanName" property="propName value="propValue"/> Consente di modificare il valore delle propriet del bean
Esempi:

<jsp:setProperty name="user" property="daysLeft" value="30"/> <jsp:setProperty name="user" property="daysLeft" value="<%=15*2%>"/>

55

Propriet indicizzate I bean tag non supportano propriet indicizzate Per un bean un normale oggetto Java: quindi possibile accedere a variabili e metodi
Esempio:
<jsp:useBean id=weather" class=weatherForecasts"/> <p><b>Previsioni per domani:</b>: <%= weather.getForecasts(0)%> </p> <p><b>Resto della settimana:</b> <ul> <% for (int index=1; index < 5; index++) { %> <li><%= weather.getForecasts(index) %></li> <% } %> </ul> </p>
56

JSP + JavaBean = Model 1 Larchitettura J2EE a due livelli costituita da JSP per il livello di presentazione JavaBean per il livello di business logic viene denominata Model 1

57

Custom tag e tag libraries JSP permettono di definire tag personalizzati (custom tag) che estendono quelli predefiniti Una taglib una collezione di questi tag non standard, realizzata mediante una classe Java Per utilizzarla si una la direttiva taglib con la sintassi:
<%@ uri=tagLibraryURI" prefix="tagPrefix"%>
Lattributo uri fa riferimento ad un file xml, con estensione tld (tag library descriptor), che contiene informazioni sulle classe che implementa i tag Lattributo prefix indica il prefisso da utilizzare nei tag che fanno riferimento alla tag library (tag library un namespace)

58

Definizione di taglib Per definire una tag library occorrono due elementi: File TLD (Tag Lib Definition) che specifica i singoli Tag e a quale "classe" corrispondono Le classi che effettivamente gestiscono i tag File TLD un file XML che specifica: i tag che fanno parte della libreria i loro eventuali attributi "body" del tag (se esiste) classe Java che gestisce il tag Dovremo quindi sviluppare le classi che implementano il comportamento dei tag Una singola libreria pu contenere centinaia di tag o uno solo
59

Esempio di taglib
Un semplice esempio di file TLD il seguente:
<?xml version="1.0" encoding="ISO-8859-1" standalone="no" ?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> <taglib> <tlibversion>1.0</tlibversion> <jspversion>1.1</jspversion> <shortname>hellolib</shortname> <uri>hellodir</uri> <tag> <name>helloWorld</name> <tagclass>helloTagClass</tagclass> <bodycontent>emtpy</bodycontent> <attribute> <name>who</name> <required>true</required> </attribute> </tag> </taglib>

60

Esempio di taglib Questo file stabilisce che:


la versione della libreria la 1.0 (tlibversion) il nome della libreria hellolib (attributo shortname) i file .class si trovano nella directory hellodir (attributo uri)

Viene definito un solo tag denominato helloWorld:


senza contenuto (bodycontent empty) con solo "attributo, denominato who, obbligatorio (required true) "gestito" dalla classe denominata helloTagClass

61

Uso della taglib Innanzitutto inseriamo nella JSP la direttiva che include la libreria di tag:
<%@ taglib uri=hellolib.tld" prefix=htl" %>

Il prefisso definisce un namespace e quindi elimina le eventuali omonimie causate dallinclusione di pi librerie. Possiamo quindi usare il tag con la sintassi:
<htl:helloWorld who=Mario">

62

Implementazione del tag Dobbiamo scrivere una apposita classe Java che estende TagSupport TagSupport la classe base per i tag "semplici", per quelli complessi sono disponibili altre classi base La classe deve implementare i metodi doStartTag()e doEndTag() Una coppia di metodi di accesso (setAttrName() e getAttrName()per ogni attributo doStartTag() utilizza loggetto out restituito da PageContext per scrivere nelloutput della pagina e se tag non ha nessun "body deve ritornare come valore la costante SKIP_BODY doEndTag()restituisce usualmente la costante EVAL_PAGE che indica che, dopo il tag, prosegue la normale elaborazione della pagina
63

Implementazione
import javax.servlet.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class helloTagClass extends TagSupport { private String who; public int doStartTag() throws JspException { try pageContext.getOut().println("Hello"+who+"<br>"); catch( Exception e ) throw new JspException( "taglib:" + e.getMessage() ); return SKIP_BODY; } public int doEndTag() { return EVAL_PAGE; } public void setWho(String value) { who = value; } public String getWho() { return who; } }
64

Esempio di uso
Scriviamo una versione di HelloWorld che utilizza la nostra tag library:

<%@ taglib uri=hellolib.tld" prefix=htl" %> <html> <body> <htl:helloWorld who=<%=request.getParameter("name")%> </body> </html>

65

Tecnologie Web T JavaScript

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 3.04.JavaScript.pdf Versione elettronica: 3.04.JavaScript-2p.pdf
JavaScript 1

Che cos JavaScript JavaScript un linguaggio di scripting sviluppato per dare interattivit alle pagine HTML Pu essere inserito direttamente nelle pagine Web ed in pratica lo standard client-side Il suo nome ufficiale ECMAScript
E diventato standard ECMA (ECMA-262) nel 1997 E anche uno standard ISO (ISO/IEC 16262)

Sviluppato inizialmente da Netscape (il nome originale era LiveScript) e introdotto in Netscape 2 nel 1995 In seguito anche Microsoft ha lavorato sul linguaggio producendo una sua variante chiamata JScript
Lo standard del dicembre 1999 ECMA-262 Edition 3, e corrisponde a JavaScript 1.5 Al 2009, lultima versione del linguaggio JavaScript 1.8.1 e corrisponde a un superset di ECMA-262 Edition 3
JavaScript 2

JavaScript e Java Al di la del nome, Java e JavaScript sono due cose completamente diverse Lunica similitudine legata al fatto di aver entrambi adottato la sintassi del C Esistono profonde differenze JavaScript interpretato e non compilato JavaScript object-based ma non class-based Esiste il concetto di oggetto Non esiste il concetto di classe JavaScript debolmente tipizzato (weakly typed): Non necessario definire il tipo di una variabile Attenzione per:questo non vuol dire che i dati non abbiano un tipo (sono le variabili a non averlo in modo statico)
JavaScript 3

Cosa si pu fare con JavaScript Il codice JavaScript viene eseguito da un interprete contenuto allinterno del browser Nasce per dare dinamicit alle pagine Web Consente quindi di: Accedere e modificare elementi della pagina HTML Reagire ad eventi generati dallinterazione fra utente e pagina Validare i dati inseriti dallutente Interagire con il browser: determinare il browser utilizzato e la dimensione della finestra in cui viene mostrata la pagina, lavorare con i browser cookie, ecc.

JavaScript

Esempio Vediamo la versione JavaScript dellormai mitico HelloWorld! Viene mostrato un popup con la scritta HelloWorld Lo script viene inserito nella pagina HTML usando il tag <script>:
<html> <body> <p>Hello da JavaScript</p> <script type=text/javascript> alert("Hello World!"); </script> </body> </html>

JavaScript

Sintassi del linguaggio La sintassi di JavaScript modellata su quella del C con alcune varianti significative In particolare: E un linguaggio case-sensitive Le istruzioni sono terminate da ; ma il terminatore pu essere omesso se si va a capo Sono ammessi sia commenti multilinea (delimitati da /* e */) che monolinea (iniziano con //) Gli identificatori possono contenere lettere, cifre e i caratteri _ e $ ma non possono iniziare con una cifra

JavaScript

Variabili Le variabili vengono dichiarate usando la parola chiave var: var nomevariabile; Non hanno un tipo: possono contenere valori di qualunque tipo E prevista la possibilit di inizializzare una variabile contestualmente alla dichiarazione var f = 15.8 Possono essere dichiarate in linea: for (var i = 1, i<10, i++) Esiste lo scope globale e quello locale (ovvero dentro una funzione) ma, a differenza di Java, non esiste lo scope di blocco
JavaScript 7

Valori speciali Ad ogni variabile pu essere assegnato il valore null che rappresenta lassenza di un valore Come in SQL un concetto diverso da zero (0) o stringa vuota () Una variabile non inizializzata ha invece un valore indefinito undefined I due concetti si assomigliano ma non sono uguali

JavaScript

Tipi primitivi: numeri e booleani Javascript prevede pochi tipi primitivi: numeri, booleani e stringhe (forse! ) Numeri (number): Sono rappresentati in formato floating point a 8 byte (64bit, formato IEEE) Non c distinzione fra interi e reali Esiste il valore speciale NaN (not a number) per le operazioni non ammesse (ad esempio radice di un numero negativo) Esiste il valore infinite (ad esempio per la divisione per zero) Booleani (boolean): ammettono i valori true e false
JavaScript 9

Il concetto di tipo in JavaScript Come abbiamo detto, alle variabili non viene attribuito un tipo: lo assumono dinamicamente in base al dato a cui vengono agganciate I dati hanno un tipo e per ogni tipo esiste una sintassi per esprimere le costanti (literal) Per i numeri, ad esempio, le costanti hanno la forma usuale: 1.0, 3.5 o in altre basi Per i booleani sono gli usuali valori true e false
var v; // senza tipo v = 15.7; // diventa di tipo number v = true; // diventa di tipo boolean

JavaScript

10

Oggetti Gli oggetti sono tipi composti che contengono un certo numero di propriet (attributi) Ogni propriet ha un nome e un valore Si accede alle propriet con loperatore . (punto) Le propriet non sono definite a priori: possono essere aggiunte dinamicamente Gli oggetti vengono creati usando loperatore new: var o = new Object() Attenzione: Object() un costruttore e non una classe Le classi non esistono e quindi i due concetti non si sovrappongono come avviene in Java
JavaScript 11

Costruire un oggetto Un oggetto appena creato completamente vuoto non ha ne propriet n metodi Possiamo costruirlo dinamicamente appena assegniamo un valore ad una propriet la propriet comincia ad esistere Nellesempio sottostante creiamo un oggetto e gli aggiungiamo 3 propriet numeriche: x, y e tot: var o = new Object(); o.x = 15; o.y = 7; o.tot = o.x + o.y; alert(o.tot);

JavaScript

12

Costanti oggetto Le costanti oggetto (object literal) sono racchiuse fra parentesi graffe e contengono un elenco di attributi nella forma: nome:valore var nomeoggetto = {prop1:val1; prop2:val2...} Usando le costanti oggetto creiamo un oggetto e le propriet (valorizzate) nello stesso momento I due esempi seguenti sono del tutto equivalenti: var o = new Object(); o.x = 15; o.y = 7; o.tot = 15; var o = {x:7, y:8, tot:15}; alert(o.tot); alert(o.tot);
JavaScript 13

Array Gli array sono tipi composti i cui elementi sono accessibili mediante un indice numerico lindice parte da zero non hanno una dimensione prefissata (simili agli ArrayList di Java) espongono attributi e metodi Vengono istanziati con new Array(dimensione) Si possono creare e inizializzare usando delle costanti array (array literal) delimitate da []: var varname = [val,val2,,val n] Es. var a = [1,2,3]; Possono contenere elementi di tipo eterogeneo: Es. var b = [1,true,"ciao",{x:1,y:2}];
JavaScript 14

Oggetti e array Gli oggetti in realt sono array associativi strutture composite i cui elementi sono accessibili mediante un indice di tipo stringa (nome) anzich attraverso un indice numerico Si pu quindi utilizzare anche una sintassi analoga a quella degli array Le due sintassi sono del tutto equivalenti e si possono mescolare
var o = new Object(); o.x = 15; o.y = 7; o.tot = o.x + o.y; alert(o.x); var o = new Object(); o["x"] = 15; o.y = 7; o["tot"] = o.x + o["y"]; alert(o.x);

JavaScript

15

Stringhe Non facile capire esattamente cosa sono le stringhe in JavaScript Potremmo dire che mentre in Java sono oggetti che sembrano dati di tipo primitivo in JavaScript sono dati di tipo primitivo che sembrano oggetti Sono sequenze arbitrarie di caratteri in formato UNICODE a 16 bit e sono immutabili come in Java Esiste la possibilit di definire costanti stringa delimitate da apici singoli ('ciao') o doppi ("ciao") E possibile la concatenazione con loperatore + E possibile la comparazione con gli operatori < > >= <= e !=

JavaScript

16

Stringhe come oggetti? Possiamo per invocare metodi su una stringa o accedere ai suoi attributi Possiamo infatti scrivere var s = ciao; var n = s.length; var t = s.charAt(1); Non sono per oggetti e la possibilit di trattarli come tali nasce da due caratteristiche: Esiste un tipo wrapper String che un oggetto JavaScript fa il boxing in automatico come C#
quando una variabile di tipo valore necessita essere convertita in tipo riferimento, un oggetto box allocato per mantenere tale valore

JavaScript

17

Espressioni regolari JavaScript ha un supporto per le espressioni regolari (regular expressions) che sono un tipo di dato nativo del linguaggio Come per gli altri tipi esistono le costanti di tipo espressione regolare (regexp literal) con la sintassi / expression / Un espressione regolare pu essere creata anche mediante il costruttore RegExp(): var r = /[abc]/; var r = new RegExp("[abc]");

JavaScript

18

Tipi valore e tipi riferimento Si pu tentare di interpretare il sistema dei tipi di JavaScript usando una logica simile a quella di C# Si pu quindi distinguere fra tipi valore e tipi riferimento Numeri e booleani sono tipi valore Array e Oggetti sono tipi riferimento Per le stringhe abbiamo ancora una situazione incerta Pur essendo un tipo primitivo si comportano come un tipo riferimento Le stringhe Javascript sono lequivalente informatico dellornitorinco!
JavaScript 19

Funzioni Una funzione un frammento di codice JavaScript che viene definito una volta e usato in pi punti Ammette parametri che sono privi di tipo Restituisce un valore il cui tipo non viene definito La mancanza di tipo coerente con la scelta fatta per le variabili Le funzioni possono essere definite utilizzando la parola chiave function Una funzione pu essere assegnata ad una variabile function sum(x,y) { return x+y; }

var s = sum(2,4);

JavaScript

20

Costanti funzione e costruttore Function Esistono costanti funzione (function literal) che permettono di definire una funzione e poi di assegnarla ad una variabile con una sintassi decisamente inusuale: var sum = function(x,y) { return x+y; } Una funzione pu essere anche creata usando un costruttore denominato Function (le funzioni sono quindi equivalenti in qualche modo agli oggetti) var sum = new Function("x","y","return x+y;");

JavaScript

21

Metodi Quando una funzione viene assegnata ad una propriet di un oggetto viene chiamata metodo delloggetto La cosa possibile perch, come abbiamo visto, una funzione pu essere assegnata ad una variabile In questo caso allinterno della funzione si pu utilizzare la parola chiave this per accedere alloggetto di cui la funzione una propriet Costruiamo un oggetto con 2 attributi e un metodo
var o = new Object(); o.x = 15; o.y = 7; o.tot = function() { return this.x+this.y; } alert(o.tot());

JavaScript

22

Costruttori Un costruttore una funzione che ha come scopo quello di costruire un oggetto Se viene invocato con new riceve loggetto appena creato e pu aggiungere propriet e metodi Loggetto da costruire accessibile con la parola chiave this In qualche modo definisce il tipo di un oggetto
function Rectangle(w, h) { var r = new Rectangle(5,4); this.w = w; alert(r.area()); this.h = h; this.area = function() { return this.w*this.h; } this.perimeter = function() { return 2*(this.w+this.h); } }
JavaScript 23

Propriet e metodi statici JavaScript ammette lesistenza di propriet e metodi statici con lo stesso significato di Java Non esistendo le classi sono associati al costruttore Per esempio, se abbiamo definito il costruttore Circle() che serve per creare oggetti di tipo cerchio, possiamo aggiungere lattributo PI in questo modo:
function Circle(r) { this.r = r; } Circle.PI = 3.14159;

Anche in Javascript esiste il tipo Math che definisce solo metodi statici corrispondenti alle varie funzioni matematiche
JavaScript 24

Ricapitolando In Javascript abbiamo solo tipi primitivi e oggetti I tipi primitivi sono numeri, booleani e stringhe (forse) Tutte le altre cose sono oggetti: Oggetti generici
quelli vuoti creati con new Object()

Funzioni Array Espressioni regolari Oggetti predefiniti: Date, Math, Document, ecc. Oggetti wrapper: String, Number, Boolean Oggetti definiti dallutente mediante definizione di un costruttore
JavaScript 25

Operatori JavaScript ammette tutti gli operatori presenti in C e in Java Valgono le stesse regole di priorit e associativit Esistono alcuni operatori tipici delete: elimina una propriet di un oggetto void: valuta unespressione senza restituire alcun valore typeof: restituisce il valore di un operando ===: identit o uguaglianza stretta (diverso da == che verifica leguaglianza) !==: non identit (diverso da !=)

JavaScript

26

Istruzioni Un programma JavaScript una sequenza di istruzioni Buona parte delle istruzioni JavaScript hanno la stessa sintassi di C e Java Si dividono in: Espressioni (uguali a Java): assegnamenti, invocazioni di funzioni e metodi, ecc. Istruzioni composte: blocchi di istruzioni delimitate da parentesi graffe (uguali a Java) Istruzione vuota: punto e virgola senza niente prima Istruzioni etichettate: normali istruzioni con un etichetta davanti (sintassi: label: statement) Strutture di controllo: if, for, while, ecc. Definizioni e dichiarazioni: var, function Istruzioni speciali: break, continue, return
JavaScript 27

Strutture di controllo if/else, switch, while, do/while e for funzionano come in C e Java La struttura for/in permette di scorrere le propriet di un oggetto (e quindi anche un array) con la sintassi: for (variable in object) statement
var x; var mycars = new Array(); mycars[0] = Panda"; mycars[1] = Uno"; mycars[2] = Punto"; mycars[3] = Clio"; for (x in mycars) { document.write(mycars[x]+"<br />"); }
JavaScript 28

Loggetto globale e funzioni predefinite In JavaScript esiste un oggetto globale implicito Tutte le variabili e le funzioni definite in una pagina appartengono alloggetto globale Possono essere utilizzate senza indicare questo oggetto Questo oggetto espone anche alcune funzioni predefinite: eval(expr)valuta la stringa expr (che contiene unespressione Javascript) isFinite(number) dice se il numero finito isNaN(testValue) dice se il valore NaN parseInt(str [,radix]) converte la stringa str in un intero (in base radix - opzionale) parseFloat(str): converte la stringa str in un numero
JavaScript 29

Inserimento di JavaScript in una pagina HTML HTML prevede un apposito tag per inserire script La sua sintassi <script><!-- script-text // --></script> Il commento HTML (<!-- // -->) che racchiude il testo dello script serve per gestire la compatibilit con i browser che non gestiscono JavaScript In questi casi il contenuto del tag viene ignorato La sintassi completa prevede anche la definizione del tipo di script definito (Javascript il default per gran parte dei browser) Si pu fare in due modi: <script language="Javascript"> <script type="text/javascript">
JavaScript 30

Script interni ed esterni Nelluso del tag <script> abbiamo due possibilit: Script esterno: il tag contiene il riferimento ad un file con estensione .js che contiene lo script:
<SCRIPT language="Javascript" src="nomefile.js"> <!-- // --> </SCRIPT>

Script interno: lo script contenuto direttamente nel tag:


<script type="text/javascript"> alert("Hello World!"); </script>

Unaltra forma di script interno, ancora pi integrata con HTML, il codice di risposta agli eventi che vedremo nel seguito

JavaScript

31

Considerazione sugli script interni Se lo script interno pu essere inserito sia nellintestazione che nel body Una pagina HTML viene eseguita in ordine sequenziale, dall'alto in basso, per cui: gli script di intestazione vengono caricati prima di tutti gli altri quelli nel body vengono eseguiti secondo l'ordine di caricamento Una variabile o qualsiasi altro elemento Javascript pu essere richiamato solo se caricato in memoria: ci che si trova nellheader visibile a tutti gli script del body quello che si trova nel body visibile solo agli script che lo seguono
JavaScript 32

Gestire lassenza di Javascript Ci sono browser che non gestiscono JavaScript es. molti browser dei cellulari
fanno eccezione, ad esempio, Opera Mobile 9.5 e Bolt 2.5!

Un utente pu disabilitare Javascript (per esempio per motivi di sicurezza) HTML prevede un tag (<noscript> da inserire in testata per gestire contenuti alternativi in caso di non disponibilit di Javascript Ad esempio:
<noscript> <meta http-equiv refresh content= "0;url=altrapagina.htm"> </noscript>
JavaScript 33

Cosa si pu fare con JavaScript Con JavaScript si possono fare essenzialmente quattro cose Costruire dinamicamente parti della pagina in fase di caricamento Rilevare informazioni sullambiente (tipo di browser, dimensione dello schermo, ecc.) Rispondere ad eventi generati dallinterazione con lutente Modificare dinamicamente il DOM (si parla in questo caso di Dynamic HTML o DHTML) Tipicamente gli script agiscono su pi aspetti in modo coordinato: ad esempio, modificando il DOM in risposta ad un evento
JavaScript 34

Browser Objects Per interagire con la pagina HTML , Javascript utilizza una gerarchia di oggetti predefiniti denominati Browser Objects e DOM Objects

La gerarchia che ha come radice document corrisponde al DOM

Scre en

JavaScript

35

Costruzione dinamica della pagina La pi semplice modalit di utilizzo di JavaScript consiste nellinserire nel corpo della pagina script che generano dinamicamente parti della pagina Bisogna tener presente che questi script vengono eseguiti solo una volta durante il caricamento della pagina e quindi non si ha interattivit con lutente Luso pi comune quello di generare pagine diverse in base al tipo di browser o dalla risoluzione dello schermo La pagina corrente rappresentata dalloggetto document Per scrivere nella pagina si utilizzano i metodi document.write() e document.writeln()

JavaScript

36

Rilevazione del browser


Per accedere ad informazioni sul browser si utilizza loggetto navigator che espone una serie di propriet:
Propriet Descrizione

appCodeName appName appVersion cookieEnabled platform userAgent

Nome in codice del browser (poco utile) Nome del browser Versione del Browser Dice se i cookies sono abilitati Piattaforma per cui il browser stato compilato Valore dellheader user-agent

<html> <body> <script> document.write('Hello '+navigator.appName+'!<br>'); document.write('Versione: '+navigator.appVersion+'<br>'); document.write('Piattaforma: '+navigator.platform); </script> </body> </html>
JavaScript 37

Rilevazione delle propriet dello schermo Loggetto screen permette di ricavare informazioni sullo schermo screen espone alcune utili propriet tra cui segnaliamo width e height che permettono di ricavarne le dimensioni
<html> <body> <script> document.write('Schermo: '+screen.width+'x'+screen.height+' pixel<br>'); </script> </body> </html>

JavaScript

38

Modello ad eventi e interattivit Per avere una reale interattivit bisogna utilizzare il meccanismo degli eventi JavaScript consente di associare script agli eventi causati dallinterazione dellutente con la pagina Lassociazione avviene mediante attributi associati ad elementi della pagina HTML Gli script prendono il nome di gestori di eventi (event handlers) Nelle risposte agli eventi si pu intervenire sul DOM modificando dinamicamente la struttura della pagina (DHTML) DHTML = JavaScript + DOM + CSS E un modello di tipo reattivo simile a quello di Swing o delle applicazioni Windows sviluppate con .NET
JavaScript 39

Eventi - 1
Evento Abort Blur Change Click DragDrop Error Focus KeyDown KeyPress KeyUp Applicabilit Immagini Finestre e tutti gli elementi dei form Campi di immissione di testo o liste di selezione Tutti i tipi di bottoni e i link Finestre Immagini, finestre Finestre e tutti gli elementi dei form Documenti, immagini, link, campi di immissione di testo Documenti, immagini, link, campi di immissione di testo Documenti, immagini, link, campi di immissione di testo Occorrenza Lutente blocca il caricamento di unimmagine Lutente toglie il focus a un elemento di un form o a una finestra Lutente cambia il contenuto di un elemento Lutente clicca su un bottone o un link Lutente fa il drop di un oggetto in una finestra Errore durante il caricamento Lutente d il focus a un elemento di un form o a una finestra Lutente preme un tasto Lutente digita un tasto (pressione + rilascio) Lutente rilascia un tasto JavaScript Event handler onAbort onBlur onChange onClick onDragDrop onError onFocus onKeyDown onKeyPress onKeyUp 40

Eventi - 2
Evento Load MouseDown MouseMove MouseOut MouseOver MouseUp Move Reset Resize Select Submit Unload Applicabilit Corpo del documento Documenti, bottoni, link Di default nessun elemento Mappe, link Link Documenti, bottoni, link Windows Form Finestre Campi di immissione di testo (input e textarea) Fprm Corpo del documento Occorrenza Lutente carica una pagina nel browser Lutente preme il bottone del mouse Lutente muove il cursore del mouse Il cursore del mouse esce fuori da un link o da una mappa Il cursore passa su un link Lutente rilascia il bottone del mouse La finestra viene spostata Lutente resetta un form La finestra viene ridimensionata Lutente seleziona il campo Lutente sottomette il form Lutente esce dalla pagina JavaScript Event handler onLoad onMouseDown onMouseMove onMouseOut onMouseOver onMouseUp onMove onReset onResize onSelect onSubmit onUnload 41

Gestori di evento Come si detto, per agganciare un gestore di evento ad un evento si utilizzano gli attributi degli elementi HTML La sintassi :
<tag eventHandler="JavaScript Code">

Esempio:
<input type="button" value="Calculate" onClick=alert("Calcolo")/>

E possibile inserire pi istruzioni in sequenza, ma meglio definire delle funzioni (in testata) E necessario alternare doppi apici e apice singolo
<input type="button" value="Apriti sesamo!" onClick="window.open('myDoc.html','newWin')">
JavaScript 42

Esempio: calcolatrice
<head> <script type="text/javascript"> function compute(f) { if (confirm("Sei sicuro?")); f.result.value = eval(f.expr.value); else alert(Ok come non detto"); } </script> </head> <body> <form> Inserisci unespressione: <input type="text" name="expr" size=15 > <input type="button" value="Calcola" onClick="compute(this.form)"><br/> Risultato: <input type="text" name="result" size=15 > </form> </body>
JavaScript 43

Esplorare il DOM: document Il punto di partenza per accedere al Documento Object Model (DOM) della pagina loggetto document Document espone 4 collezioni di oggetti che rappresentano gli elementi di primo livello: anchors[] forms[] images[] links[] Laccesso agli elementi delle collezioni pu avvenire per indice (ordine di definizione nella pagina) o per nome (attributo name dellelemento): document.links[0] document.links["nomelink"] In base allequivalenza tra array associativi e oggetti la seconda forma pu essere scritta anche come document.nomelink
JavaScript 44

Document - 2 Metodi: getElementById(): restituisce un riferimento al primo oggetto della pagina avente lid specificato come argomento write(): scrive un pezzo di testo nel documento writeln(): come write() ma aggiunge un a capo Propriet:
bgcolor: colore di sfondo fgcolor: colore di primo piano lastModified: data e ora di ultima modifica cookie: tutti i cookies associati al document

rappresentati da una stringa di coppie: nome-valore title: titolo del documento URL: url del documento
JavaScript 45

Form - 1 Un documento pu contenere pi oggetti form Un oggetto form pu essere referenziato con il suo nome o mediante il vettore forms[] esposto da document:
document.nomeForm document.forms[n] document.forms["nomeForm"]

Gli elementi del form possono essere referenziati con il loro nome o mediante il vettore elements[]
document.nomeForm.nomeElemento document.forms[n].elements[m] document.forms["nomeForm"].elements["nomeElem"]

Ogni elemento ha una propriet form che permette di accedere al form che lo contiene (vedi nellesempio precedente this.form)
JavaScript 46

Form - 2 Per ogni elemento del form esistono propriet corrispondenti ai vari attributi: id, name, value, type, className
<form name="myForm"> Form name: <input type="text" name="text1" value=test"> <br/> <input name="button1" type="button" value=Mostra il nome del form" onclick=document.myForm.text1.value= document.myForm.name"> </form>
In alternativa potevamo scrivere:

onclick=this.form.text1.value= this.form.name">
JavaScript 47

Form - 3
Propriet: action: riflette lattributo action elements: vettore contenente gli elementi della form length: numero di elementi nella form method: riflette lattributo method name: nome del form target: riflette lattributo target

Metodi: reset(): resetta il form submit(): esegue il submit Eventi: onreset: quando il form viene resettato onsubmit: quando viene eseguito il submit del form
JavaScript 48

I controlli di un form Ogni tipo di controllo (widget) che pu entrare a far parte di un form rappresentato da un oggetto JavaScript: Text: <input type =text> Checkbox: <input type=checkbox> Radio: <input type=radio> Button: <input type=button> o <button> Hidden: <input type=hidden> File: <input type=file> Password: <input type=password> Textarea: <textarea> Submit: <input type=submit> Reset: <input type=reset>
JavaScript 49

Elementi comuni ai vari controlli Propriet: form: riferimento al form che contiene il controllo name: nome del controllo type: typo del controllo value: valore dellattributo value disabled: disabilitazione/abilitazione del controllo Metodi: blur() toglie il focus al controllo focus() d il focus al controllo click() simula il click del mouse sul controllo Eventi: onblur quando il controllo perde il focus onfocus quando il controllo prende il focus onclick quando lutente clicca sul controllo
JavaScript 50

Loggetto Text (e Password) Propriet (get/set): defaultValue valore di default Disabled disabilitazione / abilitazione del campo maxLength numero massimo di caratteri readOnly sola lettura / lettura e scrittura size dimensione del controllo Metodi: select() seleziona una parte di testo

JavaScript

51

Oggetti Checkbox e Radio Propriet (get/set): checked: dice se il box e spuntato defaultChecked: impostazione di default

JavaScript

52

Validazione di un form Uno degli utilizzi pi frequenti di JavaScript nellambito della validazione dei campi di un form Riduce il carico delle applicazioni server side filtrando linput Riduce il ritardo in caso di errori di inserimento dellutente Semplifica le applicazioni server side Consente di introdurre dinamicit allinterfaccia web Generalmente si valida un form in due momenti: Durante linserimento utilizzando levento onChange() sui vari controlli Al momento del submit utilizzando levento onClick() del bottone di submit o levento onSubmit() del form
JavaScript 53

Esempio di validazione - 1
<head> <script type="text/javascript"> function qty_check(item, min, max) { returnVal = false; if (parseInt(item.value) < min) or (parseInt(item.value) > max) alert(item.name+"deve essere fra "+min+" e "+max); else returnVal = true; return returnVal; } function validateAndSubmit(theForm) { if (qty_check(theform.quantit,0,999)) { alert("Ordine accettato"); return true; } else { alert("Ordine rifiutato"); return false; } } </script> </head>
JavaScript 54

Esempio di validazione - 2
<body> <form name="widget_order" action="lwapp.html" method="post"> Quantit da ordinare <input type="text" name="quantit" onchange="qty_check(this,0,999)"> <br/> <input type="submit" value="Trasmetti lordine" onclick="validateAndSubmit(this.form)"> </form> </body> <form name="widget_order" action="lwapp.html" method="post" onSubmit="return qty_check(this,0,999)"> ... <input type="submit" /> ... </form>
JavaScript 55

Esempio 2
<head> <script> function upperCase() { var val = document.myForm.firstName.value; document.myForm.firstName.value = val.toUpperCase(); val = document.myForm.lastName.value; document.myForm.lastName.value = val.toUpperCase(); } </script> </head> <body> <form name="myForm"> <b>Nome: </b> <input type="text" name="firstName" size="20" /><br/> <b>Cognome: </b> <input type="text" name="lastName" size="20"/> <p><input type="button" value=" Maiuscolo" onClick="upperCase()"/></p> </form> <body>
JavaScript 56

Riferimenti Javascript: http://javascript.html.it/ Tutorial (JavaScript e HTML DOM): http://www.w3schools.com/js/default.asp http://www.w3schools.com/jsref/default.asp

JavaScript

57

Ajax

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 3.05.Ajax.pdf Versione elettronica: 3.05.Ajax-2p.pdf
1

Un nuovo modello Lutilizzo di DHTML (JavaScript/Eventi + DOM + CSS) delinea un nuovo modello per applicazioni Web => Modello a eventi simile a quello delle applicazioni

tradizionali

Abbiamo per due livelli di eventi: Eventi locali che portano ad una modifica diretta DOM da parte di Javascript e quindi a cambiamento locale della pagina Eventi remoti ottenuti tramite ricaricamento della pagina che viene modificata lato server in base ai parametri passati in GET o POST Il ricaricamento di pagina per rispondere a interazione con lutente prende il nome di postback
2

Modello a eventi a due livelli


Browser Web Container

Risposta locale JavaScript Postback JSP

Web Server

DOM

Bean

Esempio di evento remoto - 1 Consideriamo un form in cui compaiono due tendine che servono a selezionare il comune di nascita di una persona Una con province Una con comuni
Si vuole fare in modo che scegliendo la provincia nella prima tendina, nella seconda appaiano solo i comuni di quella provincia

Esempio di evento remoto - 2 Per realizzare questa interazione si pu procedere in questo modo: Si crea JSP che inserisce nella tendina dei comuni lelenco di quelli che appartengono alla provincia passata come parametro Si definisce un evento onchange collegato allelemento select delle province Lo script collegato ad onchange forza il ricaricamento della pagina con un POST (postback) Quindi: Lutente sceglie una provincia Viene invocata la JSP con parametro provincia impostato al valore scelto dallutente La pagina restituita contiene nella tendina dei comuni lelenco di quelli che appartengono alla provincia scelta
5

Limiti del modello a ricaricamento di pagina Quando lavoriamo con applicazioni desktop siamo abituati a un elevato livello di interattivit: applicazioni reagiscono in modo rapido ed intuitivo ai comandi Le applicazioni Web tradizionali espongono invece un modello di interazione rigido Modello Click, wait, and refresh necessario refresh della pagina da parte del server per la gestione di qualunque evento
(sottomissione di dati tramite form, visita di link per ottenere informazioni di interesse, )

ancora modello sincrono: lutente effettua una richiesta e deve attendere la risposta da parte del server
6

Modello di interazione classico

Attesa dell'utente

AJAX e asincronicit Il modello AJAX nato per superare queste limitazioni AJAX non un acronimo ma spesso viene interpretato come Asynchronous Javascript And Xml basato su tecnologie standard: JavaScript DOM XML HTML CSS

AJAX e asincronicit AJAX punta a supportare applicazioni user friendly con elevata interattivit (si usa spesso il termine RIA Rich Interface Application) Lidea alla base di AJAX quella di consentire agli script JavaScript di interagire direttamente con il server Si usa oggetto JavaScript XMLHttpRequest Consente di ottenere dati dal server senza la necessit di ricaricare lintera pagina Realizza una comunicazione asincrona fra client e server: il client non interrompe interazione con utente anche quando in attesa di risposte dal server
9

Modello di interazione con AJAX

10

Tipica sequenza AJAX Si verifica un evento determinato dallinterazione fra utente e pagina Web Levento comporta lesecuzione di una funzione JavaScript in cui: Si istanzia un oggetto di tipo XMLHttpRequest Si configura XMLHttpRequest: si associa una funzione di callback, si effettua configurazione, Si effettua chiamata asincrona al server Il server elabora la richiesta e risponde al client Il browser invoca la funzione di callback che: elabora il risultato aggiorna il DOM della pagina per mostrare i risultati dellelaborazione
11

XMLHttpRequest Loggetto XMLHttpRequest effettua la richiesta di una risorsa via HTTP a server Web Non sostituisce lURI della propria richiesta allURI corrente Non provoca un cambio di pagina Pu inviare eventuali informazioni (parametri) sotto forma di variabili (come una form) Pu effettuare sia richieste GET che POST Le richieste possono essere di tipo Sincrono: blocca flusso di esecuzione del codice Javascript (ci interessa poco) Asincrono: non interrompe il flusso di esecuzione del codice Javascript n le operazioni dell'utente sulla pagina
12

Creazione di unistanza I browser pi recenti (Firefox 1+, Opera 7+, Safari, Internet Explorer 7 e 8) supportano XMLHttpRequest come oggetto nativo In questo caso (oggi il pi comune) le cose sono molto semplici: var xhr = new XMLHttpRequest(); La gestione della compatibilit con browser pi vecchi complica un po le cose; la esamineremo in seguito per non rendere difficile la comprensione del modello Attenzione: per motivi di sicurezza XmlHttpRequest pu essere utilizzata solo verso dominio da cui proviene la risorsa che la utilizza

13

Metodi di XMLHttpRequest La lista dei metodi disponibili diversa da browser a browser In genere si usano solo quelli presenti in Safari (sottoinsieme pi limitato, ma comune a tutti i browser che supportano AJAX): open() setRequestHeader() send() getResponseHeader() getAllResponseHeaders() abort()

14

Metodo open() open() ha lo scopo di inizializzare la richiesta da formulare al server Lo standard W3C prevede 5 parametri, di cui 3 opzionali:
open (method, uri [,async][,user][,password])

Luso pi comune per AJAX ne prevede 3, di cui uno comunemente fissato:


open (method, uri, true) Dove: method: stringa e assume il valore get o post uri: stringa che identifica la risorsa da ottenere (URL assoluto o relativo) async: valore booleano che deve essere impostato come true per indicare al metodo che la richiesta da effettuare di tipo asincrono
15

Metodi setRequestHeader() e send()


setRequestHeader(nomeheader, valore) consente di impostare gli header HTTP della richiesta da inviare Viene invocata pi volte, una per ogni header da impostare Per una richiesta GET gli header sono opzionali Sono invece necessari per impostare codifica utilizzata nelle richieste POST comunque importante impostare lheader connection al valore close per evitare di aprire troppe connessioni send(body): consente di inviare la richiesta al server Non bloccante se il parametro async di open stato impostato a true Prende come parametro una stringa che costituisce il body della richiesta HTTP

16

Esempi
GET

var xhr = new XMLHttpRequest(); xhr.open("get","pagina.html?p1=v1&p2=v2", true ); xhr.setRequestHeader("connection", "close"); xhr.send(null);


POST

var xhr = new XMLHttpRequest(); xhr.open("post","pagina.html", true ); xhr.setRequestHeader("content-type", "x-www-form-urlencoded"); xhr.setRequestHeader("connection","close"); xhr.send("p1=v1&p2=v2");

17

Propriet di XMLHttpRequest

Stato e risultati della richiesta vengono memorizzati


dallinterprete Javascript allinterno delloggetto XmlHttpRequest durante la sua esecuzione Le propriet comunemente supportate dai vari browser sono: readyState onreadystatechange status statusText responseText responseXML

18

Propriet ReadyState Propriet in sola lettura di tipo intero che consente di leggere in ogni momento lo stato della richiesta ammette 5 valori: 0: uninitialized - l'oggetto esiste, ma non stato richiamato open() 1: open - stato invocato il metodo open(), ma send() non ha ancora effettuato l'invio dati 2: sent - metodo send() stato eseguito e ha effettuato la richiesta 3: receiving la risposta ha iniziato ad arrivare 4: loaded - l'operazione stata completata Attenzione: Questo ordine non sempre identico e non sfruttabile allo stesso modo su tutti i browser L'unico stato supportato da tutti i browser il 4
19

Propriet onreadystatechange

Come si detto l'esecuzione del codice non si blocca sulla send() in attesa dei risultati Per gestire la risposta si deve quindi adottare un approccio a eventi Occorre registrare una funzione di callback che viene richiamata in modo asincrono ad ogni cambio di stato
della richiesta La sintassi
xhr.onreadystatechange = nomefunzione xhr.onreadystatechange = function(){istruzioni}
Oppure!

Attenzione: per evitare comportamenti imprevedibili lassegnamento va fatto prima del send()
20

Propriet status e statusText status contiene un valore intero corrispondente al codice HTTP dellesito della richiesta: 200 in caso di successo (lunico in base al quale i dati
ricevuti in risposta possono essere ritenuti corretti e significativi)

Possibili altri valori (in particolare derrore: 403, 404, 500, ) statusText contiene invece una descrizione testuale del codice HTTP restituito dal server Esempio: if ( xhr.status != 200 ) alert( xhr.statusText );

21

Propriet responseText e responseXML Contengono i dati restituiti dal server responseText: stringa che contiene il body della risposta HTTP disponibile solo a interazione ultimata (readystate==4) responseXML: body della risposta convertito in documento XML (se possibile) consente la navigazione via Javascript pu essere null se i dati restituiti non sono un documento XML ben formato

22

Metodi getResponseHeader(), getAllResponseHeaders() Consentono di leggere gli header HTTP che descrivono la risposta del server Sono utilizzabili solo nella funzione di callback Possono essere invocati sicuramente in modo safe solo a richiesta conclusa (readystate==4) In alcuni browser possono essere invocati anche in fase di ricezione della risposta (readystate==3) Sintassi: getAllResponseHeaders() getResponseHeader(header_name)

23

Ruolo della funzione di callback Viene invocata ad ogni variazione di readystate Usa readystate per leggere lo stato di avanzamento della richiesta Usa status per verificare lesito della richiesta Ha accesso agli header di risposta rilasciati dal server con getAllResponseHeaders() e getResponseHeader() Se readystate==4 pu leggere il contenuto della risposta con responseText e responseXML

24

Esempio Attenzione: anche se la funzione assegnata a una propriet di xhr, dal suo interno NON possibile riferirsi a xhr con this. Questo perch la funzione viene

richiamata in modo asincrono dallinterprete

Pu usare le variabili dello scope in cui si trova:


xhr = new XmlHttpRequest(); ... xhr.onreadystatechange = function() { if ( xhr.readyState == 4 && xhr.status == 200 ) alert ("Risposta: "+ xhr.responseText ); };

25

Vantaggi e svantaggi di AJAX Si guadagna in espressivit, ma si perde la linearit dell'interazione Mentre l'utente all'interno della stessa pagina le richieste sul server possono essere numerose e indipendenti Il tempo di attesa passa in secondo piano o non avvertito affatto Possibili criticit sia per lutente che per lo sviluppatore percezione che non stia accadendo nulla (sito che non risponde) problemi nel gestire un modello di elaborazione che ha bisogno di aspettare i risultati delle richieste precedenti
26

Criticit nellinterazione con lutente Le richieste AJAX permettono allutente di continuare a interagire con la pagina Ma non necessariamente lo informano di che cosa stia succedendo e possono durare troppo! Leffetto un possibile disorientamento dellutente Dobbiamo quindi agire su due fronti: Rendere visibile in qualche modo landamento della chiamata (barre di scorrimento, info utente, )

Interrompere le richieste che non terminano in tempo utile per sovraccarichi del server o
momentanei problemi di rete (timeout)

27

Il metodo abort() abort() consente linterruzione delle operazioni di invio o ricezione non ha bisogno di parametri termina immediatamente la trasmissione dati Attenzione: non ha senso invocarlo dentro la funzione di callback
Se readyState non cambia, il metodo non viene richiamato; readyState non cambia quando la risposta si fa attendere

Si crea unaltra funzione da far richiamare in modo asincrono al sistema mediante il metodo
setTimeOut(funzioneAsincronaPerAbortire,timeOut)

Al suo interno si valuta se continuare lattesa o abortire loperazione


28

Gestione della compatibilit I browser pi recenti supportano XMLHttpRequest come oggetto nativo (Firefox, Opera 7+, Safari, Internet Explorer 7 e 8):
var xhr = new XMLHttpRequest();

Versioni precedenti di IE lo supportano come oggetto ActiveX, solo dalla versione 4 e in modi differenti a seconda della versioni:
var var var var var xhr xhr xhr xhr xhr = = = = = new new new new new ActiveXObject(Microsoft.XmlHttp) ActiveXObject(MSXML4.XmlHttp) ActiveXObject(MSXML3.XmlHttp) ActiveXObject(MSXML2.XmlHttp) ActiveXObject(MSXML.XmlHttp)

Esistono browser che non lo supportano affatto ed quindi bene prevedere una gestione alternativa
29

Gestione della compatibilit


Ad esempio, nella pratica industriale si usano tecniche come quella riportata qui sotto:
function myGetXmlHttpRequest() { var xhr = false; var activeXopt = new Array("Microsoft.XmlHttp", "MSXML4.XmlHttp", "MSXML3.XmlHttp", "MSXML2.XmlHttp", "MSXML.XmlHttp" ); // prima come oggetto nativo try xhr = new XMLHttpRequest(); catch (e) { } // poi come oggetto activeX dal pi al meno recente if (! xhr) { var created = false; for (var i = 0;i < activeXopt.length && !created;i++) { try { xhr = new ActiveXObject( activeXopt[i] ); created = true; } catch (e) { } } } return xhr; } 30

Aspetti critici per il programmatore accresciuta la complessit delle Web Application La logica di presentazione ripartita fra client-side e server-side Le applicazioni AJAX pongono problemi di debug, test e mantenimento Il test di codice JavaScript complesso Il codice JavaScript ha problemi di modularit I toolkit AJAX sono molteplici e solo recentemente hanno raggiunto una discreta maturit (ad es. Mootools, Scriptacolus, Prototype, ) Mancanza di standardizzazione di XMLHttpRequest e assenza di supporto nei vecchi browser

31

Gestire la risposta Spesso i dati scambiati fra client e server sono codificati in XML AJAX come abbiamo visto in grado di ricevere documenti XML In particolare possibile elaborare i documenti XML ricevuti utilizzando API W3C DOM Il modo con cui operiamo su dati in formato XML analogo a quello che abbiamo visto per ambienti Java Usiamo un parser e accediamo agli elementi di nostro interesse Per visualizzare i contenuti ricevuti modifichiamo il DOM della pagina HTML

32

Esempio: Scegliamo un nome da una lista e mostriamo i suoi dati tramite Ajax
<html> <head> <script src="selectmanager_xml.js"></script> </head> <body> <form action=""> Scegli un contatto: <select name=manager onchange="showManager(this.value)"> <option value=Carlo11">Carlo Rossi</option> <option value=Anna23">Anna Bianchi</option> <option value=Giovanni75">Giovanni Verdi</option> </select></form> <b><span id="companyname"></span></b><br/> <span id="contactname"></span><br/> <span id="address"></span> <span id="city"></span><br/> <span id="country"></span> </body> </html>

Lista di selezione

Area in cui mostrare i risultati

33

Esempio - 2 Ipotizziamo che i dati sui contatti siano contenuti in un database. Il server: riceve una request con lidentificativo della persona interroga il database restituisce un file XML con i dati richiesti

<?xml version=1.0 encoding=UTF-16?> <company> <compname>Microsoft</compname> <contname>Anna Bianchi</contname> <address>Viale Risorgimento 2</address> <city>Bologna</city> <country>Italy</country> </company>
34

Esempio: selectmanager_xml.js
var xmlHttp; function showManager(str) { xmlHttp=new XMLHttpRequest(); var url="getmanager_xml.jsp?q="+str; xmlHttp.onreadystatechange=stateChanged; xmlHttp.open("GET",url,true); xmlHttp.send(null); } function stateChanged() { if (xmlHttp.readyState==4) { var xmlDoc=xmlHttp.responseXML.documentElement; var compEl=xmlDoc.getElementsByTagName("compname")[0]; var comName = compEl.childNodes[0].nodeValue; document.getElementById("companyname").innerHTML= compName; ... } }
35

XML la scelta giusta? Secondo uninterpretazione molto comune la X di AJAX sta per XML Abbiamo per visto nellesempio precedente che lutilizzo di XML come formato di scambio fra client e server porta alla scrittura di codice molto prolisso Difficile da leggere e da manutenere Oneroso in termini di risorse di elaborazione (non dimentichiamo che JavaScript interpretato) Esiste un formato pi efficiente e semplice da manipolare per scambiare informazioni tramite AJAX? La risposta s; questo formato in pratica quello pi utilizzato oggi
36

JSON JSON lacronimo di JavaScript Object Notation Formato per lo scambio di dati, considerato molto pi comodo di XML Leggero in termini di quantit di dati scambiati Molto semplice da elaborare per un linguaggio di programmazione (in particolare per JavaScript) Ragionevolmente semplice da leggere per operatore umano largamente supportato dai maggiori linguaggi di programmazione Si basa sulla notazione usata per le costanti oggetto (object literal) e le costanti array (array literal) in JavaScript
37

Oggetti e costanti oggetto In Javascript possibile creare un oggetto in base a una costante oggetto var Beatles = { "Paese" : "Inghilterra", "AnnoFormazione" : 1959, "TipoMusica" : "Rock" } Che equivale in tutto e per tutto a: var Beatles = new Object(); Beatles.Paese = "England"; Beatles.AnnoFormazione = 1959; Beatles.TipoMusica = "Rock";
38

Array e costanti array In modo analogo possibile creare un array utilizzando una costante di tipo array:
var Membri = ["Paul","John","George","Ringo"];

Che equivale in tutto e per tutto a


var Membri = new Array("Paul","John","George","Ringo");

Possiamo anche avere oggetti che contengono array:


var Beatles = { Paese" : Inghilterra", AnnoFormazione" : 1959, TipoMusica" : "Rock", "Membri" : ["Paul","John","George","Ringo"] }
39

Array di oggetti infine possibile definire array di oggetti:


var Rockbands = [ { "Nome" : "Beatles", Paese" : Inghilterra", AnnoFormazione" : 1959, TipoMusica" : "Rock", "Membri" : ["Paul","John","George","Ringo"] }, { "Nome" : "Rolling Stones", Paese" : Inghilterra", AnnoFormazione" : 1962, TipoMusica" : "Rock", "Membri" : ["Mick","Keith","Charlie","Bill"] } ]
40

La sintassi JSON La sintassi JSON si basa su quella delle costanti oggetto e array di Javascript Un oggetto JSON una stringa che equivale a una costante oggetto di JavaScript
Costante oggetto Javascript

{ Paese" : Inghilterra", AnnoFormazione" : 1959, TipoMusica" : "Rock'n'Roll", "Membri" : ["Paul","John","George","Ringo"] }

Oggetto JSON

'{"Paese" : "Inghilterra", "AnnoFormazione" : 1959, "TipoMusica" : "Rock'n'Roll", "Membri" : ["Paul","John","George","Ringo"] }'


41

Da stringa JSON a oggetto JavaScript mette a disposizione la funzione eval() che invoca il compilatore e traduce la stringa passata come parametro La sintassi di JSON un sottoinsieme di JavaScript: con eval possiamo trasformare una stringa JSON in un oggetto La sintassi della stringa passata a eval deve essere '(espressione)': dobbiamo quindi racchiudere la stringa JSON fra parentesi tonde
var s ='{ "Paese" : "Inghilterra", "AnnoFormazione" : 1959, "TipoMusica" : "Rock", "Membri" : ["Paul","John","George","Ringo"]}'; var o = eval('('+s+')');
42

Esempio completo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title> Esempio JSON </title> <script> var s ='{ "Paese" : "Inghilterra", "AnnoFormazione" : 1959, "TipoMusica" : "Rock", "Membri" : ["Paul","John","George","Ringo"]}'; var o = eval('('+s+')'); </script> </head> <body> <p onclick='alert(o.Paese)'> Clicca </p> </body> </html>

43

Parser JSON eval() presenta rischi di sicurezza: stringa passata come parametro potrebbe contenere codice malevolo Di solito si preferisce utilizzare parser appositi che traducono solo oggetti JSON e non espressioni JavaScript di qualunque tipo Il pi diffuso quello messo disposizione dal sito www.json.org (il punto di riferimento su JSON) http://www.json.org/json.js Il parser espone loggetto JSON con due metodi: JSON.parse(strJSON): converte una stringa JSON in un oggetto JavaScript JSON.stringify(objJSON): converte un oggetto JavaScript in una stringa JSON
44

JSON e AJAX - 1 Sul lato client: Si crea un oggetto JavaScript e si riempiono le sue propriet con le informazioni necessarie Si usa JSON.stringify() per convertire loggetto in stringa JSON Si usa la funzione encodeURIComponent() per convertire la stringa in un formato utilizzabile in una richiesta HTTP Si manda la stringa al server mediante XMLHttpRequest (stringa viene passata come variabile con GET o POST)

45

JSON e AJAX - 2 Sul lato server: Si decodifica la stringa JSON e la si trasforma in oggetto Java utilizzando un apposito parser (si trova
sempre su www.json.org)

Si elabora loggetto Si crea un nuovo oggetto Java che contiene dati della risposta Si trasforma loggetto Java in stringa JSON usando il parser Si trasmette la stringa JSON al client nel corpo della risposta HTTP: response.out.write(strJSON);

46

JSON e AJAX - 3 Sul lato client, allatto della ricezione: Si converte la stringa JSON in un oggetto Javascript usando JSON.parse() Si usa liberamente loggetto per gli scopi desiderati

47

Riassumendo AJAX consente gestione asincrona AJAX aggiunge un nuovo elemento al modello a eventi Luso di XmlHttpRequest rappresenta una modalit alternativa per gestire gli eventi remoti Abbiamo quindi: Una modalit per gestire gli eventi a livello locale Due modalit per gestire gli eventi remoti (postback e XmlHttpRequest) Si pu adottare la tecnologia in modo pi radicale e utilizzare solo AJAX eliminando i caricamenti di pagina (Single Page Applications) Nei casi pi comuni per AJAX e la modalit di navigazione tradizionale convivono
48

Modello eventi a due livelli con AJAX


Browser Web Container

XmlHttpRequest JavaScript

Servlet

Postback JSP Web Server

Risposta locale

DOM

Bean

49

Model View Controller

J2EE controller Session Bean

Java Spring MVC Java Server Faces(JSF) Gestione della Persistenza

Java Model 2, J2EE e MVC

Hibernate!!!

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 4.01.J2EE.pdf Versione elettronica: 4.01.J2EE-2p.pdf
1

Java Model 2
Nel progetto di applicazioni Web in Java, due modelli di ampio uso e di

riferimento: Model 1 e Model 2 Come gi detto, Model 1 un pattern semplice in cui codice responsabile
per presentazione contenuti mescolato con logica di business Suggerito solo per piccole applicazioni (sta diventando obsoleto

nella pratica industriale)

Model 2 come design pattern pi complesso e articolato che separa chiaramente livello presentazione dei contenuti dalla logica
utilizzata per manipolare e processare contenuti stessi
Suggerito per applicazioni di medio-grandi dimensioni Visto che Model 2 preme per separazione netta fra logica di business e di presentazione, usualmente

associato con paradigma Model-View-Controller (MVC)

Mai specificato in modo definitivo e mandatory come realizzare tecnicamente modello MVC in tecnologie Java Battaglia delle implementazioni Diverse soluzioni possibili (ad es. Java BluePrints suggerisce adozione di
Enterprise Java Bean EJB - per realizzare modello MVC)
2

Java Model 2 Il termine Model 2 deriva da un paper di Govind (JavaWorld99): Proposta di separazione logica di business (servlet) da presentazione (JSP), con le due parti viste come "View" e "Controller" rispettivamente
Parte di "Model" lasciata non specificata nellarchitettura proposta da Govind (idea che ogni struttura dati possa essere adatta a
realizzare modello: da Vector list a db relazionale)

Tecnologie alternative: ad esempio, Apache Struts (Marzo


2000) supporta EntityBean EJB)

divisione fra View e Controller; ancora una volta "Model" lasciato indefinito (opzioni citate: JDBC ed
altre alternative recenti, fra cui Java Server Faces

Spesso oggi due termini Model 2 e MVC vengono (impropriamente) usati come sinonimi fra gli sviluppatori
3

Architettura Model-View-Controller

Architettura adatta per applicazioni Web interattive (altre Model rappresenta livello dei dati, incluse operazioni per accesso e
modifica. Model deve notificare view associate quando modello viene modificato e deve supportare:

tecnologie e modelli pi adatti per servizi asincroni, vedi Message Driven Bean e Java Messaging Service - JMS)

possibilit per view di interrogare stato di model possibilit per controller di accedere alle funzionalit incapsulate da model

View si occupa di rendering dei contenuti di model. Accede ai dati


tramite model e specifica come dati debbano essere presentati aggiorna presentazione dati quando modello cambia

gira input utente verso controller

Controller definisce comportamento dellapplicazione


fa dispatching di richieste utente e seleziona view per presentazione interpreta input utente e lo mappa su azioni che devono essere eseguite da model (in una GUI stand-alone, input come click e selezione
4

menu; in una applicazione Web, richieste HTTP GET/POST)

Java Model 2

Mapping possibile su applicazioni Web Java-based


In applicazioni Web conformi a Model 2, richieste del browser cliente vengono passate a controller (usualmente implementato da servlet oppure EJB Session Bean oppure)

Controller si occupa di eseguire logica business necessaria per


ottenere il contenuto da mostrare. Controller mette il contenuto
messaggio e decide a quale view (usualmente implementata da JSP) passare la richiesta
(usualmente sotto forma di JavaBean o Plain Old Java Object - POJO) in

View si occupa del rendering contenuto (ad es. stampa dei valori
contenuti in struttura dati o bean, ma anche operazioni pi complesse come invocazione metodi per ottenere dati)

Architettura Model-View-Controller Model-View-Controller (architettura generale)


Eventi e invocazioni
In Java Model 2, tipicamente

controller come EJB Session Bean o servlet e view come JSP

Aldil di MVC, in generale, perch application server? Vi ricordate discorsi su architetture multi-tier, vero?

Complessit del middle tier server Duplicazione dei servizi di sistema per la maggior
parte delle applicazioni enterprise
Controllo concorrenza, transazioni Load-balancing, sicurezza Gestione risorse, connection pooling

Come risolvere il problema?

Container condiviso che gestisce i servizi di sistema Proprietario vs. basato su standard aperti?
7

Soluzioni a Container: Proprietarie vs. Standard-based


Soluzioni proprietarie:
Usano il modello componente-container Componenti per la business logic Container per fornire servizi di sistema Il contratto componenti-container ben definito, ma in modo proprietario (problema di vendor lock-in) Esempi: Tuxedo, .NET

Soluzioni basate su standard aperti


Usano il modello componente-container e il container fornisce i servizi di sistema in modo ben definito in

accordo a standard industriali

Ad es. J2EE e Java Specification Request (JSR)


(tra laltro, anche supporto a portabilit di codice perch basato su bytecode Java e API di programmazione definite in standard aperti)
8

Che cos J2EE?


Piattaforma open e standard per lo sviluppo, il deployment e la gestione di applicazioni enterprise n-tier, Web-enabled, server-centric e basate su componenti

Varie Edizioni della Piattaforma Java


Java 2 Platform Micro Edition (J2METM)

Optional Packages Optional Packages

Java 2 Enterprise Edition (J2EE)

Java 2 Standard Edition (J2SE)

Personal Basis Profile

Personal Profile

Foundation Profile CDC

MIDP CLDC KVM


Java Card APIs CardVM

JVM

10

Architettura J2EE per Application Server


In questo corso non ci occuperemo dettagliatamente del container J2EE in termini generali (vedi corso di Sistemi Distribuiti M)
Ma per capire alcune direzioni di implementazione di Java Model 2, di che comprensione del modello Applicazioni B2B Applicazioni B2C Web Services Applicazioni Esistenti

cosa si occupa il container J2EE, e le differenze rispetto ad approcci a container leggero come Spring, almeno dobbiamo avere parziale

Application Server
Applicazioni Wireless

Enterprise Information Systems


11

Architettura J2EE per Applicazioni N-tier


Componenti EJB come possibile tecnologia implementativa del tier di business logic, o se preferite della parte controller di MVC

Web Tier

EJB Tier

12

Parentesi su Modelli a Contenimento Che cosa vi ricordate di modelli componenti-container? Esempi di tecnologie a componenti?

CONTENIMENTO
Spesso molte funzionalit possono essere non controllate direttamente ma lasciate come responsabilit ad una entit delegata supervisore (contenitore) che se ne occupa spesso introducendo politiche di default evitando che si verifichino errori controllando eventuali eventi I contenitori (entit dette anche CONTAINER, ENGINE, MIDDLEWARE, ) possono occuparsi di azioni automatiche da cui viene sgravato lutilizzatore che deve specificare solo la parte contenuta tipicamente di alto livello, non ripetitiva, fortemente dipendente dalla logica applicativa
13

Modelli a Contenimento
CONTAINER
Un servizio utente potrebbe essere integrato in un di molti aspetti diversi
CONTAINER

ambiente (middleware) che si occupa in modo autonomo

Richieste
Cliente 1

OPERAZIONI VARIE

Vedrete ad esempio CORBA - tutti aspetti C/S Engine per framework a GUI Container per servlet

Cliente 2

OPERAZIONE SEMPLIFICATA
Cliente i Cliente i Cliente i

Container possono ospitare componenti pi trasportabili, riutilizzabili e mobili

14

IL SISTEMA EJB SI OCCUPA DI:

Delega al Container
Il container pu fornire automaticamente molte delle funzioni per supportare il servizio applicativo verso lutente

Supporto al ciclo di vita


Attivazione/deattivazione del servitore Mantenimento dello stato (durata della sessione?) Persistenza trasparente e recupero delle informazioni (interfaccia
DB)

Supporto al sistema dei nomi


Discovery del servitore/servizio Federazione con altri container

Supporto alla qualit del servizio


Tolleranza ai guasti, selezione tra possibili deployment Controllo della QoS richiesta e ottenuta

Sicurezza

15

Perch J2EE?
Elementi costitutivi di J2EE: Specifiche aperte di API e tecnologie
Piattaforma per lo sviluppo e il deployment Implementazione standard di riferimento e productionquality Compatibility Test Suite (CTS) J2EE brand

Motivazioni della scelta:


Possibilit di uso di qualunque implementazione J2EE Sia implementazione aperta, standard e productionquality a utilizzo gratuito per sviluppo/deployment Sia prodotti commerciali J2EE-compliant per alta scalabilit e tolleranza ai guasti Ampia disponibilit di risorse di community per J2EE (libri, articoli, tutorial, esempi di codice, linee guida per best practice, )
16

Perch J2EE?
Possibilit di utilizzo di componenti di business offerti da terze parti Vendor che lavorano insieme sulle specifiche e poi competono

sulle implementazioni

Nelle aree specifiche di scalabilit, performance, affidabilit, disponibilit, strumenti di supporto a gestione e sviluppo, Spazio per innovare pur mantenendo portabilit delle applicazioni Nessuna necessit di creare/mantenere API proprietarie

Portabilit delle applicazioni


Diverse scelte implementative sono possibili in dipendenza da svariati requisiti prezzo, scalabilit (da singola CPU a cluster), reliability, performance, strumenti, Ampia comunit di sviluppatori
17

EJB in una slide Tecnologia per componenti server-side Sviluppo e deployment semplificato di applicazioni Java:
Distribuite, con supporto alle transazioni, multi-tier, portabili, scalabili, sicure,

Porta e amplifica i benefici del modello a componenti sul lato server Separazione fra logica di business e codice di sistema

deployment-time

modelli alternativi, come container leggero Spring) Rende possibile (e semplice) la configurazione a
Deployment descriptor

Container per la fornitura dei servizi di sistema Modello a container pesante (contrapposto a possibili

18

Architettura EJB
Idea di base: container pesante attivo allinterno di un EJB Server

(Application Server)

Cliente pu interagire remotamente con componente EJB tramite

interfacce ben definite passando SEMPRE attraverso container

Modello EJB 2.x


19

Principali Componenti EJB

Quelli di maggiore interesse per il corso, ovvero SessionBean (stateless e stateful) e parzialmente EnityBean per persistenza saranno descritti in seguito.

20

Ciclo di Vita delle Applicazioni J2EE


Sviluppo e compilazione del codice dei componenti Servlet, JSP, EJB Scrittura di deployment descriptor per i componenti Da JavaEE5, possibilit di utilizzo delle annotazioni Assemblaggio di componenti in package pronti per il deployment Deployment del package sul server

21

Descrittori di Deployment Forniscono istruzioni al container su come gestire e controllare il comportamento (anche runtime) di componenti J2EE
Transazioni Sicurezza Persistenza

Permettono la personalizzazione tramite specifica dichiarativa (NO personalizzazione tramite programmazione) Semplificano portabilit del codice Sostituiti o sostituibili con annotazioni a partire da Java5

22

J2EE per Applicazioni N-tier

Modello 4-tier e applicazioni J2EE


Cliente HTML, JSP/Servlet, EJB, JDBC/Connector

Modello 3-tier e applicazioni J2EE


Cliente HTML, JSP/Servlet, JDBC

Modello 3-tier e applicazioni J2EE


Applicazioni standalone EJB client-side, EJB, JDBC/Connector

Applicazioni enterprise B2B


Interazioni tra piattaforme J2EE tramite messaggi JMS o XML-based

23

Definizione di EJB (dalle specifiche)


The Enterprise JavaBeans architecture is a component architecture for the development and deployment of component-based distributed business applications" Applications written using the Enterprise JavaBeans architecture are scalable, transactional, and multi-user secure" These applications may be written once, then deployed on any server platform that supports the Enterprise JavaBeans specification"

Una tecnologia per componenti server-side Supporto allo sviluppo e al deployment di applicazioni distribuite Java enterprise che siano:

multi-tier, transazionali, portabili, scalabili, sicure,

24

24

EJB: Principi di Design

coupled)

Applicazioni EJB e i loro componenti devono essere debolmente accoppiati (loosely


Comportamento di EJB definito tramite interfacce

Applicazioni EJB NON si occupano della

gestione delle risorse Applicazioni EJB sono N-tier

Session tier come API verso lapplicazione Entity tier come API verso le sorgenti dati

25

25

Scarso Accoppiamento e Interfacce

Scarso accoppiamento (loose coupling)


Supporto allintegrazione di componenti da vendor differenti Componenti EJB riferiscono altri componenti e servizi attraverso modi e interfacce predefiniti nelle specifiche

visibilit approfondite dellambiente di esecuzione ( sempre auspicabile?)

Lo sviluppo di componenti EJB NON richiede conoscenza e

Applicazioni enterprise possono essere assemblate tramite semplice composizione di componenti separati

Interazioni di componenti EJB con clienti sono

specificate completamente come interfacce Java


Interfacce espongono i metodi che i clienti possono invocare, definendo cos un contratto Implementazione nascosta ai clienti Supporto a portabilit e modularit
26
26

Gestione Risorse e Container

Gestione risorse
Componenti EJB accedono risorse esterne (database, sistemi legacy, ) tramite loro container
Nessun bisogno di allocazione/deallocazione esplicita delle risorse da parte del programmatore

La gestione delle risorse compito del container, con obiettivi di massima efficienza
Container tipic. configurato da amministratori di sistema

Container fornisce servizi di sistema


- Sicurezza - Connection pooling - Threading Gli sviluppatori di applicazioni specificano requisiti in modo dichiarativo (tramite deployment descriptor o annotazioni)

27
27

Persistenza Transazionalit Gestione lifecycle componenti

EJB e loro Utilizzo da parte di Clienti Differenti Componenti EJB possono essere utilizzati in diverse architetture N-tier e ovviamente da pi clienti, anche simultanei
Web Components

EJBs
Clienti EJB accedono dirett. al server EJB

Browser

Web Components

EJBs
DB & EIS Resources

Stand-alone Application Clienti EJB nel web-tier verso server EJB Clienti EJB standalone verso server EJB 28
28

Perch EJB? Benefici del modello a componenti per lato server Separazione fra logica di business e codice di sistema Framework di supporto per componenti portabili
su differenti server J2EE-compliant e su differenti ambienti

Supporto a facile configurazione a deployment-time


Deployment descriptor e annotazioni

Necessit di un tier con EJB per sfruttare funzionalit di middleware offerte dal container
Gestione risorse, gestione life-cycle delle istanze, controllo concorrenza e threading
Persistenza, transazioni e gestione della sicurezza Scalabilit, affidabilit, disponibilit
S, se si vogliono realizzare componenti di business portabili, scalabili e riutilizzabili Servono sempre? No, se lobiettivo una semplice
applicazione per leggere tabelle
29
29

Servono sempre?

Tipologie di Componenti Bean

Session Bean Stateful session bean Stateless session bean Entity Bean
Bean Managed Persistence (BMP) Container Managed Persistence (CMP)

Message Driven Bean


Per Java Message Service (JMS) Per Java API for XML Messaging (JAXM)

30

30

Class Java

Session Bean

Cliente

SB1

In questo corso ci concentreremo principalmente su Session Bean per realizzazione di controller

Lavorano tipicamente per un singolo cliente Non sono persistenti (vita media relativamente breve)
Persi in caso di failure di EJB server

Non rappresentano dati in un DB, anche se possono


accedere/modificare questi dati In EJB2.x classe Bean deve implementare interfaccia javax.ejb.SessionBean; in EJB3.x solo uso di annotazioni

Quando usare i Session Bean?


un particolare cliente

Per modellare oggetti di processo o di controllo specifici per Per modellare workflow o attivit di gestione e per coordinare interazioni fra bean Per muovere la logica applicativa di business dal lato cliente a quello servitore
31
31

Session Bean
Stateless: esegue una richiesta e restituisce risultato senza salvare alcuna informazione di stato relativa al cliente
transienti elemento temporaneo di business logic necessario per uno specifico cliente per un intervallo di tempo limitato

Stateful: pu mantenere stato specifico per un cliente


Stateless Session bean Stateful Session bean
State instance data

Come gestire il pooling di questi SB? Fa differenza se si tratta di SB con stato o senza stato?
32
32

Entity Bean
Forniscono una vista ad oggetti dei dati mantenuti in un database Tempo di vita non connesso alla durata delle interazioni con i clienti Componenti permangono nel sistema fino a che i dati esistono nel database - long lived Nella maggior parte dei casi, componenti sincronizzati con

relativi database relazionali Accesso condiviso per clienti differenti

In EJB2.x classe Bean deve implementare interfaccia javax.ejb.EntityBean; in EJB3.x supporto alla persistenza simile a quanto vedrete per Hibernate

33

33

Session Bean
Rappresenta un processo di business Una istanza per cliente Short-lived: vita del bean
pari alla vita cliente

Session ed Entity Bean


Metodo classico di implementazione di applicazioni in J2EE

Transient Non sopravvive a crash del server Pu avere propriet transazionali

Entity Bean
Rappresenta dati di business Istanza condivisa fra clienti multipli Long-lived: vita del bean
pari a quella dei dati nel database

Persistente Sopravvive a crash del server Sempre transazionale

34

34

Message-Driven Bean (MDB)


Svolgono il ruolo di consumatori di messaggi asincroni

Non possono essere invocati direttamente dai clienti


Attivati in seguito allarrivo di un messaggio I clienti possono interagire con MDB tramite linvio di messaggi verso le code o i topic per i quali questi componenti

sono in ascolto (listener) Privi di stato

Perch cos importante che siano asincroni?

Nel caso di utilizzo di JMS MDB corrispondente deve implementare linterfaccia javax.jms.MessageListener interface Limplementazione del metodo onMessage() deve contenere la business logic Il bean viene configurato come listener per queue o topic JMS
35

35

Tipologie di Bean EJB3.0


In EJB 3.0, i bean di tipo sessione e message-driven sono classi Java ordinarie (Plain Old Java Object - POJO) Rimossi i requisiti di interfaccia Tipo di bean specificato da una annotation (o da un descrittore)

Annotation principali
@Stateless, @Stateful, @MessageDriven

Specificati nella classe del bean


Gli entity bean di EJB2.x non sono stati modificati e possono continuare a essere utilizzati

Ma Java Persistence API supporta nuove funzionalit


@Entity si applica solo alle nuove entit relative a Java Persistence API

36

Esempio
// EJB2.1 Stateless Session Bean: Bean Class public class PayrollBean implements javax.ejb.SessionBean { SessionContext ctx; public void setSessionContext(SessionContext ctx) { this.ctx = ctx; } public void ejbCreate() {...} public void ejbActivate() {} public void ejbPassivate() {} public void ejbRemove() {} public void setTaxDeductions(int empId, int deductions) { ... } } // EJB3.0 Stateless Session Bean: Bean Class @Stateless public class PayrollBean implements Payroll { public void setTaxDeductions(int empId,int deductions) { ... } }
37

Esempio
Accesso locale o remoto
Locale a default Remoto tramite annotation o descrittore di deployment

// EJB 3.0 Stateless Session Bean: Interfaccia remota @Remote public interface Payroll { public void setTaxDeductions(int empId, int deductions); }

// EJB 3.0 Stateless Session Bean: // Alternativa: @Remote annotation applicata direttamente alla classe bean @Stateless @Remote public class PayrollBean implements Payroll { public void setTaxDeductions(int empId,int deductions) { ... } }
38

Una breve parentesi su Annotation Obiettivo cruciale di J2EE5 ease

of development

Programmazione a componenti basata su modello POJO (Plain Old Java Objects), pi vicina quindi al modello tradizionale di programmazione Maggiore libert, minori requisiti

Utilizzo estensivo del concetto di annotation Necessit ridotte di descrittori di deployment Resource Injection Inversione del controllo (discuteremo del concetto ampiamente
tra qualche lezione)

Alcune nuove API e funzionalit di supporto: JSR 220 (EJB 3.0)


JSR 252 (JavaServer Faces 1.2), JSR 224 (JAX-WS 2.0 Java API for XML Web Services), JSR 181 (WS Annotations), JSR 245 (JSP 2.1), JSR 222 (JAXB 2.0 Java Architecture for XML Binding)
39
39

I Metadati di Annotation
Elementi descrittivi (metadati) associabili a:
package classi e interfacce costruttori metodi campi parametri variabili

linguaggio

Informazioni che aggiungono espressivit agli elementi del Strutturati come insiemi di coppie nome=valore Lette e gestite dal compilatore o da strumenti esterni: non influenzano direttamente la semantica del codice ma il modo in cui il codice pu essere trattato da strumenti e librerie, che a sua volta pu influenzare il comportamento runtime

Reperibili anche a runtime

40

40

Motivazioni dellIntroduzione di Annotation in J2EE5


Molte API Java richiedono codice di integrazione (boilerplate code). Idea di generare automaticamente questo codice se il codice di partenza decorato da opportuni metadati. Ad

esempio, accoppiamento interfaccia-implementazione in JAXRPC Arricchimento dello spazio concettuale del linguaggio (verso Declarative Programming) Maggior potenza espressiva del linguaggio Possibilit di specificare informazioni relative a determinate entit (code decoration) senza dover ricorrere a descrittori esterni (ad es. evitando possibili disallineamenti fra file descrittori di deployment e codice corrispondente)

41

41

Motivazioni dellIntroduzione di Annotation in J2EE5


Maggior controllo di errori a compile-time

Semplicit di utilizzo
Ma in realt avete gi utilizzato meccanismi simili: transient modifier, @deprecated javadoc tag,

Ora standardizzazione (JSR-175) del modo con cui questi metadati possono essere aggiunti al codice Importante: annotazioni possono essere lette da file sorgenti, file

class (bytecode) e runtime tramite reflection

report di documentazione codice sorgente con annotation (metadata)

annotation processor

config/ deployment file

codice di supporto

Ma partiamo bottom-up e cerchiamo prima di capire che cosa sono e come si usano
42
42

Annotation Predefinite
Override: per indicare che un determinato metodo ridefinisce il corrispondente metodo ereditato da superclasse
(java.lang.Override)
@Override public String toString() { return super.toString() + [modified by subclass] }

Nota: nel caso di errore di trascrizione (del nome metodo o parametri), con lannotation Override compilatore segnalerebbe lerrore (senza annotation verrebbe riconosciuto come nuovo metodo sottoclasse)

Deprecated: indica che luso di un metodo o di un tipo sconsigliato (java.lang.Deprecated)


@Deprecated public class ExampleClass { }

SuppressWarnings: disattiva la segnalazione di warning del


compilatore per classi, metodi o campi (java.lang.SuppressWarnings)
@SuppressWarnings(unchecked) public void aMethod() { }
43
43

Tanti tipi di Annotation Anche annotation personalizzate,con politiche di retention differenziate (source, class, runtime),
Non scopo del corso focalizzare sulle varie possibilit ed esaminare tutte le varie tipologie di annotation possibili

In generale, annotation come metadati di decorazione per aggiungere info dichiarative a sorgenti/bytecode Java Anche utilizzate per ambienti di esecuzione

specifici Vedi annotation specifiche per container J2EE,


brevemente esemplificate nel seguito
Session Bean
Message Driven Bean

@Stateless, @Stateful, @MessageDriven @Entity, @PersistenceContext, @PersistenceUnit @Resource, @EJB

44

44

Dependency Injection
Ne parleremo pi ampiamente in occasione di Spring, prossima
settimana, ma per il momento, giusto per essere operativi

Si accede allambiente di esecuzione tramite dependency injection o azioni di lookup semplificate In prima battuta, dependency injection come risoluzione

dipendenze automatica da parte del container


su XML

Dipendenze specificate tramite annotation o descrittori (parziali) basati

Annotation per laccesso allambiente: @Resource


Utilizzata per indicare factory di connessioni, semplici entry di ambiente, topic/queue per JMS, EJBContext, ...

@EJB
Utilizzata da componente EJB per indicare altri componenti EJB

@PersistenceContext, @PersistenceUnit
Utilizzate per integrazione con supporto alla persistenza
45

Qualche Ulteriore Dettaglio su Dependency Injection


Annotazione @Resource serve a dichiarare un riferimento a una risorsa, come sorgenti dati o hook allambiente di esecuzione @Resource pu essere specificata a livello di classe, metodo

Il container responsabile per la gestione della dependency injection e per completare il binding verso la risorsa JNDI appropriata
@Resource javax.sql.DataSource catalogDS; public getProductsByCategory() { Connection conn = catalogDS.getConnection(); ... }

o campo

Il container si occupa dellinjection allatto dellistanziazione Mapping con risorsa registrata su JNDI risolto tramite

del componente

inferenza a partire dal nome catalogDS e dal tipo


javax.sql.DataSource

46

Elementi di @Resource Pi precisamente, il container si occupa dellinjection della risorsa nel componente o a runtime o quando il componente inizializzato, in dipendenza dal fatto che dependency injection sia relativa a

campo/metodo o a classe

Campo/metodo => allinizializzazione del componente Classe => a runtime, by need (solo quando si ha necessit di accedere alla risorsa iniettata)

@Resource ha i seguenti elementi name: nome JNDI della risorsa type: tipo (Java language type) per la risorsa authenticationType: tipo di autenticazione da usarsi shareable: possibilit di condividere la risorsa mappedName: nome non portabile e implementation-specific a
cui associare la risorsa

description

47

Elementi di @Resource
Name, opzionale per injection a livello campo o metodo Livello di campo: nome di default = nome campo qualificato
dal nome della classe Livello di metodo: nome di default = nome propriet basato sul metodo indicato dal nome della classe Tipo di risorsa, determinato da: Livello di campo: tipo del campo che lannotazione @Resource sta decorando Livello di metodo: tipo della propriet del componente che lannotazione @Resource sta decorando Dallelemento type di @Resource
Anche, authenticationType: solo per risorse di tipo connection factory. Pu avere valore CONTAINER (default) o APPLICATION shareable: usato solo per risorse che sono istanze di ORB o connection factory mappedName: nome non portabile (su diverse implementazioni di Java EE server) e implementation-specific a cui la risorsa deve essere mappata. Usato tipicamente per riferire risorsa al di fuori dellapplication server description: descrizione risorsa, tipic. linguaggio default del sistema di deployment
48

Ritornando a MVC: semplic. un particolare Design Pattern per J2EE

Model-View-Controller come design pattern possibile (e


su componenti che fanno parte dellarchitettura J2EE
Controller come EJB SessionBean (stateless o stateful) View come JSP spesso utile per applicazioni Web) basato

49

Pi in generale, parentesi su J2EE Design Pattern

Un design pattern descrive soluzione comprovata a problema progetto ricorrente (soluzioni riusabili per
problemi comuni; fare tesoro di esperienza passata) C un insieme noto e accettato di design pattern per J2EE. Ad es.: Alur, Crupi, and Malks, Core J2EE Patterns Alcuni esempi:

Intercepting filter pattern utile per pre/post-processing di richieste. Ad es. intercepting filter realizzato tramite servlet filtro che View helper incapsula logica di presentazione e accesso dati di una view, al fine di semplificarne poi la realizzazione. Ad es. tag Front controller fornisce controllore centralizzato per gestione

gestisce tutte richieste a server Web e offre meccanismo centrale di autorizzazione

JSP per rendering o JavaBean per ritrovamento dati

richieste. Front controller riceve tutte richieste cliente, fa forwarding verso gestore richieste appropriato, e poi gira riposta al cliente. Comportamento da dispatcher
50

Pi in generale, parentesi su J2EE Design Pattern


Session faade Coordina operazioni fra oggetti cooperanti,
unificando funzioni applicative in una singola interfaccia. Incapsula e nasconde complessit delle classi che cooperano (anche in modalit complesse). Spesso implementata come session

bean EJB Business delegate Interviene fra oggetto remoto e suo cliente, adattando linterfaccia delloggetto a uninterfaccia adatta al cliente. Delegato si occupa di dettagli low-level come ricerca Data access object Astrae logica di accesso ai dati dalle
facilita ladattamento a diversi schema o tipologie database

delloggetto e gestione eccezioni remote; pu realizzare ottimizzazione di performance come data caching

specifiche risorse dati. Incapsulando chiamate di accesso ai dati, Alcuni pattern sono pi adatti o specificam. pensati per un particolare tier. Ad es. pattern relativi a view e livello presentazione sono applicati spesso a Web tier Altri pattern pi adatti per controllo business logic, utili per EJB tier, ad es. session facade per EJB tier
51

Servizi Container-based Oltre ai dettagli di programmazione, ancora pi rilevante capire quali servizi di supporto/sistema e

come vengano supportati in un modello a container pesante:

Pooling e concorrenza
Transazionalit Gestione delle connessioni a risorse Persistenza (vedi Java Persistence API e Hibernate) Messaggistica (vedi Java Messaging System JMS)
(Sicurezza)

52

1) Gestione della Concorrenza


Migliaia fino a milioni di oggetti in uso simultaneo

Come gestire relazione fra numero clienti e numero oggetti distribuiti richiesti per servire richieste cliente? Discussione: voi come

Resource Pooling

realizzereste instance pooling?

Pooling dei componenti server-side da parte di EJB container (instance pooling). Idea base di evitare di mantenere una istanza separata di ogni EJB per ogni cliente. Si applica a stateless session bean e message-driven bean (che cos un cliente per un MDB?) Anche pooling dei connector (vedremo in seguito)

Activation Utilizzata da stateful session bean per risparmiare risorse


53

Stateless Session Bean Ogni EJB container mantiene un insieme di istanze del bean pronte per servire richieste cliente Non esiste stato di sessione da mantenere fra richieste successive; ogni invocazione di metodo indipendente dalle precedenti

Implementazione delle strategie di instance pooling demandate ai vendor di EJB container, ma analoghi
principi
No State

Ciclo di vita di uno stateless session bean:


vita)

No state (non istanziato; stato iniziale e terminale del ciclo di Pooled state (istanziato ma non ancora associato ad alcuna Ready state (gi associato con una richiesta EJB e pronto a
rispondere ad una invocazione di metodo)

Pooled State

richiesta cliente)

Ready State

54

Stateless Session Bean


Istanza del bean nel pool riceve un riferimento a javax.ejb.EJBContext (in caso di richiesta di injection nel codice tramite apposita annotation)

EJBContext fornisce uninterfaccia per il bean per comunicare con lambiente EJB
Quando il bean passa in stato ready, EJBContext contiene anche informazioni sul cliente che sta utilizzando il bean. Inoltre contiene il riferimento al proprio EJB stub, utile per passare riferimenti ad altri bean Ricordiamo che il fatto di essere stateless indicato semplicemente tramite annotation @javax.ejb.Stateless (NOTA:

variabili di istanza non possono essere usate per mantenere stato della sessione)
Altrimenti che cosa succederebbe?

55

Stateful Session Bean: Activation Usata nel caso di stateful session bean

Gestione della coppia oggetto EJB + istanza di bean stateful Passivation: disassociazione fra stateful bean instance e suo
oggetto EJB, con salvataggio dellistanza su memoria (serializzazione). Processo del tutto trasparente per cliente

Activation: recupero dalla memoria (deserializzazione) dello


stato dellistanza e riassociazione con oggetto EJB Nella specifica J2EE, non richiesto che la classe di uno stateful session bean sia serializzabile. Quindi? Dipendenza dallimplementazione dello specifico vendor e attenzione al trattamento dei transient
56

Stateful Session Bean: Activation


La procedura di activation pu essere associata anche allinvocazione di metodi di callback sui cambi di stato nel ciclo di vita di uno stateful session bean Ad esempio, lannotation @javax.ejb.PostActivate associa linvocazione del metodo a cui si applica immediatamente dopo lattivazione di unistanza Similmente, @javax.ejb.PrePassivate (prima dellazione di passivation) Ad esempio, utilizzati spesso per la chiusura/apertura di

connessioni a risorse per gestione pi efficiente

57

Gestione Concorrenza
Per definizione, session bean non possono essere concorrenti, nel senso che una singola istanza

associata ad un singolo cliente

Vietato lutilizzo di thread a livello applicativo e, ad esempio, della keyword synchronized


Mai usare un SB Statefull se la stessa cosa pu essere fatta con un SB Stateless.Un SB Stateless scala molto di pi di un SB Statefull

Come nel caso di stateless session bean, Message Driven Bean non mantengono stato della sessione e quindi il container pu effettuare pooling in modo relativamente semplice Strategie di pooling analoghe alle precedenti. Unica differenza che

ogni EJB container contiene molti pool, ciascuno dei quali composto di istanze con la stessa destination JMS

58

2) Transazioni
Sappiamo tutti, vero ?, che cosa si intende per transazione e per

propriet di transazionalit

Propriet ACID (Atomicity, Consistency, Isolation e Durability) Transazione come unit indivisibile di processamento; pu terminare con un commit o un rollback Session bean e message-driven bean possono sfruttare o Container-Managed Transaction o Bean-Managed Transaction

Demarcazione automatica e Container-Managed Transaction


Tipologia di default

Transazione associata con lintera esecuzione di un metodo (demarcazione automatica della transazione: inizio
immediatamente prima dellesecuzione del metodo e commit immediatamente prima della terminazione del metodo) NON si possono utilizzare metodi per la gestione delle transazioni che interferiscano con la gestione automatica del container (ad esempio,
proibito luso di commit o rollback di java.sql.Connection)
59

3) Gestione Connessioni a Risorse


Un componente pu avere bisogno di utilizzare altri componenti e risorse, come database e sistemi di messaging, ad esempio In Java EE il ritrovamento delle risorse desiderate basato su un

sistema di nomi ad alta portabilit come Java Naming and Directory Interface (JNDI) Se un componente usa resource injection, sar il container a utilizzare JNDI per ritrovare la risorsa desiderata, e non il componente stesso comera usuale prima di EJB3.0 In particolare, relativamente a risorse a database, connection pooling: connessioni sono riutilizzabili per ridurre latenza e
incrementare prestazioni nellaccesso a DB

Vedi quanto detto precedentemente per annotazione @Resource


EJB1
EJB2

Con

DB

60

4) Persistenza
Parleremo ampiamente di supporto alla persistenza e Object Relation Mapping quando esamineremo tecnologia Hibernate

Supporto alla persistenza similare nel mondo Java


Entity Bean come componenti EJB in EJB2.x Supporto alla persistenza integrato nel modello a container pesante Java Persistence API (JPA) nelle ultime versioni
Evoluzione verso API di Java persistence comuni Integrata lesperienza e il feedback da Hibernate, Java Data Objects, TopLink, e precedenti versioni di tecnologia EJB

61

5) Messaging
Java Messaging System (JMS) come servizio di supporto J2EE: specifica che definisce come un cliente JMS acceda alle funzionalit supportate da un sistema di messaging di livello enterprise. Solitamente: Produzione, distribuzione e consegna di messaggi Semantiche di consegna supportate:
sincrona/asincrona transacted garantita durevole
Java Application JMS API

JMS JMS Provider Provider


IBM MQSeries Progress SonicMq

JMS JMS Provider Provider

JMS Provider

Fiorano

BEA

SUN MQ

62

Messaging
Supporto ai principali modelli di messaging in uso Point-to-Point (code affidabili)

Publish/Subscribe
Selettori di messaggi (lato ricevente) Diverse tipologie di messaggi

JMS Provider Destination

EJB Container

Consumer Instances Msg-driven Bean Class

63

MDB come consumatori di messaggi JMS

Message-driven bean come consumatori asincroni di messaggi JMS. Ad esempio:


Perch importante che siano asincroni?

JMS Topics <Entity EJB>


Publish/subscribe

Order Bean

MessageDrivenBean

Process Order <Entity EJB> Procure Inventory


Inventory Management Bean

Mail
64

Spring

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 4.02.Spring.pdf Versione elettronica: 4.02.Spring-2p.pdf
1

Introduzione a Spring Che cos Spring? Implementazione di modello a container leggero per la costruzione di applicazioni Java SE e Java EE
Molti dei concetti chiave alla base di Spring sono stati di successo cos rilevante da essere diventati linee guida per levoluzione di EJB3.0 Funzionalit chiave:

Inversion of Control (IoC) e Dependency injection


Supporto alla persistenza Integrazione con Web tier

Aspect Oriented Programming (AOP)

Funzionalit Chiave: Dependency Injection (e Persistenza)

Dependency Injection
Gestione della configurazione dei componenti applica principi di Inversion-of-Control e utilizza Dependency Injection Eliminazione della necessit di binding manuale fra componenti

Idea fondamentale di una factory per componenti (BeanFactory) utilizzabile globalmente. Si occupa

gestione delle relazioni fra oggetti (configuration management)

fondamentalm. del ritrovamento di oggetti per nome e della

Persistenza
Livello di astrazione generico per la gestione delle transazioni con DB (senza
essere forzati a lavorare dentro un EJB container)

Integrazione con framework di persistenza come Hibernate, JDO, JPA Lo vedrete nel dettaglio nelle prossime lezioni del corso

Funzionalit Chiave: Web tier e AOP

Integrazione con Web tier


Framework MVC per applicazioni Web, costruito sulle
funzionalit base di Spring, con supporto per diverse tecnologie per la generazione di viste, ad es. JSP, FreeMarker, Velocity, Tiles, iText e POI (Java API per laccesso a file in formato MS) Web Flow per navigazione a grana fine

Supporto a Aspect Oriented Programming


Framework di supporto a servizi di sistema, come gestione delle transazioni, tramite tecniche AOP Miglioramento soprattutto in termini di modularit Parzialmente correlata anche la facilit di testing

Yet Another Container/Framework?


No, Spring rappresenta un approccio piuttosto unico (che ha
fortemente influenzato i container successivi, verso tecnologie a microcontainer Spring 1.2 datato Maggio 2005). In altre parole, propriet originali:

Spring come framework modulare. Architettura a layer, possibilit di utilizzare anche solo alcune parti in isolamento Anche possibilit di introdurre Spring incrementalmente in progetti esistenti e di imparare ad utilizzare la tecnologia pezzo per pezzo Supporto a importanti aree non coperte da altri framework diffusi, come la gestione degli oggetti di business Tecnologia di integrazione di soluzioni esistenti Facilit di testing

Quindi, perch usare Spring? Integrazione e cooperazione fra componenti (secondo il semplice modello JavaBean) via

Dependency Injection Disaccoppiamento

Uso semplificato di tecnologie diffuse e di successo Astrazioni che isolano il codice applicativo, eliminazione di codice ridondante, gestione di comuni condizioni di errore (caso delle unchecked exception) Specificit delle tecnologie sottostanti sono comunque ancora accessibili (parziale visibilit) Test-Driven Development (TDD) Possibilit di effettuare testing delle classi (POJO) senza

essere legati al framework Programmazione dichiarativa via AOP Facile configurazione degli aspetti, ad esempio supporto
alle transazioni

Quindi, perch usare Spring?

NON una soluzione all-or-nothing


Estrema modularit e flessibilit Progettata per essere facile da estendere e con molte classi riutilizzabili

Integrazione con altre tecnologie


EJB per J2EE Hibernate, iBates, JDBC per laccesso a dati e O/RM Java Persistence API per persistenza Struts e WebWork per Web tier

Architettura di Spring

Ruolo cruciale del container leggero che si occupa sostanzialmente della sola Inversion of Control

Spring e Flessibilit di Utilizzo in Scenari Differenti


Una delle caratteristiche pi apprezzate di Spring si rivelata la sua possibilit di

essere utilizzato, con complessit e costi differenti, in scenari fortemente differenziati, da semplici applet a applicazioni enterprise complete

Spring e Flessibilit di Utilizzo in Scenari Differenti

Ad esempio, solo middle tier e integrazione con Web

Ad esempio, solo remoting

10

Architettura di Spring

Core Package
Parte fondamentale del framework. Consiste in un container leggero che si occupa di Inversion of Control o, per dirla alla Fowler, Dependency Injection Lelemento fondamentale BeanFactory, che fornisce una

implementazione estesa del pattern factory ed elimina la necessit di gestione di singleton a livello di programmazione, permettendo di disaccoppiare configurazione e dipendenze dalla logica applicativa
Vi ricordate bene, vero, che cos un singleton?

MVC Package
Ampio supporto a progettazione e sviluppo secondo architettura Model-View-Controller (MVC) per applicazioni Web
Vedremo qualche dettaglio in seguito e nellesercitazione

11

Architettura di Spring
Solo per questioni di completezza in termini di presentazione architettura; ne parleremo pi avanti nel corso

DAO Package
Livello di astrazione che non rende pi necessario codice ripetitivo (boilerplate code) per JDBC, n parsing di codici di errore database-specific Gestione delle transazioni sia da codice che in modo dichiarativo, non solo per classi che implementano interfacce speciali (possibilit aperta a tutti oggetti Java)

ORM Package JPA, JDO, Hibernate, iBatis,


Livello di integrazione con soluzioni diffuse per OR/M, come Le varie soluzioni O/RM suddette possono essere usate in combinazione con le altre funzionalit di Spring, come la gestione dichiarativa delle transazioni => Spring come

tecnologia di integrazione

12

Architettura di Spring

AOP Package
Implementazione di aspect-oriented programming conforme allo standard AOP Alliance. Permette di definire, ad esempio, intercettori di metodo e pointcut per
disaccoppiamento pulito Possibilit di utilizzare metadati a livello sorgente per incorporare informazioni aggiuntive di comportamento allinterno del codice

Necessit di aprire una parentesi su AOP ? (in caso affermativo, vedi slide x)

13

Dependency Injection in Spring

Applicazione pi nota e di maggiore successo del principio di Inversion of Control


Hollywood Principle Don't call me, I'll call you Container (in realt il container leggero di Spring) si occupa di risolvere (injection) le dipendenze dei componenti attraverso lopportuna configurazione dellimplementazione delloggetto

(push)

Opposta ai pattern pi classici di istanziazione di componenti o Service Locator, dove il componente che deve determinare limplementazione della risorsa desiderata (pull) Martin Fowler chiam per primo Dependency Injection questo
tipo di IoC

14

Potenziali Benefici di Dependency Injection


Stessi benefici sono propri di molte altre tecnologie correnti, tutte con dependency injection, come EJB3.0

Flessibilit
Eliminazione di codice di lookup nella logica di business

Possibilit e facilit di testing


Nessun bisogno di dipendere da risorse esterne o da

container in fase di testing


Possibilit di abilitare testing automatico

Manutenibilit
Permette riutilizzo in diversi ambienti applicativi cambiando semplicemente i file di configurazione (o in generale le specifiche di dependency injection) e non il codice

15

Senza Dependency Injection

creates

Object B

Object A

creates

Object C

Un oggetto/componente deve esplicitamente istanziare gli oggetti/componenti di cui ha necessit (sue dipendenze) Accoppiamento stretto tra oggetti/componenti

16

Con Supporto a Dependency Injection

Object B

setB(IB) Object A

setC(IC) Object C

Supporto a dependency injection si occupa di creare oggetti/comp quando necessario e di passarli automatic. agli
oggetti/comp che li devono utilizzare
Idea base per implementazione: costruttori in oggetto A che accettano B e C come parametri di ingresso, oppure A contiene metodi setter che accettano interfacce B e C come parametri di ingresso
17

Due Varianti per Dependency Injection in Spring Dependency injection a livello di costruttore
Dipendenze fornite attraverso i costruttori dei componenti
public class ConstructorInjection { private Dependency dep; public ConstructorInjection(Dependency dep) { this.dep = dep; } }

Dependency injection a livello di metodi setter


Dipendenze fornite attraverso i metodi di configurazione (metodi setter in stile JavaBean) dei componenti Pi frequentemente utilizzata nella comunit degli sviluppatori
public class SetterInjection { private Dependency dep; public void setMyDependency(Dependency dep) { this.dep = dep; } }
18

BeanFactory
Loggetto BeanFactory responsabile della gestione dei

bean che usano Spring e delle loro dipendenze

Ogni applicazione interagisce con la dependency injection di Spring (IoC container) tramite linterfaccia BeanFactory
Oggetto BeanFactory viene creato dallapplicazione, tipicamente nella forma di XmlBeanFactory

configurazione e si occupa di fare linjection (wiring)

Una volta creato, loggetto BeanFactory legge un file di

XmlBeanFactory estensione di DefaultListableBeanFactory per leggere definizioni di bean da un documento XML


public class XmlConfigWithBeanFactory { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); SomeBeanInterface b = (SomeBeanInterface) factory. getBean(nameOftheBean); } }
19

File di Configurazione
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="renderer" class="StandardOutMessageRenderer"> <property name="messageProvider"> <ref local="provider"/> </property> </bean> <bean id="provider" class="HelloWorldMessageProvider"/> </beans> Oppure a livello di costruttore <beans> <bean id="provider" class="ConfigurableMessageProvider"> <constructor-arg> <value> Questo il messaggio configurabile</value> </constructor-arg> </bean> </beans>
20 Vedete anche lesempio successivo, in cui in grande dettaglio sar mostrato come il container IoC faccia dependency injection

Uso della Dependency Injection

public class ConfigurableMessageProvider implements MessageProvider { private String message; // usa dependency injection per config. del messaggio public ConfigurableMessageProvider(String message) { this.message = message; } public String getMessage() { return message; } }

21

Tipi di Parametri di Injection


Spring supporta diversi tipi di parametri con cui fare injection

1. 2. 3. 4. 5.

Valori semplici Bean allinterno della stessa factory Bean anche in diverse factory Collezioni (collection) Propriet definite esternamente

costruttori che sui metodi setter


Ad esempio, injection di valori semplici

Tutti questi tipi possono essere usati sia per injection sui

<beans> <bean id="injectSimple" class="InjectSimple"> <property name="name"> <value>John Smith</value></property> <property name="age"> <value>35</value> </property> <property name="height"> <value>1.78</value> </property> </bean> </beans>
22

Esempio: Injection di Bean della stessa Factory


allinterno di un altro (target bean)
Usata quando necessario fare injection di un bean

Uso del tag <ref> in <property> o <constructor-arg> del target bean Controllo lasco sul tipo del bean iniettato rispetto a quanto definito nel target Se il tipo definito nel target uninterfaccia, il bean injected deve essere unimplementazione di tale interfaccia Se il tipo definito nel target una classe, il bean injected deve essere della stessa classe o di una sottoclasse
<beans> <bean id="injectRef" class="InjectRef"> <property name="oracle"> <ref local="oracle"/> </property> </bean> </beans>
23

Naming dei Componenti Spring


Come fa BeanFactory a trovare il bean richiesto (pattern singleton come comportamento di default)? Ogni bean deve avere un nome unico allinterno della

BeanFactory contenente

Procedura di risoluzione dei nomi


Se un tag <bean> ha un attributo di nome id, il valore di questo attributo viene usato come nome Se non c attributo id, Spring cerca un attributo di nome name Se non definito n id n name, Spring usa il nome della classe del bean come suo nome

24

Possibilit di Effettuare Dependency Checking


Utilizzabile per controllare lesistenza di dipendenze non risolte quando abbiamo gi fatto il deployment di un bean allinterno di un container Spring

definizione del bean

Propriet che non hanno valori configurati allinterno della

Caratteristica utile quando ci si vuole assicurare che tutte le propriet (o tutte le propriet di un determinato tipo) siano state configurate su un bean Modalit possibili:

none nessun check simple dependency checking effettuato solo per tipi primitivi e collection object dependency checking effettuato solo per altri bean associati allinterno della stessa factory (collaborator) all dependency checking effettuato per collaborator, tipi
primitivi e collection
25

Dependency Injection in EJB3.0


Dependency injection come utile meccanismo a disposizione in molte tecnologie a container, anche in EJB3.0 Le risorse di cui un bean ha necessit sono iniettate (injected) quando listanza del bean viene effettivamente costruita dal

container

Ad esempio, riferimenti a:

- EJBContext
- entry di ambiente

- sorgenti di dati - altri componenti EJB, ...

Dependency injection realizzata tramite annotation come via primaria (anche descrittori di deployment NON completi, se
preferito)

@EJB
Riferimenti alle interfacce di business EJB
Utilizzato anche per riferimenti a EJBHome (per compatibilit con componenti vecchie versioni EJB 2.x)

@Resource: qualsiasi altro riferimento


26

Dependency Injection in EJB3.0


Le risorse di cui un bean ha necessit sono iniettate (injected) quando listanza del bean viene effettivamente

costruita Valutazione delle annotazioni anche a runtime

Discussione: Quali vantaggi/svantaggi rispetto a scelte a tempo di Quali vantaggi/svantaggi rispetto a descrittori di deployment?
Spring Config: xml Chiamata al componente tramite factory EJB 3.X Config: annotazioni(@) Chiamata implicita al componente tramite container

scrittura del codice, a tempo di compilazione, a tempo di caricamento?

27

Supporto a MVC in Spring


Supporto a componenti controller, responsabili per interpretare richiesta utente e interagire con business object applicazione Una volta che il controller ha ottenuto i risultati (parte model), decide a quale view fare forwarding del model; view utilizza i dati in model per creare presentazione verso lutente
Chiara separazione ruoli: controller, validator, oggetti command/form/ model, DispatcherServlet, handler mapping, view resolver, ... Adattabilit e riutilizzabilit: possibilit di utilizzare qualsiasi classe per
controller purch implementi interfacciapredefinita Flessibilit nel trasferimento model: via un Map nome/valore, quindi possibilit di integrazione con svariate tecnologie per view Facilit di configurazione: grazie al meccanismo standard di dependency injection di Spring

Handler mapping e view resolution configurabili Potente libreria di JSP tag (Spring tag library): supporto a varie possibilit di temi (theme)
Componenti con ciclo di vita scoped e associati automaticam a HTTPrequest o HTTPsession (grazie a WebApplicationContext di Spring)
28

Spring DispatcherServlet
Progettato attorno a una servlet centrale che fa da dispatcher delle richieste (DispatcherServlet) Completamente integrata con IoC container di Spring DispatcherServlet come Front Controller DispatcherServlet una normale servlet e quindi serve URL mapping tramite web.xml

29

Spring DispatcherServlet
Azioni svolte da DispatcherServlet: WebApplicationContext associato alla richiesta (controller e altri componenti potranno utilizzarlo)
DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE

locale resolver associato alla richiesta (pu servire nel


processamento richiesta e view rendering)

theme resolver associato alla richiesta (view potranno


determinare quale theme usare) Viene cercato un handler appropriato. Se trovato, viene configurata una catena di esecuzione associata allhandler

(preprocessori, postprocessori e controller); risultato preparazione di model


Se restituito un model, viene girato alla view associata (perch un model potrebbe non essere ricevuto?)

30

Spring Controller
Spring supporta la nozione di controller in modo astratto permettendo creazione di ampia variet di controller: form-specific controller, command-based controller, controller che eseguono come wizard, ...

Base di partenza: interfaccia


org.springframework.web.servlet.mvc.Controller public interface Controller { ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception; }

Molte implementazioni dellinterfaccia gi disponibili. Ad es:

AbstractController
classe che offre gi supporto per caching. Quando la si utilizza come
baseclass, necessit di fare overriding del metodo
handleRequestInternal(HttpServletRequest, HttpServletResponse) public class SampleController extends AbstractController { public ModelAndView handleRequestInternal( HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView("hello"); mav.addObject("message", "Hello World!"); return mav; } }
31

Spring Controller
AbstractController opera automaticam. direttive di caching verso il cliente per obbligarlo a caching locale (2 minuti nellesempio di config XML mostrato sotto)
<bean id="sampleController" class="samples.SampleController"> <property name="cacheSeconds" value="120"/> </bean>

hard-code nella classe Java del controllore)

ParameterizableViewController simile allesempio precedente, con possibilit di specificare nome view in Web application context (senza bisogno di farne UrlFilenameViewController

esamina URL passato, estrae filename del file richiesto e lo usa automaticam. come nome di view. Ad es:
http://www.springframework.org/index.html

view name = index

32

Command Controller
Command controller permettono di associare dinamicam. parametri di HttpServletRequest verso oggetti dati specificati (simili a Struts
ActionForm, ma senza bisogno di implementare una specifica interfaccia)

Alcuni controller disponibili:

AbstractCommandController
nessuna funzionalit form, solo consente di specificare che fare con oggetto command (JavaBean) popolato automaticam. coi parametri richiesta

AbstractFormController

offre supporto per form; dopo che utente ha compilato form, mette i campi in oggetto command. Programmatore deve specificare metodi per determinare quali view utilizzare per presentazione form

SimpleFormController

oltre al precedente, anche nome view per form, nome view per pagina
da mostrare allutente quando form submission completata con successo,

AbstractWizardFormController

programmatore deve implementare metodi (abstract) validatePage(), processFinish() e processCancel(); altri metodi di cui fare overriding sono referenceData (per passare model ad una vista sotto forma di oggetto Map); getTargetPage (se wizard vuole cambiare ordine pagine o omettere pagine dinamicam.), onBindAndValidate(se si desidera overriding del flusso usuale di associazione valori e validazione form)
33

Spring Handler
Funzionalit base: fornitura di HandlerExecutionChain, che contiene un handler per la richiesta e pu contenere una lista di handler interceptor da applicare alla richiesta, prima o dopo esecuzione handler Allarrivo di una richiesta, DispatcherServlet la gira a handler per ottenere un HandlerExecutionChain appropriato; poi DispatcherServlet esegue i vari passi specificati nella chain

Concetto potente e molto generale: pensate a handler custom che


determina una specifica catena non solo sulla base dellURL della richiesta ma anche dello stato di sessione associata Diverse possibilit per handler mapping in Spring. Maggior parte estendono AbstractHandlerMapping e condividono le propriet seguenti:

interceptors: lista degli intercettori defaultHandler: default da utilizzare quando no matching specifico possibile order: basandosi su questa propriet (org.springframework.core.Ordered), Spring
ordina tutti handler mapping disponibile e sceglie il primo in lista

34

Spring View
Spring mette a disposizione anche componenti detti view resolver per semplificare rendering di un model su browser, senza legarsi a una specifica tecnologia per view (ad es. collegandosi a JSP, Velocity template, ) Due interfacce fondamentali sono ViewResolver e View: ViewResolver per effettuare mapping fra nomi view e reali implmentazione di views View per preparazione richieste e gestione richiesta verso una tecnologia di view
Possibili ViewResolver:

AbstractCachingViewResolver
realizza trasparentemente caching di view per ridurre tempi preparazione

XmlViewResolver
Accetta file di configurazione XML con stessa DTD della classica bean factyory Speing. File di configurazione /WEB-INF/views.xml

UrlBasedViewResolver
Risolve direttamente nomi simbolici di view verso URL
35

Spring tag e gestione eccezioni


Spring tag library
Ampio set di tag specifici per Spring per gestire elementi di form quando si utilizzano JSP e Spring MVC Accesso a oggetto command Accesso a dati su cui lavora controller
Libreria di tag contenuta in spring.jar, descrittore chiamato spring-form.tld, per utilizzarla: <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> dove form prefisso che si vuole utilizzare per indicare tag nella libreria

Gestione eccezioni
HandlerExceptionResolver per semplificare gestione di eccezioni inattese durante esecuzione controller; eccezioni contengono info su
handler che stava eseguendo al momento delleccezione Implementazione di interfaccia HandlerExceptionResolver (metodo resolveException(Exception, Handler) e restituzione di oggetto ModelAndView) Possibilit di uso di classe SimpleMappingExceptionResolver, con mapping automatico fra nome classe eccezione e nome view
36

Convenzioni e configurazione di default


In molti casi sufficiente usare convenzioni pre-stabilite e ragionevoli

default per fare mapping senza bisogno di configurazione

Convention-over-configuration
Riduzione quantit di configurazioni necessarie per configurare handler mapping, view resolver, istanze ModelAndView, Vantaggi soprattutto in termini di prototipazione rapida
Suggerimento di studio : distribuzione Spring ufficiale contiene una

applicazione Web che mostra caso pratico delle differenze conventionover-configuration (sia per model che per view che per controller): nella cartella 'samples/showcases/mvc-convention'

37

Convenzioni sulla configurazione di default


Ad esempio, per Controller, la classe

ControllerClassNameHandlerMapping usa convenzione per


determinare mapping fra URL e istanze controller. Ad es.:
public class ViewShoppingCartController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) {... } } <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNa meHandlerMapping"/> <bean id="viewShoppingCart" class="x.y.z.ViewShoppingCartController"> </bean> ControllerClassNameHandlerMapping trova vari bean controller definiti e toglie Controller dal nome per definire automaticam. mapping. Ad es: WelcomeController si mappa su URL '/welcome*' HomeController si mappa su URL '/home* IndexController si mappa su URL '/index*'

Per un esempio completo e semplice di utilizzo Spring MVC, vedi prossima esercitazione
38

Aspect Oriented Programming (AOP)


Una brevissima introduzione non esaustiva a tecniche di AOP Aspect Oriented programming (AOP) come approccio di design e tecnica per semplificare lapplicazione di cross-cutting
Esempi di cross-cutting concern Logging Locking Gestione degli eventi Gestione delle transazioni Sicurezza e auditing

concern (problematiche trasversali alla logica applicativa)

Business Logic della app Utilizzo Utilizzo


Aspetto di sicurezza

Concetti rilevanti per AOP:

Aspetto di Logging

Joinpoint Advice Pointcut e Aspect Weaving e Target Introduction


39

AOP: Joinpoint & Advice


Joinpoint
Punto ben definito del codice applicativo, anche determinato a runtime, dove pu essere inserita logica addizionale Esempi di joinpoint

Invocazione di metodi

Inizializzazione di classi Inizializzazione di oggetti (creazione di istanze)

Advice Codice con logica addizionale che deve essere eseguito ad


un determinato joinpoint Tipi di Advice before advice eseguono prima del joinpoint after advice eseguono dopo il joinpoint around advice eseguono attorno (around) al joinpoint
40

AOP: Pointcut & Aspect


Pointcut Insieme di joinpoint usati per definire quando eseguire un advice
Controllo fine e flessibile su come applicare advice al codice applicativo Ad esempio: Invocazione di metodo un tipico joinpoint Un tipico pointcut linsieme di tutte le invocazioni di metodo in una classe determinata

Pointcut possono essere composti in relazioni anche complesse per vincolare il momento di esecuzione
delladvice corrispondente

Aspect
Aspect come combinazione di advice e pointcut

41

AOP: Weaving & Target


Weaving
Processo delleffettivo inserimento di aspect dentro il codice applicativo nel punto appropriato Tipi di weaving A tempo di compilazione Runtime Con quali costi, con quale
flessibilit e con quale potere espressivo?

Target Un oggetto il cui flusso di esecuzione viene modificato da


qualche processo AOP Viene anche indicato qualche volta come oggetto con advice (advised object)

42

AOP Statico o Dinamico


AOP Statico
Il processo di weaving viene realizzato come passo ulteriore del processo di sviluppo, durante il build dellapplicazione Incide sul codice dellapplicazione che viene eseguito Ad esempio, in un programma Java, si pu avere weaving attraverso la modifica del bytecode di una applicazione Processo di weaving realizzato dinamicamente a runtime Possibilit di cambiare weaving senza bisogno di

AOP Dinamico

ricompilazione

43

AOP in Spring

A questo punto, se voi doveste implementare AOP in Spring (in ambiente Java in generale), che tipo di approccio usereste?
In J2EE il container stesso fa da proxy AOP basta istruirlo
Evoluzione del modello

C1 Contain er

Proxy AOP

Istanza di advised class

Adviser Class

Spring realizza AOP sulla base dellutilizzo di proxy Se si desidera creare una classe advised, occorre uilizzare la classe ProxyFactory per creare un proxy per unistanza di quella classe, fornendo a ProxyFactory tutti gli aspect con cui si desidera informare il proxy

44

Parentesi finale: Dependency Injection e HelloWorld


Per fissare le idee in modo molto concreto, proviamo a vedere con il pi semplice degli esempi se a questo punto del corso capiamo fino in fondo che cosa si intende per dependency injection, quali vantaggi produce e che tipo di supporto necessario per realizzarla
public class HelloWorld {
L'applicazione ha 2 problemi: 1-La logica di rendering(system.out.println) 2-L'embendig del messaggio,non personalizzabile

public static void main(String[] args) { System.out.println("Hello World!"); } }

Quali problemi?
Necessit di cambiare il codice (e di ricompilare) per imporre una modifica del messaggio Codice non estensibile e modificabile
45

Con Argomenti a Linea di Comando


public class HelloWorldWithCommandLine { public static void main(String[] args) { if(args.length > 0) { System.out.println(args[0]); } else { System.out.println("Hello World!"); } } }
L'embedding risolto,in quanto posso personalizzare il messaggio tramite parametro da linea di comando

In questo modo si esternalizza il contenuto del messaggio, che viene letto a runtime dagli argomenti a linea di comando

Problemi? occupa anche di ottenere il messaggio


Codice responsabile del rendering del messaggio (println) si

Cambiare come il messaggio deve essere ottenuto obbliga a cambiare il codice del renderer Il renderer non pu essere modificato facilmente (messaggio verso stderr? O in tag HTML invece che plain text?)
46

Disaccoppiamento
1) Disaccoppiamento dellimplementazione della logica del message provider rispetto al resto del codice tramite

creazione di una classe separata

public class HelloWorldMessageProvider public String getMessage() { return "Hello World!"; } }

2) Disaccoppiamento dellimplementazione della logica di message rendering dal resto del codice La logica di message rendering data alloggetto HelloWorldMessageProvider da qualcun altro questo ci che si intende con Dependency Injection
public class StandardOutMessageRenderer { private HelloWorldMessageProvider messageProvider = null; public void render() { if (messageProvider == null) {
throw new RuntimeException(You must set property messageProvider of class: + StandardOutMessageRenderer.class. getName()); } 47

Disaccoppiamento

// continua System.out.println(messageProvider.getMessage()); } // dependency injection tramite metodo setter public void setMessageProvider(HelloWorldMessageProvider provider) { this.messageProvider = provider; } public HelloWorldMessageProvider getMessageProvider() { return this.messageProvider; } }

48

HelloWorld con Disaccoppiamento


public class HelloWorldDecoupled { public static void main(String[] args) { StandardOutMessageRenderer mr = new StandardOutMessageRenderer(); HelloWorldMessageProvider mp = new HelloWorldMessageProvider(); mr.setMessageProvider(mp); mr.render(); } }

Esempio estremo della BeanFactory di Spring

A questo punto, la logica del message provider e quella del message renderer sono separate dal resto del codice

Quali problemi ancora?


Implementazioni specifiche di MessageRenderer e di MessageProvider sono hard-coded nella logica applicativa (in questo launcher in questo lucido) Aumentiamo il disaccoppiamento tramite interfacce
49

HelloWorld con Disaccoppiamento: Interfacce


public interface MessageProvider { public String getMessage(); } public class HelloWorldMessageProvider implements MessageProvider { public String getMessage() { return "Hello World!"; } }

public interface MessageRenderer { public void render(); public void setMessageProvider(MessageProvider provider); public MessageProvider getMessageProvider(); }

50

HelloWorld con Disaccoppiamento: Interfacce


public class StandardOutMessageRenderer implements MessageRenderer { // MessageProvider una interfaccia Java ora private MessageProvider messageProvider = null; public void render() { if (messageProvider == null) { throw new RuntimeException("You must set property messageProvider
of class: + StandardOutMessageRenderer.class.getName()); }

System.out.println(messageProvider.getMessage()); } public void setMessageProvider(MessageProvider provider) { this.messageProvider = provider; } public MessageProvider getMessageProvider() { return this.messageProvider; } }

51

HelloWorld con Disaccoppiamento: Interfacce


Rimane responsabilit del launcher di effettuare la dependency injection
public class HelloWorldDecoupled { public static void main(String[] args) { MessageRenderer mr = new StandardOutMessageRenderer(); MessageProvider mp = new HelloWorldMessageProvider(); mr.setMessageProvider(mp); mr.render(); } }

Ora possibile modificare la logica di message rendering senza alcun impatto sulla logica di message provider Allo stesso modo, possibile cambiare la logica di message provider senza bisogno di modificare la logica di message rendering
52

HelloWorld con Disaccoppiamento: Interfacce


Quali problemi ancora?
Luso di differenti implementazioni delle interfacce MessageRenderer o MessageProvider necessita comunque di una modifica (limitata) del codice della logica di business logic

(launcher)

=> Creare una semplice classe factory che legga i nomi delle classi desiderate per le implementazioni delle interfacce da un file (property file) e le istanzi a runtime, facendo le veci dellapplicazione

53

HelloWorld con Classe Factory


public class MessageSupportFactory { private static MessageSupportFactory instance = null; private Properties props = null; private MessageRenderer renderer = null; private MessageProvider provider = null; private MessageSupportFactory() { props = new Properties(); try { props.load(new FileInputStream("msf.properties")); // ottiene i nomi delle classi per le interfacce String rendererClass = props.getProperty("renderer.class"); String providerClass = props.getProperty("provider.class"); renderer = (MessageRenderer) Class.forName(rendererClass). newInstance(); provider = (MessageProvider) Class.forName(providerClass). newInstance(); } catch (Exception ex) { ex.printStackTrace(); } }
54

HelloWorld con Classe Factory


static { instance = new MessageSupportFactory(); } public static MessageSupportFactory getInstance() { return instance; } public MessageRenderer getMessageRenderer() { return renderer; } public MessageProvider getMessageProvider() { return provider; } } public class HelloWorldDecoupledWithFactory { public static void main(String[] args) { MessageRenderer mr = MessageSupportFactory.getInstance(). getMessageRenderer(); MessageProvider mp = MessageSupportFactory.getInstance(). getMessageProvider(); mr.setMessageProvider(mp); mr.render(); } }
55

HelloWorld con Classe Factory


File di propriet
# msf.properties renderer.class=StandardOutMessageRenderer provider.class=HelloWorldMessageProvider

modifica del file di propriet Quali problemi ancora?

Ora le implementazioni di message provider e message renderer possono essere modificate tramite semplice

Necessit di scrivere molto glue code per mettere insieme lapplicazione Necessit di scrivere una classe MessageSupportFactory Listanza di MessageProvider deve essere ancora iniettata manualmente nellimplementazione di MessageRenderer
56

HelloWorld usando Spring


public class HelloWorldSpring { public static void main(String[] args) throws Exception { // ottiene il riferimento a bean factory BeanFactory factory = getBeanFactory(); MessageRenderer mr = (MessageRenderer) factory. getBean("renderer"); MessageProvider mp = (MessageProvider) factory. getBean("provider"); mr.setMessageProvider(mp); mr.render(); } // contina

57

HelloWorld usando Spring


// Possibilit di scrivere il proprio metodo getBeanFactory() // a partire da Spring DefaultListableBeanFactoryclass private static BeanFactory getBeanFactory() throws Exception { DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); // creare un proprio lettore delle definizioni PropertiesBeanDefinitionReader rdr = new PropertiesBeanDefinitionReader(factory); // caricare le opzioni di configurazione Properties props = new Properties(); props.load(new FileInputStream("beans.properties")); rdr.registerBeanDefinitions(props); return factory; } }

58

HelloWorld con Spring: Quali Problemi?


Quali vantaggi gi raggiunti in questo modo? Eliminata la necessit di produrre glue code (MessageSupportFactory)

Migliore gestione degli errori e meccanismo di configurazione completamente disaccoppiato Quali problemi ancora? Il codice di startup deve avere conoscenza delle dipendenze di MessageRenderer, deve ottenerle e deve passarle a MessageRenderer
factory sofisticata
In questo caso Spring agirebbe come non pi di una classe

Rimarrebbe al programmatore il compito di fornire il proprio metodo getBeanFactory() usando le API di basso livello del framework Spring

59

HelloWorld con Spring Dependency Injection


Finalmente , utilizzo della Dependency Injection del framework Spring

File di configurazione
#Message renderer renderer.class=StandardOutMessageRenderer # Chiede a Spring di assegnare leffettivo provider alla # propriet MessageProvider del bean Message renderer renderer.messageProvider(ref)=provider #Message provider provider.class=HelloWorldMessageProvider

60

HelloWorld con Spring Dependency Injection


public class HelloWorldSpringWithDI { public static void main(String[] args) throws Exception { BeanFactory factory = getBeanFactory(); MessageRenderer mr = (MessageRenderer) factory. getBean("renderer"); // Nota che non pi necessaria nessuna injection manuale // del message provider al message renderer mr.render(); } private static BeanFactory getBeanFactory() throws Exception { DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); PropertiesBeanDefinitionReader rdr = new PropertiesBeanDefinitionReader(factory); Properties props = new Properties(); props.load(new FileInputStream("beans.properties")); rdr.registerBeanDefinitions(props); return factory; } }
61

HelloWorld con Spring Dependency Injection: Ultime Osservazioni

Il metodo main() deve semplicemente ottenere il bean MessageRenderer e richiamare render()


Non deve ottenere prima il MessageProvider e configurare la propriet MessageProvider del bean MessageRenderer

wiring realizzato automaticamente dalla Dependency Injection di Spring

Nota che non serve nessuna modifica alle classi da collegare insieme tramite dependency injection Queste classi NON fanno alcun riferimento a Spring Nessun bisogno di implementare interfacce del framework Spring Nessun bisogno di estendere classi del framework Spring Classi come POJO puri che possono essere sottoposte a

testing senza alcuna dipendenza da Spring

62

Spring Dependency Injection con file XML


Pi usualmente, dipendenze dei bean sono specificate tramite un file XML
<beans> <bean id="renderer" class="StandardOutMessageRenderer"> <property name="messageProvider"> <ref local="provider"/> </property> </bean> <bean id="provider" class="HelloWorldMessageProvider"/> </beans>

63

Spring Dependency Injection con file XML


public class HelloWorldSpringWithDIXMLFile { public static void main(String[] args) throws Exception { BeanFactory factory = getBeanFactory(); MessageRenderer mr = (MessageRenderer) factory. getBean("renderer"); mr.render(); } private static BeanFactory getBeanFactory() throws Exception { BeanFactory factory = new XmlBeanFactory(new FileSystemResource("beans.xml")); return factory; } }

64

Spring DI con file XML: Costruttore per MessageProvider

<beans> <bean id="renderer" class="StandardOutMessageRenderer"> <property name="messageProvider"> <ref local="provider"/> </property> </bean> <bean id="provider" class="ConfigurableMessageProvider"> <constructor-arg> <value>Questo il messaggio configurabile</value> </constructor-arg> </bean> </beans>

65

Spring DI con file XML: Costruttore per MessageProvider

public class ConfigurableMessageProvider implements MessageProvider { private String message; public ConfigurableMessageProvider(String message) { this.message = message; } public String getMessage() { return message; } }

66

HelloWorld usando Spring AOP


Infine, se volessimo scrivere a video Hello World! sfruttando AOP
public class MessageWriter implements IMessageWriter{ public void writeMessage() { System.out.print("World"); } }

joinpoint linvocazione del metodo writeMessage() Necessit di un around advice

67

HelloWorld usando Spring AOP


Gli advice Spring sono scritti in Java (nessun linguaggio AOP-specific) Pointcut tipicamente specificati in file XML di configurazione Spring supporta solo joinpoint a livello di metodo (ad esempio, impossibile associare advice alla modifica di un campo di un oggetto)

public class MessageDecorator implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { System.out.print("Hello "); Object retVal = invocation.proceed(); System.out.println("!"); return retVal; } }
68

HelloWorld usando Spring AOP


Uso della classe ProxyFactory per creare il proxy delloggetto target Anche modalit pi di base, tramite uso di possibilit predeterminate e file XML, senza istanziare uno specifico proxy

per AOP

public static void main(String[] args) { MessageWriter target = new MessageWriter(); ProxyFactory pf = new ProxyFactory(); // aggiunge advice alla coda della catena delladvice pf.addAdvice(new MessageDecorator()); // configura loggetto dato come target pf.setTarget(target); // crea un nuovo proxy in accordo con le configurazioni factory MessageWriter proxy = (MessageWriter) pf.getProxy(); proxy.writeMessage(); // Come farei invece a supportare lo stesso comportamento // con chiamata diretta al metodo delloggetto target? } }
69

Java Server Faces

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 4.03.JSF.pdf Versione elettronica: 4.03.JSF-2p.pdf
1

Java Server Faces (JSF) Yet another framework per applicazioni Web? Sostanzialmente s Tecnologia fortemente basata su componenti, sia da inserire nelle pagine Web, sia collegati tramite essi a componenti server-side (backing bean)
Ricche API per rappresentazione componenti e gestione loro stato, gestione eventi, validazione e conversione dati server-side,
definizione percorso navigazione pagine, supporto a internazionalizzazione Ampia libreria di tag per aggiungere componenti a pagine Web e per collegarli a componenti server-side

On top del supporto Java Servlet e come alternativa a JSP

Partiamo da un semplice esempio Si pu costruire un backing bean in modo semplice


Annotazione @ManagedBean registra automaticam. il componente come risorsa utilizzabile allinterno del container JSF, da parte di tutte le pagine che conoscano come riferirlo
package hello; import javax.faces.bean.ManagedBean; @ManagedBean public class Hello { final String world = "Hello World!"; public String getworld() { return world; } }

In questo caso il bean Hello super-semplice, ma in generale contiene logica di business (controller) il cui risultato finale , in modo diretto o tramite invocazione di altri componenti, di produrre dati model
3

Partiamo da un semplice esempio


Poi facile costruzione di pagina Web, scritta in XHTML, che usi il backing bean Connessione tra pagina Web e componente tramite espressioni in Expression Language (EL)
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Facelets Hello World</title> </h:head> <h:body> #{hello.world} </h:body> </html>

Esempio di pagina beanhello.xhtml

Facelets come linguaggio per costruzione di view JSF e di alberi di componenti (supporto a XHTML, tag library per
Facelets/JSF, supporto per EL, templating per componenti e pagine Web)

Partiamo da un semplice esempio In tecnologia JSF, inclusa servlet predefinita, chiamata FacesServlet, che si occupa di gestire richieste per pagine JSF
Serve mapping tramite solito descrittore di deployment (web.xml)
<servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>

Ciclo di vita di una applicazione Facelets


Programmatore pu anche non voler avere visibilit della gestione del ciclo di vita dellapplicazione Facelets, svolta automaticamente dal container per JSF (solito container JSP/servlet, con supporto JSF)

Tipico ciclo di vita:


Deployment dellapplicazione su server; prima che arrivi prima richiesta utente, applicazione in stato non inizializzato (anche non compilato) Quando arriva una richiesta, viene creato un albero dei componenti contenuti nella pagina (messo in FacesContext), con

validazione e conversione dati automatizzata Albero dei componenti viene popolato con valori da backing bean (uso di espressioni EL), con possibile gestione eventi e handler
Viene costruita una view sulla base dellalbero dei componenti Rendering della vista al cliente, basato su albero componenti Albero componenti deallocato automaticamente In caso di richieste successive (anche postback), lalbero viene ri-allocato
6

Ciclo di vita JSF


Recupera una vecchia o costruisce una nuova pagina (view)

Ciclo di vita JSF


Valori inviati sono memorizzati come valori locali. Se dati non validi o conversioni impossibili, Render Response e utente vede dati errati

Ciclo di vita JSF

Valori locali OK, usati per aggiornare backing bean

Ciclo di vita JSF

Action method associato con bottone o link che ha causato form submission viene eseguito Restituisce stringa per navigation handler Navigation handler usa stringa per determinare pagina seguente
10

Ciclo di vita JSF


Catena di default per il modello JSF

11

Ciclo di vita JSF (esempietto)

Evento! !!!!!!!

XHTML

Filtri per validare l'input

12

Un esempio un po pi realistico (1)


package guessNumber; import java.util.Random; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; @ManagedBean @SessionScoped public class UserNumberBean { Integer randomInt = null; Integer userNumber = null; String response = null; private long maximum=10; private long minimum=0; public UserNumberBean() { Random randomGR = new Random(); randomInt = new Integer(randomGR.nextInt(10)); System.out.println(Numero estratto: " + randomInt); } public void setUserNumber(Integer user_number) { userNumber = user_number; } public Integer getUserNumber() { return userNumber; }
Dico all'utente:"ho estratto un numero indovinalo" l'utente in una form dovr scrivere il valore e vedere se ha indovinato,logica di business molto semplice

13

Un esempio un po pi realistico (2)


public String getResponse() { if ((userNumber != null) && (userNumber.compareTo(randomInt) == 0)) { return Indovinato!"; } else { return Mi dispiace, "+userNumber+" non corretto"; } } public long getMaximum() { return (this.maximum); } public void setMaximum(long maximum) { this.maximum = maximum; } public long getMinimum() { return (this.minimum); } public void setMinimum(long minimum) { this.minimum = minimum; } }

Lannotazione @SessionScoped fa s che lo scope del bean sia la sessione. Altre possibilit: request, application, scopeless
14

Un esempio un po pi realistico (3)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Guess Number Facelets Application</title> </h:head> <h:body> <h:form> <h:graphicImage value="#{resource[images:wave.med.gif]}"/> <h2> Sto pensando a un numero fra #{userNumberBean.minimum} e #{userNumberBean.maximum}. Vuoi indovinarlo? <p></p> <h:inputText id="userNo" value="#{userNumberBean.userNumber}"> <f:validateLongRange minimum="#{userNumberBean.minimum} maximum="#{userNumberBean.maximum}"/> </h:inputText>

15

Un esempio un po pi realistico (4)


<h:commandButton id="submit" value="Submit action="response.xhtml"/> <h:message showSummary="true" showDetail="false" style="color: red; font-family: New Century Schoolbook, serif; font-style: oblique; text-decoration: overline" id="errors1 for="userNo"/> </h2></h:form></h:body>

Notare: i tag HTML Facelets per aggiungere componenti alla pagina (cominciano con h:) il tag f:validateLongRange per validazione automatica dellinput utente Inoltre, utilizzo di funzionalit di navigazione implicita, ridirezione della risposta verso response.xhtml (prossimo lucido)
16

Un esempio un po pi realistico (5): response.xhtml


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Guess Number Facelets Application</title> </h:head> <h:body><h:form> <h:graphicImage value="#{resource[images:wave.med.gif]}"/> <h2> <h:outputText id="result" value="#{userNumberBean.response}"/> </h2> <h:commandButton id="back" value="Back" action="greeting.xhtml"/> </h:form> </h:body> </html>

17

JSF e templating Facilit di estensione e riuso come caratteristica generale di JSF Templating: utilizzo di pagine come base (o template) per altre pagine, anche mantenendo look&feel uniforme
Ad esempio, tag: ui:insert parte di un template in cui potr essere inserito contenuto (tag di amplissimo utilizzo) ui:component definisce un componente creato e aggiunto allalbero dei componenti ui:define definisce contenuto con cui pagina riempie template (vedi insert) ui: include incapsula e riutilizza contenuto per pagine multiple ui: param per passare parametri a file incluso

18

Esempio di template (template.xhtml)


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html">

<h:head>
<meta http-equiv="Content-Type content="text/html; charset=UTF-8"/> <link href="./resources/css/default.css rel="stylesheet" type="text/css"/> <link href="./resources/css/cssLayout.css rel="stylesheet type="text/css"/>

<title>Facelets Template</title> </h:head> <h:body> <div id="top" class="top"> <ui:insert name="top">Top Section</ui:insert></div> <div> <div id="left"> <ui:insert name="left">Left Section</ui:insert></div> <div id="content" class="left_content"> <ui:insert name="content">Main Content</ui:insert></div> </div></h:body></html>
19

Esempio di pagina XHTML che utilizza template


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html"> <h:body> <ui:composition template="./template.xhtml"> <ui:define name="top"> Welcome to Template Client Page </ui:define> <ui:define name="left"> <h:outputLabel value="You are in the Left Section"/> </ui:define> <ui:define name="content"> <h:graphicImage value="#{resource[images:wave.med.gif]}"/> <h:outputText value="You are in the Main Content Section"/> </ui:define> </ui:composition> </h:body></html>

20

faces-config.xml
Necessit di file configurazione specifico per JSF: faces-config.xml Soprattutto per configurazione navigation rule e managed bean
<?xml version='1.0' encoding='UTF-8'?> <faces-config> <application> <locale-config> <default-locale>en</default-locale> </locale-config></application> <validator> <validator-id>ISBNValidator</validator-id> <validator-class>com.oreilly.jent.jsf.library.validator. ISBNValidator </validator-class> </validator> <navigation rule> <managed bean> </faces-config>

21

Navigation rule
Ogni regola di navigazione come un flowchart con un ingresso e uscite

multiple possibili

Un singolo <from-view-id> per fare match con URI


Quando restituito controllo, stringa risultato viene valutata (ad es. success, failure, verify, login) <from-outcome> deve fare match con stringa risultato <to-view-id> determina URI verso cui fare forwarding
<navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-action>#{LoginForm.login}</from-action> <from-outcome>success</from-outcome> <to-view-id>/storefront.xhtml</to-view-id> </navigation-case> <navigation-case> <from-action>#{LoginForm.logon}</from-action> <from-outcome>failure</from-outcome> <to-view-id>/logon.xhtml</to-view-id> </navigation-case> </navigation-rule>

Caso 1 di navigazione

Caso 2 di navigazione

22

JSF Managed Bean


Configurati nella seconda parte di faces-config.xml Semplici JavaBean che seguono regole standard:
Costruttore senza argomenti (empty) No variabili di istanza public Metodi accessor per evitare accesso diretto a campi Metodi getXxx() e setXxx()

JSF Managed Bean hanno anche metodi cosiddetti action Invocati automaticam. in risposta ad azione utente o evento
Simili a classi Action in STRUTS

4 possibili scope: Application singola istanza per applicazione Session nuova istanza per ogni nuova sessione utente Request nuova istanza per ogni richiesta Scopeless acceduta anche da altri bean e soggetta a garbage cllection come ogni oggetto Java
23

Configurazione JSF Managed Bean


Anche annotazioni equivalenti
<managed-bean> <managed-bean-name>library</managed-bean-name> <managed-bean-class>com.oreilly.jent.jsf.library.model.Library </managed-bean-class> <managed-bean-scope>application</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>usersession</managed-bean-name> <managed-bean-class>com.oreilly.jent.jsf.library.session.UserSession </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> <managed-bean-name>loginform</managed-bean-name> <managed-bean-class>com.oreilly.jent.jsf.library.backing.LoginForm </managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean>

24

Ulteriori dettagli e manualistica


Per ulteriori dettagli su: Tag vari per componenti da inserire in pagine e loro attributi (ampio set supportato) Tag per componenti command per azioni di navigazione Core tag (JSF core tag library) per definire/usare listener,

converter e validator

vedi D. Geary, C. Hosrtmann, Core Java Server Faces, Prentice Hall, 2007 C. Schalk, E. Burns, Java Server Faces The Complete Reference, McGraw-Hill, 2007 Oracle, Java EE 6 Tutorial, http://download.oracle.com/javaee/6/tutorial/doc/, 2011

25

Tecnologie Web T Accesso Diretto alle Basi di Dati: Interfacce e Astrazioni

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 5.01.AccessoDB.pdf Versione elettronica: 5.01.AccessoDB-2p.pdf
Accesso DB 1

Gestione della persistenza Dalle lezioni precedenti sappiamo che una parte rilevante degli sforzi nello sviluppo di ogni applicazione distribuita di livello enterprise si concentra sul layer di persistenza Accesso, manipolazione e gestione di dati persistenti, tipicamente mantenuti in un DB relazionale Il mapping Object/Relational si occupa di risolvere il potenziale mismatch fra dati mantenuti in un DB relazionale (table-driven) e il loro processamento fatto

da oggetti in esecuzione

DB relazionali sono progettati per operazioni di query efficienti su dati di tipo tabellare Necessit di lavorare invece tramite interazione fra oggetti
Accesso DB 2

Un piccolo passo indietro Come accedere ai dati di un DB? Dal Corso di Sistemi Informativi T, sappiamo che possibile mediante istruzioni SQL eseguite interattivamente

Accesso DB

Accesso diretto alle basi di dati (1/2) anche possibile (ed di gran lunga laccesso a DB pi tipico) inserire istruzioni SQL direttamente nel codice di unapplicazione scritta in un linguaggio di programmazione ospite (ad es. C, C++, Java, C#)
Esempio Java - JDBC:
System.out.println("Retrieve some data from the database.."); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM EMPLOYEE"); // display the result set while (rs.next()) { String number = rs.getString(1); String name = rs.getString(2); System.out.print(" empno= " + number); System.out.print(" firstname= " + name); System.out.print("\n"); } rs.close(); stmt.close();
Accesso DB 4

Accesso diretto alle basi di dati (2/2) Il problema da risolvere relativo allintegrazione tra i comandi SQL, i quali sono responsabili di realizzare laccesso al DB, e le normali istruzioni del linguaggio di programmazione Due soluzioni possibili: SQL Embedded o incastonamento: SQL viene integrato direttamente allinterno del normale linguaggio di programmazione
Es. di soluzione sono i cursori e SQL dinamico

Call Level Interface (CLI): lintegrazione con SQL avviene tramite linvocazione di una opportuna libreria di funzioni
Es. di soluzione sono ODBC, OLE DB, ADO e JDBC

Accesso DB

SQL Embedded Lincastonamento prevede di introdurre direttamente nel programma sorgente le istruzioni SQL distinguendole dalle normali istruzioni tramite un opportuno separatore Lo standard SQL prevede che il codice SQL sia preceduto dalla stringa exec sql e termini con il carattere '; Preprocessore che espande i comandi SQL
Cursori: strumento che permette a un programma di accedere alle righe di una tabella una alla volta; viene definito su una generica interrogazione SQL dinamico: permette allapplicazione di definire al momento dellesecuzione le interrogazioni SQL da effettuare sulla base di dati
Valore dei parametri (per istruzioni con struttura predefinita) Forma delle interrogazioni
Accesso DB 6

Call Level Interface Mette direttamente a disposizione del programmatore una libreria di funzioni che permettono di interagire con un DBMS Rispetto a SQL Embedded, CLI rappresenta uno

strumento pi flessibile e meglio integrato con il linguaggio di programmazione

anche se occorre gestire esplicitamente aspetti che con SQL Embedded sono demandati direttamente al preprocessore

Accesso DB

Modo duso generale CLI Una applicazione che accede (in lettura e/o scrittura) ad una sorgente di dati ha bisogno di fare le seguenti operazioni:
1. 2. 3. aprire una connessione alla sorgente dati inviare attraverso la connessione istruzioni (di interrogazione e aggiornamento) alla sorgente dati processare i risultati ricevuti dalla sorgente dati in risposta alle istruzioni inviate

Le nostre sorgenti dati sono DB relazionali, gestiti da un DBMS


a scelta tra DB2 (consigliato), MySQL, Hsqldb

Ogni DBMS espone una API (Application Program Interface) Le applicazioni, per noi Java, interagiscono con le API del DBMS attraverso un driver
Accesso DB 8

Soluzioni CLI Piattaforma software Microsoft


ODBC (Object DataBase Connectivity ): interfaccia standard che permette di accedere a DB in qualunque contesto, realizzando interoperabilit con diverse combinazioni DBMS-

Piattaforma-Reti

OLE DB (Object Linking and Embedding for DataBases): soluzione proprietaria Microsoft che permette ad applicazioni Windows di accedere a sorgenti dati generiche, non solo relazionali ma anche a una vasta tipologia di archivi dati, quali caselle di posta elettronica; basata sul modello a oggetti COM ADO (ActiveX Data Object): interfaccia proprietaria Microsoft di alto livello ai sevizi offerti da OLE DB basata su una interfaccia record(tupla)-oriented

JDBC Soluzione per laccesso ai dati in Java sviluppata da Sun Microsystem; controparte di ODBC per Java
Accesso DB 9

Diverse soluzioni a confronto Nome


SQL Embedded

Descrizione
Le istruzione SQL sono introdotte direttamente allinterno del listato programma, distinte da un separatore (exec sql <istruzione> ;) Soluzione proprietaria Microsoft che consente, grazie alluso di driver specifici, di interfacciare il linguaggio di programmazione con il DBMS

Pro :)
Cursori per gestire risultati composti da pi tuple; SQL dinamico per ottenere flessibilit Integrato in Windows; Driver offerti dai maggiori produttori di DBMS; Interfacciamento con altri tipi di dato (documenti, mailbox, ecc.) Java, multipiattaforma, codice aperto; Disponibile per qualsiasi DBMS grazie anche al ponte ODBC

Contro :(
Necessit di un preprocessore e di un supporto DBMS-piattaformalinguaggio-compilatore

OLE DB/ ADO

Dialetto SQL ristretto; Proprietario; Utilizzato solo su linguaggi e su piattaforme Microsoft

JDBC

Interfaccia fra il mondo Java ed i diversi DBMS. Utilizza dei driver specifici ma offre anche un ponte con ODBC (non vero linverso)

Come ODBC richiede la disponibilit di un driver offerto dal DBMS

Accesso DB

10

ODBC Acronimo di Open Database Connectivity API standard definita da Microsoft nel 1992 Permette laccesso a dati residenti in DB relazionali in un contesto eterogeneo e distribuito Es. DBMS: Access, MySQL, DB2, Oracle, Hsqldb, Permette ai programmatori di formulare richieste SQL che accederanno a dati relativi a DB distinti senza

dover conoscere le interfacce proprietarie di ogni singolo DB

Gestisce richieste SQL convertendole in un formato comprensibile al particolare DBMS

Accesso DB

11

Architettura ODBC
Application

ODBC Driver Manager

ODBC Driver (DBMS/OS/network)

Data Source

Accesso DB

12

JDBC API Java standard definita da Sun Microsystems nel 1996


Sun assicura che JDBC NON acronimo di Java Database Connectivity ma un semplice marchio registrato!!

Rappresenta la controparte Java di ODBC Permette di accedere ai database (locali e remoti ) in

modo uniforme

Garantisce accesso ai database in modo

indipendente dalla piattaforma I driver JDBC sono collezioni di classi Java che
implementano metodi definiti dalle specifiche JDBC Le classi Java che realizzano funzionalit JDBC sono contenute nei package
java.sql: classi fondamentali javax.sql: estensioni
Accesso DB 13

JDBC vs ODBC ODBC non appropriato per un uso diretto dal linguaggio Java perch usa interfacce scritte in linguaggio C Una traduzione da API C ODBC a API Java non raccomandata Una API Java come JDBC necessaria per permettere una soluzione Java pura JDBC normalmente utilizzato da programmatori Java per connettersi a DB relazionali Attraverso un piccolo programma bridge possibile usare linterfaccia JDBC per accedere a DB accessibili via ODBC

Accesso DB

14

Storia di JDBC Prima distribuzione (jdbc.sql) JDBC fa parte del pacchetto software JDK a partire dalla versione 1.1 (pakage java.sql) Con Java 2, stato introdotto JDBC 2.0: Migliorate le funzionalit e i tipi di dato disponibili Offerto come package opzionale per funzionalit estese Java SE 6 include JDBC 4.0

Accesso DB

15

Architettura JDBC
Java Application
utilizza le interfacce java.sql e javax.sql implementano java.sql e, in alcuni casi javax.sql

JDBC Driver Manager


Type 2 Type 1 Type 4 Type 3

JDBC/Native Bridge Native Driver (DBMS specific)

JDBC/ODBC Bridge

All Java JDBC Driver

All Java JDBC/Net Bridge

ODBC Driver Network Server DBMS


Accesso DB

data source
16

JDBC Driver Manager Rappresenta il livello di gestione di JDBC e opera tra lutente e i driver Tiene traccia dei driver disponibili e gestisce la creazione di una connessione tra un DB e il driver appropriato

Accesso DB

17

Driver JDBC JDBC un insieme di interfacce; per usare uninterfaccia necessario fornire unimplementazione per tutti i metodi che la compongono Linsieme delle classi Java che implementano le

interfacce JDBC rappresentano un modulo software

chiamato driver JDBC Ogni DBMS ha il proprio driver rilasciato dal produttore o sviluppato da terze parti Sono i driver che realizzano la vera comunicazione con il DB

Accesso DB

18

Tipi di driver (1/3) Sono di quattro tipi e possono essere suddivisi in due categorie: 2-tier: client colloquiano direttamente con DB 3-tier: client comunicano con un middle-tier che accede al DB

Accesso DB

19

Tipi di driver (2/3) Modello 3-tier: affinch lapplicazione possa interagire con il DB occorre che le chiamate JDBC siano convertite in chiamate API native (caso JDBC/native bridge) o in chiamate ODBC (caso JDBC/ODBC bridge)
Lutente pu utilizzare una API di alto livello (di pi semplice utilizzo) che viene tradotta dal driver in chiamate di basso livello Non realmente portabile in quanto richiede lutilizzo di componenti nativi (specifici dellambiente in cui vengono eseguiti)

Modello 2-tier: lapplicazione interagisce direttamente con il DB mediante un opportuno protocollo di rete, per es. TCP/IP (caso driver JDBC middleware, detto anche Net-Driver), oppure mediante un protocollo di rete proprietario (caso driver JDBC Driver)
Si appoggia su un ambiente completamente Java
Accesso DB 20

Tipi di Driver (2/2)


Type 1 - drivers that implement the JDBC API as a mapping to another data access API, such as ODBC. Drivers of this type are generally dependent on a native library, which limits their portability (JDBC-ODBC Bridge driver is an example of a Type 1 driver) Type 2 - drivers that are written partly in the Java programming language and partly in native code. These drivers use a native client library specific to the data source to which they connect. Again, because of the native code, their portability is limited Type 3 - drivers that use a pure Java client and communicate with a middleware server using a database-independent protocol. The middleware server then communicates the clients requests to the data source Type 4 - drivers that are pure Java and implement the network protocol for a specific data source. The client connects directly to the data source

Accesso DB

21

Driver: Type 1, Type 2


Type 1: JDBC-ODBC Bridge plus

ODBC Driver

This combination provides JDBC access via ODBC drivers. ODBC binary code -- and in many cases, database client code -- must be loaded on each client machine that uses a JDBC-ODBC Bridge. Sun provides a JDBC-ODBC Bridge driver, which is appropriate for experimental use and for situations in which no other driver is available Type 2: A native API partly Java

technology-enabled driver

This type of driver converts JDBC calls into calls on the client API for Oracle, Sybase, Informix, DB2, or other DBMS. Note that, like the bridge driver, this style of driver requires that some binary code be loaded on each client machine
Accesso DB

Driver di tipo 1

Driver di tipo 2

22

Driver: Type 3, Type 4


Type 4: Direct-to-Database Pure

Java Driver

This style of driver converts JDBC calls into the network protocol used directly by DBMSs, allowing a direct call from the client machine to the DBMS server and providing a practical solution for intranet access
Type 3: Pure Java Driver for

Database Middleware

This style of driver translates JDBC calls into the middleware vendor's protocol, which is then translated to a DBMS protocol by a middleware server. The middleware provides connectivity to many different databases
Accesso DB

Driver di tipo 4

Driver di tipo 3

23

Tipi di driver a confronto


Tipo 1: Ponte JDBC-ODBC Driver
prestazioni scadenti non indipendente dalla piattaforma fornito a corredo di JDK

Tipo 2: Ponte JDBC-Native Driver


migliori prestazioni non indipendente dalla piattaforma

Tipo 3: Driver Java Puro per Accesso a DB via Middleware


client indipendente dalla piattaforma servizi avanzati (caching) architettura complessa

Tipo 4: Driver Java Puro per Accesso Diretto a DB


client indipendente dalla piattaforma buone prestazioni scaricabile dinamicamente

Per approfondimenti:

http://java.sun.com/products/jdbc/driverdesc.html
Accesso DB

24

Schema di uso di JDBC Accesso a DB con JDBC consiste nel:


Caricare la classe del driver JDBC Ottenere una connessione dal driver Eseguire statement SQL Utilizzare risultati delle query Chiudere la connessione e rilasciare strutture dati utilizzate per la gestione del dialogo con il DB

Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance(); Connection conn = DriverManager.getConnection("jdbc:db2:MYDB"); Statement stm = conn.createStatement(); ResultSet res = stm.executeQuery("SELECT * FROM MYTABLE"); while (res.next()) { String col1 = res.getString("MYCOL1"); int col2 = res.getInt("MYCOL2"); }
Accesso DB 25

Interfacce e calssi JDBC LAPI JDBC 4.0 core mette a disposizione pi di 20 tra interfacce e classi Alcune fra le pi importanti sono Driver DriverManager Connection Statement ResultSet

Accesso DB

26

Interfaccia Driver (1/2) Rappresenta il punto di partenza per ottenere una connessione a un DBMS I produttori di driver JDBC implementano linterfaccia Driver (mediante opportuna classe) affinch possa funzionare con un tipo particolare di DBMS La classe che implementa Driver pu essere considerata la factory per altri oggetti JDBC ad esempio, oggetti di tipo Connection Ad esempio, IBM nel suo Driver Java Puro implementa linterfaccia Driver mediante la classe: COM.ibm.db2.jdbc.app.DB2Driver

Accesso DB

27

Interfaccia Driver (2/2) possibile ottenere unistanza effettiva della classe Driver ricercando la classe con il metodo forName:
Driver d = Class.forName(COM.ibm.db2.jdbc.app.DB2Driver). .newInstance();

Avendo a disposizione un oggetto Driver possibile ottenere la connessione al database Ogni driver JDBC ha una stringa di connessione che riconosce nella forma: jdbc:product_name:database_alias
dove database_alias specifica il DB a cui connettersi nel caso specifico della configurazione DB2 in LAB4: dbc:db2:[sample|tw_stud]
Accesso DB 28

Classe DriverManager Facilita la gestione di oggetti di tipo Driver Quando un oggetto Driver viene istanziato, esso viene automaticamente registrato nella classe DriverManager Ogni applicazione pu registrare uno o pi driver JDBC diversi tra loro Consente la connessione con il DBMS sottostante Mediante il metodo statico getConnection Usa il driver opportuno tra quelli registrati

Accesso DB

29

Interfaccia Connection Un oggetto di tipo Connection rappresenta una connessione attiva con il DB Il metodo getConnection di DriverManager, se non fallisce, restituisce un oggetto di tipo Connection Linterfaccia mette a disposizione una serie di metodi per le operazioni, tra le quali: Preparazione di query SQL da inviare tramite oggetti
Statement PreparedStatement CallableStatement

Accesso DB

30

Interfaccia Statement Gli oggetti di tipo Statement possono essere usati per inviare query SQL semplici verso il DBMS sottostante query che non fanno uso di parametri La query pu essere di modifica UPDATE, INSERT, CREATE oppure di selezione SELECT Per query di tipo SELECT il risultato inserito in un oggetto ResultSet Un oggetto Statement pu essere creato con il metodo createStatement di Connection

Accesso DB

31

Interfaccia PreparedStatement Gli oggetti di tipo PreparedStatement possono essere usati per creare query SQL parametriche (parametri di tipo IN) e precompilate (prepared) Il valore di ciascun parametro non specificato nel momento in cui lo statement SQL definito, ma rimpiazzato dal carattere ? pi efficiente perch una volta che la query preparata, sar pre-compilata per usi futuri Un oggetto PreparedStatement pu essere creato con il metodo prepareStatement di Connection

Accesso DB

32

Interfaccia CallableStatement Gli oggetti di tipo CallableStatement possono essere usati per definire query parametriche con parametri di tipo IN, OUT e INOUT Permettono di eseguire una invocazione a una stored procedure memorizzata sul server DB Un oggetto CallableStatement pu essere creato con il metodo prepareCall di Connection

Accesso DB

33

Interfaccia ResultSet Loggetto ResultSet il risultato di una query di selezione (SELECT) Rappresenta una tabella composta da righe (gli elementi selezionati) e colonne (gli attributi richiesti) Nella versione 1.x di JDBC era possibile accedere a un ResultSet obbligatoriamente dal primo elemento allultimo e una sola volta Con JDBC 4.0 si pu accedere in modo casuale alle righe, inserirle, cancellarle e modificarle

Accesso DB

34

JDBC e DB2 DB2 prevede 2 driver JDBC di tipo two-tier:


1. Net-Driver: COM.ibm.db2.jdbc.net.DB2Driver 2. Driver Java puro: COM.ibm.db2.jdbc.app.DB2Driver entrambi sono contenuti nel file db2java.zip (direttorio C:\Programmi\IBM\SQLLIB\java della macchina client)

Il Net-Driver serve per connettersi via rete (ad esempio, mediante il protocollo di rete TCP/IP) a server remoti a condizione che questi abbiano attivo il servizio DB2 Jdbc Applet Server Il Driver Java puro permette di connettersi ad istanze DB2 residenti sulla macchina locale o catalogate localmente mediante un protocollo di rete proprietario DB2
Accesso DB 35

Programmare unapplicazione JDBC Passi principali: 1. 2. 3. 4. 5. Importazione package Registrazione driver JDBC Apertura connessione al DB (Connection) Creazione oggetto Statement Esecuzione query e eventuale restituzione oggetto ResultSet 6. Utilizzo risultati 7. Chiusura oggetto/i ResultSet e oggetto/i Statement 8. Chiusura connessione
Accesso DB 36

1: Importazione package
// // // // Questo programma mostra un *semplice esempio* di applicazione Java (Esempio.java) in grado di eseguire interrogazioni/aggiornamenti sul database DB2 SAMPLE utilizzando JDBC

//importazione package
import java.sql.*; //package JDBC

SPARATEMI NON LA REGGO PIU'

Accesso DB

37

2: Registrazione driver JDBC


class Esempio { public static void main(String argv[]) { try { // caricamento e registrazione driver Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();

Accesso DB

38

3: Apertura connessione DB
Connection con = null; // URL jdbc:db2:database_alias String url = "jdbc:db2:sample"; if (argv.length == 2) { String userid = argv[0]; String passwd = argv[1]; // connessione con id/passwd forniti dallutente con = DriverManager.getConnection(url, userid, passwd); } else { System.out.println("\nUsage: java Esempio username password\n"); System.exit(0); }

Accesso DB 39

4. Creazione oggetto Statement


// interrogazione table EMPLOYEE System.out.println("Retrieve some data from the database"); Statement stmt = con.createStatement();

SONO PASSI STANDARD!!!!

Accesso DB

40

5. Esecuzione query 6. Utilizzo oggetto ResultSet


// esegue la query ResultSet rs = stmt.executeQuery("SELECT * FROM DB2INST1.EMPLOYEE"); System.out.println("Received results:"); // mostra i risultati // rs.next() = false se non ci sono pi righe risultato while (rs.next()) { String number = rs.getString(1); String name = rs.getString(2); System.out.print(" empno= " + number); System.out.print(" firstname= " + name); System.out.print("\n"); }

Accesso DB 41

7. Chiusura oggetti ResultSet e Statement


// chiude ResultSet e Statement rs.close(); stmt.close(); // Esecuzione di altre istruzioni SQL // aggiorna il database prova ad aggiornarlo! System.out.println("\n\nUpdate the database... "); stmt = con.createStatement(); int rowsUpdated = stmt.executeUpdate("UPDATE DB2INST1.EMPLOYEE SET firstname = 'SHILI WHERE empno = '000010'"); System.out.print("Changed "+rowsUpdated); if (1 == rowsUpdated) System.out.println(" row."); else System.out.println(" rows."); stmt.close(); // chiude Statement

Accesso DB 42

8. Chiusura connessione
// chiude Connection con.close(); } // try catch( Exception e ) { e.printStackTrace(); } } // main } // classe
Arrivati alla fine prego iscriversi al corso di bestemmia comparata :P

Scopo di questo semplice esempio didattico solo quello di

evidenziare luso di base delle API JDBC

Come vedremo meglio in laboratorio


connessione, statement, resultSet devono essere sempre chiusi dopo essere stati usati (rilasciamo risorse!!) Per aver questa garanzia, effettuiamo queste operazioni sempre nella clausola finally Ogni metodo JDBC lancia una eccezione; tali eccezioni possono essere gestite rilanciando una eccezione di livello logico opportuno
Accesso DB 43

Oggetto Statement Un oggetto Statement fornisce tre metodi per eseguire una query SQL: (StatementObj.) executeQuery(stmt SQL), per statement che generano un unico result set (SELECT) (StatementObj.) executeUpdate(stmt SQL), per statement di modifica (UPDATE, INSERT, ecc.) (StatementObj.) execute(stmt SQL), per statement che generano pi di un risultato o pi di un contatore di aggiornamento

Accesso DB

44

executeQuery Usato tipicamente per query di tipo SELECT Restituisce un oggetto ResultSet

Accesso DB

45

executeUpdate Usato per statement di tipo DML quali INSERT, UPDATE o DELETE e per statement di tipo DDL quali CREATE TABLE e DROP TABLE Restituisce un intero rappresentante il numero di righe che sono state inserite/aggiornate/cancellate contatore di aggiornamento In caso di statement di tipo DDL, restituisce sempre il valore 0

Accesso DB

46

execute Usato quando la query restituisce pi di un risultato o pi di un contatore di aggiornamento Utilizza i seguenti metodi: (StatementObj.) getResultSet() per ottenere il result set successivo (StatementObj.) getUpdateCount() per ottenere il contatore di aggiornamento successivo (StatementObj.) getMoreResults() per sapere se ci sono altri result set o contatori di aggiornamento Restituisce true se il risultato corrente di tipo ResultSet; false se il risultato di tipo Count o non ci sono pi risultati

Accesso DB

47

Oggetto ResultSet Un oggetto ResultSet contiene il risultato di una query SQL (cio una tabella) Un oggetto ResultSet mantiene un cursore alla riga corrente Per ottenere un valore relativo alla riga corrente: (ResultSetObj.) getXXX(column-name) (ResultSetObj.) getXXX(column-number) Per spostare il cursore dalla riga corrente a quella successiva: (ResultSetObj.) next() (restituisce true in caso di successo; false se non ci sono pi righe nellinsieme risultato)

Accesso DB

48

I metodi getxxx Permettono la lettura degli attributi di una tabella getByte getShort getInt getLong getFloat getDouble getBigDecimal getBoolean getString getBytes getDate getTime getTimestamp getAsciiStream getUnicodeStream getBinaryStream getObject

Accesso DB

49

Controllo sui valori NULL I valori NULL SQL sono convertiti in null, 0, o false, dipendentemente dal tipo di metodo getXXX Per determinare se un particolare valore di un risultato corrisponde a NULL in JDBC: Si legge la colonna Si usa il metodo (ResultSetObject.) wasNull()

Accesso DB

50

Controllo sui tipi di dato Il dialogo tra una applicazione Java e i DB sottostanti

richiede che i tipi di dato SQL siano mappati in corrispondenti tipi di dato Java e viceversa. La

conversione (SQL2Java) riguarda tre categorie: Tipi SQL che hanno diretti equivalenti in Java (es. il tipo SQL INTEGER equivalente al tipo Java int) Tipi SQL che possono essere convertiti negli equivalenti tipi Java (es. i tipi SQL CHAR e VARCHAR possono essere convertiti nel tipo Java String) Tipi SQL che sono unici (una minoranza) e che necessitano la creazione di uno speciale oggetto Java (es. il tipo SQL DATE si converte nelloggetto Date definito dallomonima classe Java)
Accesso DB 51

Mapping SQL2Java
SQL type CHAR VARCHAR LONGVAR CHAR NUMERIC DECIMAL BIT TINYINT SMALLINT INTEGER Java Type String String String java.math.Big Decimal java.math.Big Decimal boolean byte short int TIMESTAMP SQL Type BIGINT REAL FLOAT DOUBLE BINARY VARBINARY LONGVAR BINARY DATE TIME Java Type long float double double byte[] byte[] byte[] java.sql.Date java.sql.Time java.sql.Time stamp

Accesso DB

52

Oggetto PreparedStatement Usato quando la query SQL prende uno o pi parametri come input, o quando una query semplice deve essere eseguita pi volte Linterfaccia PreparedStatement estende linterfaccia Statement ereditandone tutte le funzionalit. In pi sono presenti metodi per la gestione dei parametri Loggetto viene creato con listruzione Connection.prepareStatement(stmt SQL) I parametri vengono poi settati mediante il metodo (StatementObj.) setXXX(n,value) La query pre-compilata viene eseguita mediante i metodi executeQuery(), executeUpdate() o execute() senza bisogno di passare alcun parametro!!
Accesso DB 53

PreparedStatement: Esempio I parametri sono specificati con ? Esempio:


PreparedStatement ps = con.prepareStatement( "UPDATE MyTable SET a = ? WHERE b = ?");

Per istanziare i parametri ? (necessariamente prima dellesecuzione):


ps.setInt(1, 20); ps.setInt(2,100);

Per eseguire lo statement:


int res = ps.executeUpdate();

Accesso DB

54

I metodi setxxx Permettono lassegnamento dei parametri di uno statement SQL setByte setShort setInt setLong setFloat setDouble setBigDecimal setBoolean setNull setString setBytes setDate setTime setTimestamp setAsciiStream setUnicodeStream setBinaryStream setObject

Accesso DB

55

Mapping Java2SQL
Java Type SQL type Java Type float double SQL type REAL DOUBLE VARBINARY or LONGVARBINARY DATE TIME

String

VARCHAR or LONGVARCHAR
NUMERIC BIT TINYINT

java.math. BigDecimal
boolean byte

byte[] java.sql.Date java.sql.Time

short
int long

SMALLINT
INTEGER BIGINT

java.sql.Timestamp TIMESTAMP

Accesso DB

56

Il problema dellSQL injection Cosa succede se, data una query con valori di input dellutente (es. tramite interfaccia Web), questi ha la possibilit di agire direttamente sul valore dellinput di tipo stringa (oggetto String), aggiungendo, ad esempio, apici e altre istruzioni di controllo?? Pu inserire istruzioni arbitrarie che verranno eseguite dal DBMS!!!
Esempio:
Statement = SELECT * FROM users WHERE name = + userName + ; con la variabile userName assegnata al valore: a;DROP TABLES users;

Accesso DB

57

SQL injection una tecnica che frutta la vulnerabilit a livello di

sicurezza dello strato DB di una applicazione

Tale vulnerabilit presente quando i dati di input dellutente sono: Filtrati in modo incorretto per la verifica di caratteri literal escape nelle stringhe Non sono fortemente tipati o non sono controllati i vincoli di tipo SQL injection in quanto l'utente pu iniettare statement SQL arbitrari con risultati catastrofici: divulgazione di dati sensibili o esecuzione di codice Per proteggere le nostre applicazioni dallSQL injection, i dati di input dellutente NON devono essere

direttamente incastonati allinterno di Statement SQL


Accesso DB

58

Prevenire SQL injection A prevenzione del problema, linterfaccia PreparedStatement permette di gestire in modo corretto anche linserimenti di dati ostili Si tratta di statement parametrizzati che permettono di lavorare con parametri (o variabili bind) invece che di incastonare i dati di input dellutente direttamente nello statement
SQL statement fisso i dati di input dellutente sono assegnati ai parametri (bounding)

Accesso DB

59

La storia del piccolo Bobby Tables


(From the comic strip xkcd)

School: "Hi, this is your son's school. We're having some computer trouble." Mom: "Oh, dear -- Did he break something?" School: "In a way. Did you really name your son Robert'); DROP TABLE Students;-- ?" Mom: "Oh. Yes. Little Bobby Tables we call him." School: "Well, we've lost this year's student records. I hope you're happy." Mom: "And I hope you've learned to sanitize your database inputs."
(Alt-text: "Her daughter is named Help I'm trapped in a driver's license factory.")

C solo un modo per evitare attacchi di tipo Bobby Tables


Non creare mai statement SQL che includono dati di input utente Usare sempre chiamate SQL parametrizzate (PreparedStatement)
Accesso DB 60

Riferimenti Sito Sun - The Java Tutorial http://java.sun.com/docs/books/tutorial/jdbc /index.html Sito Sun Java SE - Java Database Connectivity (JDBC) http://java.sun.com/javase/technologies/data base/index.jsp Per la documentazione relativa ai pakage java.sq e javax.sql, fare riferimento a Java2Docs Atzeni, Ceri, Paraboschi, Torlone. Basi di dati, McGraw-Hill Italia, 2009

Accesso DB

61

Tecnologie Web T Pattern DAO, Object-Relational Mapping e Hibernate

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 5.02.DAO-ORM-Hibernate.pdf Versione elettronica: 5.02. DAO-ORM-Hibernate-2p.pdf
DAO, ORM e Hibernate 1

Gestione della persistenza Le nostre applicazioni sono sviluppate con linguaggi OO (lo stesso vale anche per i moderni sistemi informativi) mentre la persistenza dei dati affidata ai

DBMS relazionali

OO: scalabilit e riusabilit RDBMS: affidabilit, efficienza, efficacia Esistono differenze significative tra queste due tecnologie: differenze tecnologiche differenze culturali Si parla di conflitto di impedenza

DAO, ORM e Hibernate

Conflitto di impedenza (1/4) Definito anche come disaccoppiamento di impedenza (o impedance mismatch) tra base di dati e

linguaggio

linguaggi: operazioni su singole variabili o oggetti SQL: operazioni su relazioni (insiemi di ennuple) Differenze di accesso ai dati e correlazione: linguaggio: dipende dal paradigma e dai tipi disponibili; ad esempio scansione di liste o

navigazione tra oggetti SQL: join (ottimizzabile)

DAO, ORM e Hibernate

Conflitto di impedenza (2/4) Differenze sui tipi di dato primitivi: linguaggi: numeri, stringhe, booleani SQL: CHAR, VARCHAR, DATE, ... Differenze sui costruttori di tipo: linguaggio: dipende dal paradigma SQL: relazioni e ennuple OID (trasparenti al programmatore) vs. chiavi primarie (visibili e manipolabili) Riferimenti vs. chiavi esterne Ereditariet (senza controparte nel mondo relazionale)

DAO, ORM e Hibernate

Conflitto di impedenza (3/4) In generale, i dati risiedono nel database (DB) mentre

la logica applicativa viene implementata da oggetti

Dal modello concettuale si pu derivare (una prima versione di) classi che implementano la logica applicativa (diciamo che queste classi implementano il modello di dominio, o pi semplicemente il modello) classi facade che offrono le operazioni (metodi) dellapplicazione schema relazionale per memorizzare i dati
questa attivit pu essere fatta anche successivamente in alcuni casi (sistemi legacy) il database potrebbe esistere gi e potrebbe non essere modificabile
quindi tutte le attivit di progetto sono condizionate da questo vincolo
DAO, ORM e Hibernate 5

Conflitto di impedenza (4/4) I dati sono memorizzati in maniera persistente nel DB A seconda del punto di vista (sviluppatore OO vs. DB Administrator - DBA) Gli oggetti in memoria possono essere visti come una copia di una porzione del database Il database pu essere visto come un supporto su cui memorizzare in maniera persistente i dati del modello Il conflitto di impedenza investe anche aspetti "culturali"

DAO, ORM e Hibernate

Metodologie per la gestione della persistenza In generale possiamo pensare che le operazioni (metodi) degli oggetti facade caricano tuple dalla base di dati e le usano per creare gli oggetti del modello effettuano le operazioni della logica applicativa (es. evadi ordine) salvano in maniera persistente gli oggetti del modello nella base di dati L'interazione con il DB una operazione critica: esistono diverse metodologie (di complessit crescente) per realizzare questa interazione forza bruta pattern DAO framework ORM (e in particolare per noi Hibernate)
DAO, ORM e Hibernate 7

Forza bruta la tecnica pi semplice per gestire la persistenza


forte accoppiamento con la sorgente dati

Consiste nello scrivere dentro le classi del modello un insieme di metodi che implementano le operazioni CRUD Operazioni CRUD
Create: inserimento di una tupla (che rappresenta un oggetto) nel database (INSERT) Retrieve: ricerca di una tupla secondo un qualche criterio di ricerca (SELECT) Update: aggiornamento di una tupla nel database (UPDATE) Delete: eliminazione di una tupla nel database (DELETE)

Ci possono essere diverse operazioni di Retrieve


diversi criteri: per chiave vs. per attributo (es. ricerca cliente per codice, per nome, etc.) diversi risultati (un oggetto, una collezione di oggetti) a seconda del criterio
DAO, ORM e Hibernate 8

Forza bruta in sintesi (1/2) Per ogni classe MyC che rappresenta una entit del dominio, si definiscono: un metodo doRetrieveByKey(X key) che restituisce un oggetto istanza di MyC i cui dati sono letti dal database
tipicamente da una tabella che stata derivata dalla stessa classe del modello di dominio che ha dato origine a MyC

recupera i dati per chiave

un metodo saveOrUpdate() che salva i dati

dell'oggetto corrente nel database

il metodo esegue una istruzione SQL update o insert

a seconda che l'oggetto corrente esista gi o meno nel database


DAO, ORM e Hibernate

Forza bruta in sintesi (2/2) uno o pi metodi doRetrieveByCond() che

restituiscono una collezione di oggetti istanza della classe MyC che soddisfano una qualche condizione (basata sui parametri del metodo)
un metodo doDelete() che cancella dal database

i dati dell'oggetto corrente

DAO, ORM e Hibernate

10

Il pattern Data Access Object La soluzione Forza bruta non particolarmente

conveniente

L'accoppiamento tra la sorgente dati e le classi del modello molto forte Le classi del modello sono poco coese (responsabilit eterogenee) Molto difficile iniziare a sviluppare senza preoccuparsi di tanti (troppi !) dettagli e senza un ambiente operativo complesso (java + dbms) Una soluzione "naturale" quella di affidare le

responsabilit di interagire con il database ad opportune classi Questo l'approccio suggerito dal pattern
Data Access Object (DAO)

DAO, ORM e Hibernate

11

Il pattern DAO Un pattern un modo di fare le cose che si dimostrato efficace e che per questo si tende ad applicare di nuovo Il pattern DAO uno degli standard J2EE design patterns; rappresenta un possibile modo di separare:
logica di business (es: Servlet, JSP, ) logica di persistenza (es: r/w su DB, )

Infatti, i componenti della logica di business non

dovrebbero mai contenere codice che accede direttamente al database!


scarsa manutenibilit sovrapposizione di responsabilit

Solo gli oggetti previsti dal pattern DAO


hanno il permesso di vedere il DB espongono metodi di accesso per tutti gli altri componenti
DAO, ORM e Hibernate 12

DAO: Caratteristiche principali (1/2) I valori scambiati tra DB e il resto dellapplicazione

sono racchiusi in oggetti detti Data Transfer Object

(DTO): campi privati per contenere i dati da leggere/scrivere su db metodi getter e setter per accedere dallesterno a tali campi metodi di utilit (confronto, stampa, ) Le operazioni che coinvolgono tali oggetti sono

raggruppati in interfacce che definiscono i Data Access Object (DAO) disponibili:


metodi CRUD altri metodi
DAO, ORM e Hibernate

13

DAO: Caratteristiche principali (2/2) Le implementazioni di tali interfacce (spesso indicate come oggetti DAO, per brevit) permettono leffettivo

accesso al database

diverse implementazione possono permettere (e rendere uniforme) l'accesso a DB di diversi vendor anche se si fa uso di un solo database, tale separazione migliora comunque la divisione delle responsabilit tra le parti dellapplicazione diventa facile migrare lapplicazione su DB diversi

Gli oggetti DAO non sono istanziati direttamente dai componenti, ma: possono essere ottenuti attraverso metodi factory

DAO, ORM e Hibernate

14

Pattern DAO con classi Factory Una unica factory astratta fornisce specifiche per le factory concrete espone un metodo creazionale parametrico per ottenere factory concrete Una factory concreta per ogni tipo di DB supportato permette di ottenere oggetti DAO appropriati al corrispondente tipo di DB pu gestire aspetti quali ottenimento della connessione, autenticazione, ... Un oggetto DTO per ogni tipo di entit che si vuole rappresentare Una interfaccia DAO per ogni oggetto DTO Una implementazione dell'interfaccia DAO di un DTO per ciascun DB supportato
DAO, ORM e Hibernate 15

Pattern DAO con classi Factory

DAO, ORM e Hibernate

16

DAO: Struttura

DAO, ORM e Hibernate

17

DAO in pratica Per ogni classe Entit del modello di dominio creiamo (in un opportuno package) una interfaccia DAOEntit con (le segnature dei) metodi che realizzano le operazioni CRUD Queste interface sono implementate da classi (organizzate in opportuni package) questa scomposizione permette maggiore flessibilit

DAO, ORM e Hibernate

18

Caso di studio (UML)

Prodotto
CodiceProdotto Nome Descrizione Costo

RigaOrdine
Quantit NumeroLinea

Ordine * 1
CodiceOrdine Data stato

* 1 Cliente
CodiceCliente Nome Indirizzo

DAO, ORM e Hibernate

19

Esempio: ProdottoDAO
public interface ProdottoDAO { public List<Prodotto> doRetrieveAll() throws PersistenceException; public Prodotto doRetriveByKey(String codice) throws PersistenceException; public void saveOrUpdate(Prodotto prodotto) throws PersistenceException; public void delete(Prodotto prodotto) throws PersistenceException; // eventuali altri doRetriveBy... }

DAO, ORM e Hibernate

20

Esempio: ProdottoDAOImpl
public class ProdottoDAOImpl implements ProdottoDAO { public List<Prodotto> doRetrieveAll() throws PersistenceException { Connection connection = null; List<Prodotto> prodotti; try { } catch (SQLException sqle) { throw new PersistenceException(sqle); } finally { } return prodotti; } }
DAO, ORM e Hibernate 21

Interazione Facade-DAO: Esempio

ProdottoDAO

Facade

ProdottoDB2DAO

DB2

Prodotto

DAO, ORM e Hibernate

22

Mettiamo ordine al codice Abbiamo classi per il modello, classi per la persistenza, classi di utilit classi del modello nel package modello interfacce DAO nel package persistenza implementazioni (dbms dependant) dei DAO in package persistenza.db2 classi di utilit nel package util

DAO, ORM e Hibernate

23

Nota terminologica Le classi del modello implementano le entit del modello concettuale, ed bene che rispettino le seguenti convenzioni: tutte le propriet devono essere private per ogni propriet: metodi setter e getter pubblici costruttore no-arg visibile Una classe che rispetta queste convenzioni viene chiamata java bean Rispetto al nostro caso di studio, le nostre classi Cliente, Prodotto, Ordine, RigaOrdine sono bean

DAO, ORM e Hibernate

24

Caso di studio
package modello; import java.util.*; import persistenza.*; public class FacadeImpl implements Facade { private ClienteDAO clienteDao; . public Facade() { clienteDao = new ClienteDAOImpl(); } public void inserisciClienteNellaAnagrafica(Cliente cliente) throws ClienteException { try { clienteDao.saveOrUpdate(cliente); } catch (PersistenceException e) { throw new ClienteException("Exception in ClientiFacade while creating cliente."); } } public List<Cliente> anagraficaClienti(){ try { return clienteDao.doRetrieveClienteAll(); } catch (PersistenceException e) { throw new ClienteException("Exception in ClientiFacade while retrieving cliente.", e); } } public Cliente trovaClientePerCodice(String codiceCliente){ try { return clienteDao.doRetrieveClienteByCodice(codiceCliente); } catch (PersistenceException e) { throw new ClienteException("Exception in ClientiFacade while retrieving cliente"+ codiceCliente +, e); } } }

ORM e Hibernate

25

Soluzioni al conflitto di impedenza Analizziamo ora i principali problemi dovuti al conflitto di impedenza e ne presentiamo le soluzioni A scopo didattico lavoriamo su DAO, ma le

considerazioni che facciamo seguendo questa soluzione hanno validit generale

N.B. Al termine del trattamento generale delle problematiche relative al conflitto di impedenza, concluderemo la gestione della persistenza illustrando la metodologia Object Relational Mapping (ORM) e una sua diretta implementazione, ovvero il framework

Hibernate

DAO, ORM e Hibernate

26

Risolvere il conflitto di impedenza Nel modello OO, le relazioni tra oggetti sono realizzate con riferimenti, mentre nel modello relazionale sono realizzate con i valori Vediamo problemi e soluzioni relativamente a: Retrieve: dal DB agli oggetti

(ricostruzione degli oggetti a partire da dati persistenti)

Create: dagli oggetti al DB (memorizzazione persistente degli oggetti nel DB)

DAO, ORM e Hibernate

27

Ricostruzione degli oggetti dal DB Il problema principale nel ricostruire oggetti a partire

dalla base di dati consiste nel ricostruire i riferimenti

Forze in gioco chiavi esterne contro riferimenti join (operazione "non direzionale") contro navigazioni

DAO, ORM e Hibernate

28

Caso di studio

Prodotto
CodiceProdotto Nome Descrizione Costo

RigaOrdine
Quantit NumeroLinea

Ordine * 1
CodiceOrdine Data stato

* 1 Cliente
CodiceCliente Nome Indirizzo

DAO, ORM e Hibernate

29

Ricostruzione degli oggetti dal DB Consideriamo la ricostruzione di un oggetto Ordine, ad esempio per definire il metodo
Ordine doRetrieveOrdineByKey(String codice)

nella classe Ordine:


una collezione di riferimenti a oggetti RigaOrdine;
ogni riga ordine ha un riferimento ad un oggetto Prodotto

un riferimento ad un oggetto della classe Cliente

nel database:
tabella ORDINI (ha una foreign key (FK) con CLIENTI) tabella RIGHEORDINE (FK con ORDINI, FK con PRODOTTI) tabella CLIENTI

Per ricostruire un oggetto Ordine "completo" devo ricostruire la collezione di oggetti RigaOrdine e l'oggetto Cliente (e anche questi oggetti devono essere "completi"?!)
DAO, ORM e Hibernate 30

Ricostruzione degli oggetti dal DB (Per ora, a fini didattici, non preoccupiamoci del riferimento a Cliente: successivamente ci preoccupiamo anche di questo) Come ricostruiamo l'oggetto Ordine? eseguo un join tra le tabelle ORDINI e RIGHEORDINE itero sul ResultSet e costruisco i vari oggetti Ordine e RigaOrdine opportunamente collegati

DAO, ORM e Hibernate

31

Nota Eseguo un join tra le tabelle ORDINI e RIGHEORDINE Che join usiamo? possibile che nella tabella ORDINI ci siano tuple per le quali non ci sono righe nella tabella RIGHE_ORDINE? se la risposta SI, allora devo usare un outer join

DAO, ORM e Hibernate

32

Un inciso Potrebbe sembrare pi semplice evitare di effettuare

un join, usando due SELECT e gestendone i risultati nel codice Java:

cerco nella tabella ORDINI del database l'ordine con l'id richiesto e costruisco un oggetto Ordine cerco nella tabella RIGHEORDINE del database le tuple che hanno come chiave esterna l'id dell'oggetto Ordine del punto precedente e con esse costruisco una collezione di oggetti RigaOrdine aggiungo la collezione di righe ordine all'oggetto Ordine

Commenti:
(apparentemente) il codice per costruire l'oggetto Ordine pi semplice (ma se sapete usare le collezioni il problema non si pone pi di tanto) ma i DBMS sono ottimizzati per effettuare efficientemente join!
DAO, ORM e Hibernate 33

Ricostruzione degli oggetti dal DB

Ma che cosa un "oggetto completo"?


con un modello di dominio complesso questa strategia pu portarci a caricare una rete molto vasta di oggetti esempio:
ClienteOrdineRigaOrdineProdottoFornitore

Fino a quando devo costruire oggetti "inseguendo i riferimenti ?

DAO, ORM e Hibernate

34

Ricostruzione degli oggetti dal DB Possiamo dare una risposta a queste domande analizzando i casi d'uso e il modello del dominio In particolare l'inseguimento dei riferimenti tra oggetti guidato dalle operazioni offerte dal sistema Nel progettare le classi, i riferimenti vanno messi

considerando la direzione in cui le corrispondenti associazioni sono navigate dalle operazioni del sistema
questo aspetto non ha rilevanza nella progettazione del database, perch i riferimenti sono implementati tramite valori e l'operatore di join non direzionale

DAO, ORM e Hibernate

35

Ricostruzione degli oggetti dal DB E quando non ha senso costruire un oggetto completo, come mi comporto?
i metodi che richiedono l'inseguimento di un riferimento, se invocati devono restituire l'oggetto corretto!

In questo caso ricorriamo ad una tecnica, detta Caricamento Pigro, implementata tramite l'applicazione del Pattern Proxy

DAO, ORM e Hibernate

36

Lazy Load (caricamento pigro) Consideriamo la classe Cliente: l'associazione con l'Ordine bidirezionale Tuttavia non ragionevole pensare che per caricare i dati di un cliente si debba ricostruire l'intera rete di oggetti (fino a Prodotto!?) Possiamo pensare che gli ordini associati al cliente possano essere caricati solo quando richiesti: quando invochiamo il metodo getOrdini() su un oggetto Cliente Questa strategia si chiama Lazy Load (caricamento pigro)

DAO, ORM e Hibernate

37

Lazy Load (caricamento pigro) In pratica quello che vogliamo fare caricare i dati

solo quando questi sono effettivamente richiesti

Vediamo come dovrebbe agire il metodo getOrdini() della classe Cliente seguendo questa strategia
quando invocato per la prima volta, il metodo getOrdini() esegue la query per costruire gli oggetti Ordine associati al cliente, aggiunge i riferimenti a questi oggetti nella collezione dell'oggetto Cliente, e restituisce la collezione

importante osservare che se il metodo non viene mai

invocato, il costo di caricare i dati relativi agli ordini non viene mai pagato

Se decidiamo di implementare questa strategia nella classe Cliente mettiamo codice di gestione della persistenza in una classe del dominio Per implementare bene la strategia Lazy Load senza
se in futuro vogliamo cambiare strategia?

ridurre la coesione nella classe del modello utile fare riferimento al pattern Proxy
DAO, ORM e Hibernate 38

Lazy Load e classi proxy Le classi xxxDAOImpl non restituiscono un bean completo ma un proxy Il proxy ha il compito di gestire il caricamento degli

oggetti collegati Il proxy deve contenere tutte le informazioni necessarie per effettuare il caricamento lazy Gli oggetti collegati vengono caricati solo su richiesta Il proxy simula il comportamento del bean

DAO, ORM e Hibernate

39

Lazy Load: Dettagli Quando le classi xxxDAOImpl ricevono una richiesta viene eseguita una query sul DB, istanziato e restituito

un oggetto del tipo richiesto xxxProxy

Loggetto istanziato non di tipo xxxBean, ma La classe xxxProxy estende la corrispondente xxxBean e riscrive i metodi che devono implementare

le operazioni onerose

Vediamo un esempio

DAO, ORM e Hibernate

40

Lazy Load: Implementazione proxy


public class Cliente { private int codiceCliente; private List<Ordine> ordini; public List<Ordine> getOrdini() { return this.ordini; } ... }

public class ClienteProxy extends Cliente { public List<Ordine> getOrdini() { List<Ordine> listaOrdini = null; try { OrdineDAO daoOrdine = new OrdineDAOImpl(); listaOrdini = daoOrdine.doRetrieveByCliente(this.getCodice()); this.setOrdini(listaOrdini); } catch (PersistenceException e) { throw new UnChechedPersistenceException(e.getMessage()); } return listaOrdini; } }

DAO, ORM e Hibernate

41

Lazy Load: Implementazione con proxy (e caching)


public class Cliente { private int codiceCliente; private List<Ordine> ordini; public List<Ordine> getOrdini() { return this.ordini; } ... }

public class ClienteProxy extends Cliente { private boolean caricato = false; public List<Ordine> getOrdini() { try { if (!this.caricato) { OrdineDAO dao = new OrdineDAOImpl(); this.setOrdini(dao.doRetrieveByCliente(this.getCodice())); this.caricato = true; } } catch (PersistenceException e) { throw new UnChechedPersistenceException(e.getMessage()); } return super.getOrdini(); } } DAO, ORM e Hibernate 42

Lazy Load: Osservazioni Quando uso il "caricamento pigro" ? Dipende dai casi duso definiti in fase di progettazione Ordine e RigaOrdine
Esistono casi duso che prevedono luso dellintestazione dellordine ma non del dettaglio delle righe?

RigaOrdine e Prodotto
Esistono casi duso che prevedono luso di una o pi riga senza il dettaglio del prodotto?

etc.

DAO, ORM e Hibernate

43

Lazy Load: Organizzazione del codice Organizzazione del codice: I Proxy appartengono al package della persistenza (in particolare, al package con le implementazioni dei DAO)

DAO, ORM e Hibernate

44

Ricostruzione degli oggetti dal DB


Concludiamo ora la scrittura del codice per la classe OrdineDAO In particolare supponiamo di voler effettuare un caricamento

pigro del cliente associato all'ordine

public class OrdineProxy extends Ordine public class OrdineProxy extends Ordine { { private Cliente cliente; private Cliente cliente; public Cliente getCliente() throws DAOException { { public Cliente getCliente() throws DAOException if (cliente==null) { if (cliente==null) { String String =query = "select * from clienti " + query "select * from clienti " + "where clienti.codice = ?"; "where clienti.codice = ?"; }} return cliente; return cliente; } }

C' un problema: non abbiamo il codice cliente! Coerentemente

con l'approccio OO nella classe abbiamo un riferimento ad un oggetto Cliente Questo dato presente nella tabella ORDINI (chiave esterna), e quando abbiamo caricato l'ordine questo valore non stato salvato in nessuna variabile!!
DAO, ORM e Hibernate

45

Ricostruzione degli oggetti dal DB


Siamo costretti ad eseguire un join (ci sarebbe bastata una selezione)
public class OrdineProxy extends Ordine { private Cliente cliente; public class OrdineProxy extends Ordine { private Cliente cliente; public Cliente getCliente() { if Cliente getCliente() { public(cliente==null) { if String query = "select * from ordini join clienti on " + (cliente==null) { "ordini.idcliente = clienti.id where ordini.id = on String query = "select * from ordini join clienti ?"; // codice per l'esecuzione della query ordini.id = clienti.idordine" // con i dati restituiti viene costruito l'obj Cliente where ordini.id = ?"; // codice per l'esecuzione della query } // con i dati ritornati viene costruito l'oggetto Cliente return cliente; } } return cliente; } }

Il problema sussiste anche nella classe Cliente? Perch?

DAO, ORM e Hibernate

46

Ricostruzione degli oggetti dal DB Il problema sorge quando navighiamo una relationship

uno-a-molti o uno-a-uno seguendo il vincolo di integrit referenziale (la chiave esterna)

Per risolvere questo problema dobbiamo effettuare un join (al posto di una semplice selezione)

DAO, ORM e Hibernate

47

Ricostruzione degli oggetti dal DB Possiamo sintetizzare il processo di ricostruzione degli oggetti dal DB come segue: in base ai casi d'uso (e a una stima della frequenza delle corrispondenti operazioni) decidiamo quando conviene seguire una strategia Lazy Load per le classi con associazioni per le quali stata scelta la strategia Lazy Load applichiamo il pattern

Proxy

per le classi con associazioni per le quali non conviene applicare la strategia Lazy Load ricostruiamo la rete (parziale) di oggetti con i risultati di un join In fase di progettazione conviene quindi arricchire il class diagram con annotazioni sulle associazioni che indicano la strategia di caricamento ("fetch") dei dati: pigro (Lazy Load) vs. immediato (Eager)
DAO, ORM e Hibernate 48

Risolvere il conflitto di impedenza Nel modello OO, le relazioni tra oggetti sono realizzate con riferimenti, mentre nel modello relazionale sono realizzate con i valori Vediamo problemi e soluzioni relativamente a: Retrieve: dal DB agli oggetti (ricostruzione degli oggetti a partire da dati persistenti) Create: dagli oggetti al DB (memorizzazione persistente degli oggetti nel DB)

DAO, ORM e Hibernate

49

Create: Rendere persistenti gli oggetti L'operazione di CREATE ha lo scopo di rendere

persistenti gli oggetti della applicazione

Problemi persistenza dei riferimenti propagazione degli aggiornamenti

DAO, ORM e Hibernate

50

Persistenza dei riferimenti Come rendiamo persistenti i riferimenti? se il dominio offre identificatori naturali per tutte le entit il problema limitato (ma potremmo fare considerazioni su prestazioni e portabilit) se non tutte le classi hanno identificatori naturali ("semplici") utile introdurre chiavi surrogate In generale sconveniente usare un approccio ibrido (chiavi surrogate e identificatori naturali) Di conseguenza, quando possibile*, consigliato usare sempre chiavi surrogate tutte le tabelle corrispondenti a entit del dominio hanno una chiave id di tipo intero tutte le classi hanno una variabile di istanza id di

tipo intero

* Potrebbe non essere possibile nel caso di applicazioni costruite su DB gi esistenti DAO, ORM e Hibernate 51

Persistenza dei riferimenti Chiavi surrogate la chiave pu essere vista come una

rappresentazione persistente dell'OID

in parte cerchiamo di avvicinare i due mondi (relazionale ed oggetti) senza stravolgerli, armonizzando le differenze Questa soluzione offre vantaggi in termini di prestazioni (usando come chiavi degli interi) portabilit ed evoluzione (gli identificatori naturali possono cambiare nel tempo*)

*Esempio: allo studio una revisione del codice fiscale DAO, ORM e Hibernate 52

Persistenza dei riferimenti Che cosa deve fare una operazione di Create se l'oggetto non esiste nel DB l'operazione di Create deve eseguire una insert nel DB dei dati gestiti da

un oggetto del modello Se nel DB usiamo chiavi surrogate, come le gestiamo? opportuno avere una rappresentazione della chiave anche nel modello ad oggetti quindi ad ogni entit associamo esplicitamente una variabile di istanza id (di tipo int)

DAO, ORM e Hibernate

53

Persistenza dei riferimenti Chi ci d il valore di una chiave surrogata? la chiave viene creata al momento dell'inserimento

di un oggetto nel DB

Diverse soluzioni: soluzione naive: chiedo al DB il valore massimo, lo incremento ed eseguo l'inserimento usando tale valore uso campi auto-incrementanti: occorre aggiornare il valore della variabile id nell'oggetto: dopo l'inserimento, dobbiamo interrogare il DB per riottenere tale valore uso una sequenza SQL che interrogo per farmi dare

un nuovo id prima di ogni inserimento

efficiente (il DBMS offre anche funzionalit di caching) semplice da implementare qualche limite di portabilit (nonostante le sequenze siano standard SQL, i vari DBMS differiscono un po' nell'uso di questo costrutto)
DAO, ORM e Hibernate 54

Persistenza dei riferimenti: Esempio


public class ProdottoDAODB2 { private void insert(Prodotto prodotto, Connection connection) throws PersistenceException { PreparedStatement statement = null; IdBroker idBroker = new IdBrokerDB2(); try { prodotto.setId(idBroker.newId()); String insert = "insert into prodotti(codice_prodotto, nome, descrizione, disponibilita, prezzo, id) values (?,?,?,?,?,?)"; statement = connection.prepareStatement(insert); statement.setInt(1, prodotto.getCodiceProdotto()); statement.setString(2, prodotto.getNome()); statement.setString(3, prodotto.getDescrizione()); statement.setInt(4, prodotto.getDisponibilita()); statement.setInt(5, prodotto.getPrezzo()); statement.setInt(6, prodotto.getId()); statement.executeUpdate(); } catch (SQLException e) { throw new PersistenceException(e.getMessage()); } finally { try { if (statement != null) statement.close(); if (connection!= null) connection.close(); } catch (SQLException e) { throw new PersistenceException(e.getMessage()); } } } }

DAO, ORM e Hibernate

55

Persistenza dei riferimenti Affidiamo la responsabilit della gestione degli id ad una classe opportuna, che chiamiamo IdBroker Al solito, per favorire la portabilit possiamo definire una interfaccia IdBroker, le cui implementazioni sono

DBMS-dependant

DAO, ORM e Hibernate

56

IdBroker: Esempio
package persistenza.db2; import java.sql.*; import persistenza.*; public class IdBrokerDB2 implements IdBroker { public int newId() throws PersistenceException { int newId = -1; DataSource ds = new DataSource(); ResultSet result = null; PreparedStatement statement = null; Connection connection = null; try { connection = ds.getConnection(); String sqlQuery = "SELECT(NEXTVAL FOR sequenza_id) INTO newId"; statement = connection.prepareStatement(sqlQuery); result = statement.executeQuery(); if (result.next()) newId = result.getInt("newId"); else throw new PersistenceException("invalid id"); } catch(SQLException e) { throw new PersistenceException(e.getMessage()); } finally { try { if (statement != null) statement.close(); if (connection!= null) connection.close(); } catch (SQLException e) { throw new PersistenceException(e.getMessage()); } } return newId; } }

DAO, ORM e Hibernate

57

Sequenze SQL Statement SQL (DB2) per la creazione della sequenza:


CREATE SEQUENCE sequenza_id AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 0 MAXVALUE 9999999 NO CYCLE;

DAO, ORM e Hibernate

58

Propagazione degli aggiornamenti Quando effettuiamo una operazione di create (ma analogamente update o delete) propaghiamo gli aggiornamenti a tutta la rete di oggetti ? Ad esempio, consideriamo la classe Ordine : quando salviamo i dati di un ordine, salviamo anche i dati di tutti gli oggetti RigaOrdine e Cliente ad esso associato? Anche in questo caso dipende dai casi d'uso

DAO, ORM e Hibernate

59

Progettazione della persistenza Facendo riferimento al class diagram, su tutte le associazioni indichiamo: la cardinalit il verso secondo cui l'applicazione naviga la associazione la strategia di fetch: Lazy Load vs. Eager (associata al verso) la strategia di propagazione degli aggiornamenti: Cascade vs. No cascade (associata al verso)

DAO, ORM e Hibernate

60

Caso di studio

Prodotto
CodiceProdotto Nome Descrizione Costo

RigaOrdine
Quantit NumeroLinea

Ordine * 1
CodiceOrdine Data stato

fetch: lazy-load cascade: none

fetch: eager cascade: persist, delete fetch: eager cascade: none

*
fetch: lazy-load cascade: none

1 Cliente
CodiceCliente Nome Indirizzo

DAO, ORM e Hibernate

61

Object Relational Mapping tempo di riprendere e concludere il trattamento delle metodologie alternative a forza burta e DAO per la realizzazione del layer di persistenza, ovvero di trattare la tecnica Object Relational Mapping (ORM, O/RM oppure O/R mapping) Aumenta il livello di astrazione (semplicit di utilizzo per lo sviluppatore e diminuzione della quantit di codice che occorre scrivere) Aumenta la complessit (diminuzione delle performance) ORM la persistenza automatica (e trasparente) di

oggetti di applicazioni Java in tabelle di un DB relazionale, basata su metadati che descrivono il mapping tra oggetti e DB
DAO, ORM e Hibernate

62

ORM in sintesi (1/3) Lavora trasformando (in modo reversibile) i dati da una rappresentazione allaltra; ci implica alcune penalizzazioni in termini di performance tuttavia se ORM implementato come middleware esistono diverse opportunit di ottimizzazione non possibili per un livello di persistenza hand-coded ( la JDBC) La fornitura e la gestione dei metadati che governano la trasformazione aggiungono overead al tempo di sviluppo tuttavia tale costo e inferiore o equivalente al costo che comporta il mantenimento di una soluzione hand-coded

DAO, ORM e Hibernate

63

ORM in sintesi (2/3) Una soluzione ORM consiste di quattro componenti: Una API per eseguire le operazioni CRUD sugli oggetti delle classi del modello Un linguaggio o una API per specificare query che fanno riferimento alle classi e alle propriet delle classi Uno strumento per la specifica del mapping mediante metadata Una tecnica per limplementazione di ORM per

interagire con oggetti transazionali al fine di eseguire funzioni di ottimizzazione quali, ad esempio, lazy load fetching e dirty checking

DAO, ORM e Hibernate

64

ORM in sintesi (3/3) Usiamo il termine full ORM per includere ogni livello

di persistenza in cui SQL automaticamente generato da una descrizione basata su metadati

Lapplicazione interagisce con le API ORM e le classi del modello di dominio ed astrae dal livello SQL/JDBC sottostante Supporta object modeling sofisticati, quali composizione, ereditariet, polimorfismo e persistenza attraverso raggiungibilit Un certo numero di tool commerciali e open source

Java ORM hanno raggiunto questo livello di qualit Hibernate un tool full ORM

lAPI di Hibernate nativa e progetta dagli sviluppatori Hibernate


DAO, ORM e Hibernate 65

Perch ORM e Hibernate?


Tra i benefici di ORM e Hibernate Produttivit: il codice dedicato alla gestione della persistenza di una applicazione Java il pi tedioso; Hibernate elimina la maggior parte di questo duro lavoro permettendo di concentrare lattenzione su problemi di businnes logic Manutenibilit: poche linee di codice rendono il sistema pi comprensibile perch esso enfatizza aspetti di businnes logic rispetto a dettagli implementativi; pi importante, un sistema con meno linee di codice pi facile per il refactor Performance: una comune affermazione che la persistenza

hand-coded sempre pi performante rispetto a quella automatizzata; occorre per considerare anche aspetti di tempo e budget per la realizzazione della stessa

Indipendenza dal vendor: ORM astrae una applicazione dal DB sottostante e dal dialetto SQL; se un tool ORM supporta un certo numero di DB (e la maggior parte lo fa) ci conferisce portabilit alla applicazioni
DAO, ORM e Hibernate 66

Perch Hibernate e non DAO? Per lo sviluppatore la metodologia DAO pu risultare onerosa (e noiosa), in termini di scrittura di codice, e dipendente dal data source Inoltre persistenza e transazionalit sono gestite a livello di programmazione La metodologia Hibernate rappresenta una soluzione

standard per riuscire a implementare persistenza e transazionalit velocemente e senza preoccuparsi dei
dettagli del data source sottostante; esempio:

Session session = HibernateUtil.getSessionFactory().openSession(); User user = new User("pippo"); String userId = (String) session.save(user);

DAO, ORM e Hibernate

67

Il framework Hibernate Rappresenta lo standard risolutivo per il mapping objectt/relational automatico tra oggetti Java e relazioni del DB Tale mapping si pu realizzare per mezzo di descrittori XML specifici di Hibernate (soluzione di riferimento per noi) o, in alterantiva, di annotazioni Java conformi allo standard JPA Il framework Hibernate si appoggia e sfrutta le tecnologie SQL e JDBC ecco perch stato cois importante apprendere prima JDBC!

DAO, ORM e Hibernate

68

Un po di storia Il progetto relativo a Hibernate stato promosso nel 2001 da Gavin King come alternativa alluso di entity

bean la EJB2 scopo principale quello di offrire migliori capacit nella gestione della persistenza semplificando tutte le complessit Allinizio del 2003, il gruppo di sviluppo Hibernate ha
avviato la realizzazione della release Hibernate 2 che offre miglioramenti significativi rispetto alla prima versione Dal 2010 la versione di riferimento Hibernate 3.x Hibernate 3 (dalla versione 3.5.0 in su) rappresenta

limplementazione certificata (standard) delle specifiche API Java Persistence, versione 2.0
DAO, ORM e Hibernate

69

Hibernate Core Anche noto come Hibernate o Hibernate 3.x Software open source e free, distribuito sotto licenza GNU Libreria ORM per Java: servizio di base per la gestione della persistenza in applicazioni Java fornisce un framework per mappare un modello di

dominio object-oriented su di una base di dati relazionale database caratteristica primaria: mapping da classi Java a tabelle di una base di dati (e mapping da tipi di dati Java a tipi di dati SQL) inoltre, fornisce labilit di interrogare la basi di dati

DAO, ORM e Hibernate

70

Hibernate Core Il codice della applicazione usa le API di Hibernate per

gestire la persistenza I mapping tra classi Java e tabelle relazionali sono specificati in appositi file XML
richieste di esecuzione di chiamate SQL gestione manuale dei risultati di chiamate SQL e loro eventuale conversione in oggetti

In linea di principio, lo sviluppatore esonerato da:

L'applicazione rimane portabile in tutti i sistemi di gestione supportati, con pochissimo overhead Pu essere usato in maniera indipendente dal tipo di applicazione, di piattaforma e di ambiente runtime, con tutti i JDK

DAO, ORM e Hibernate

71

Architettura Hibernate Larchitettura completa di Hibernate astrae dalle

API JDBC/JTA sottostanti livello di applicazione pu essere trasparente a questi dettagli

Architettura di alto livello DAO, ORM e Hibernate

Architettura completa 72

Principali oggetti dellAPI Hibernate*

SessionFactory Session Persistent Objects Transient and Detached Object Transaction


N.B. Per ora ci basta pensare a una transazione come a una approfondito la gestione delle transazioni a breve

sequenza di operazioni che pu concludersi con un successo o un insuccesso (unit atomica di elaborazione) ; affronteremo in modo

Connection Provider Transaction Factory

* http://docs.jboss.org/hibernate/core/3.5/api/
DAO, ORM e Hibernate 73

SessionFactory Classe org.hibernate.SessionFactory Factory per oggetti Session e cliente di

ConnectionProvider Una factory per ogni DB Pu mantenere una cache opzionale di secondo livello
con dati riusabili in diverse transazioni

DAO, ORM e Hibernate

74

Session Classe org.hibernate.Session Rappresenta un contesto di persistenza (wrapper a JDBC Connection) e la sua vita delimitata dallinizio e

dalla fine di una transazione logica Gestisce le operazioni del ciclo di vita degli oggetti persistenti Fa da factory per oggetti Transaction Mantiene una cache (non modificabile) di primo livello
derivante dal mapping con il DB che viene utilizzata durante la navigazione degli oggetti

DAO, ORM e Hibernate

75

Oggetti persistent Oggetti single-threaded che contengono lo stato persistente e la logica di business Possono essere normali JavaBean devono essere associati esattamente a un

oggetto Session

Modifiche fatte sugli oggetti persistenti sono automaticamente propagate sulle tabelle DB (al loro commitment ) Appena si chiude la sessione, gli stessi oggetti diventano detached e possono essere usati liberamente

DAO, ORM e Hibernate

76

Oggetti transient e detached Istanze di classi persistenti che non sono correntemente associati a nessuna Session Possono essere stati istanziati dalla applicazione e non essere ancora diventati persistenti, oppure derivare da una Session chiusa Modifiche fatte su questi oggetti non si riflettono sul DB Operazioni di persist o merge per farli tornare persistenti (con modifiche correlate alle tabelle del DB)

DAO, ORM e Hibernate

77

Transaction Classe org.hibernate.Transaction Oggetto single-threaded usato dalla applicazione per specificare unit atomiche di lavoro Permette di astrarre dai dettagli dei sottostanti

meccanismi transazionali (JDBC, JTA, )

Un oggetto Session pu essere coinvolto in diverse Transaction La demarcazione delle transazioni non opzionale: indipendentemente dallutilizzare le API JDBC sottostanti o Transaction, deve comunque essere

sempre specificata in modo esplicito

DAO, ORM e Hibernate

78

ConnectionProvider Classe org.hibernate.connection.ConnectionProvider Factory per un pool di connessioni JDBC. Astrae la applicazione dal Data Source o dal DriverManager sottostante Non esposta alla applicazione ma pu essere estesa e/o implementata dallo sviluppatore

DAO, ORM e Hibernate

79

TransactionFactory Classe org.hibernate.TransactionFactory Factory per oggetti Transaction Non esposta alla applicazione ma pu essere estesa e/o implementata dallo sviluppatore

DAO, ORM e Hibernate

80

Stato degli oggetti persistenti Una istanza di una classe persistente pu assumere in ogni istante uno fra tre stati possibili, definiti allinterno di un contesto di persistenza Transient non appartenente a un contesto di persistenza Persistent appartenente a un contesto di persistenza Detached usualmente appartenente a un contesto di
persistenza ma non in questo momento

DAO, ORM e Hibernate

81

Stato transient Istanza mai associata a una sessione (contesto di persistenza) Non ha identit di persistenza (valore associato alla primary key) Non ha righe corrispondenti nel DB

DAO, ORM e Hibernate

82

Stato persistent Istanza correntemente associata con una sessione (contesto di persistenza) Ha una identit di persistenza (valore associato alla primary key) e usualmente una riga corrispondente in

una tabella DB

Ad es. quando un oggetto viene creato in una sessione o un oggetto transient viene fatto diventare persistente

DAO, ORM e Hibernate

83

Stato detached Istanza che stata associata a un contesto di

persistenza in passato, ma quella sessione stata chiusa oppure listanza stata trasferita tramite serializzazione a un altro processo Ha una identit di persistenza (valore associato alla primary key) e possibilmente una riga corrispondente in una tabella DB
Ad es. quando un oggetto deve essere inviato ad un altro processo, che lo utilizzer senza necessit di avere un contesto di persistenza associato

DAO, ORM e Hibernate

84

Il ciclo di vita degli oggetti persistenti


Una applicazione orientata agli oggetti che fa uso di un meccanismo di persistenza deve interagire con il servizio di persistenza ogni volta che ha bisogno di propagare lo stato di un

oggetto in memoria sulla base di dati Lo stato di un oggetto che appartiene ad una classe persistente

cambia a seconda dell'operazione del servizio di persistenza che viene invocata

DAO, ORM e Hibernate

85

Transizioni di stato Oggetti Transient possono diventare persistenti tramite chiamate ai metodi save(), persist() o saveOrUpdate(), ovviamente delloggetto Session associato Ogni istanza di oggetto persistente restituita da get() o load() Persistent Oggetti Persistent possono diventare transienti tramite linvocazione di delete()

Oggetti Persistent possono diventare staccati mediante linvocazione di evict(), clear()e close()
Oggetti Detached possono diventare persistenti tramite chiamate ai metodi update(), saveOrUpdate() e merge()(con istanziazione di un nuovo oggetto persistente)
DAO, ORM e Hibernate 86

Hibernate Query Language Hibernate fornisce un linguaggio di interrogazione ispirato a SQL chiamato Hibernate Query Language

(HQL)

Permette la scrittura di query SQL-like definite sui data object Hibernate; esempi:
Update a stock name to DIALOG1 where stock code is 7277 Query query = session.createQuery("update Stock set stockName = :stockName" + " where stockCode = :stockCode"); query.setParameter("stockName", "DIALOG1"); query.setParameter("stockCode", "7277"); int result = query.executeUpdate(); Delete a stock where stock code is 7277 Query query = session.createQuery("delete Stock where stockCode = '7277'"); int result = query.executeUpdate();

Sono inoltre supportate Criteria Queries come alternativa Object Oriented a HQL
DAO, ORM e Hibernate 87

Hibernate: Strategie di fetching Una strategia di fetching determina come e quando i dati vengono effettivamente caricati dal DB per una applicazione che usa gli oggetti di persistenza associati
La strategia adottata ha ovviamente impatto sulle performance ottenibili ; di solito dichiarata in un file di mapping

Modalit di fetching:
FetchMode.DEFAULT (configurazione del mapping file) FetchMode.JOIN (Hibernate recupera i dati associati, anche collezioni, utilizzando un join allinterno della stessa select) FetchMode.SELECT (Hibernate effettua una seconda select separata per recuperare le entity o collection associate)
N.B. Il caricamento pigro (lazy fetching) il default per SELECT: la seconda select viene eseguita solo quando lapplicazione accede veramente ai dati associati

DAO, ORM e Hibernate

88

Hibernate: Strategie di caching Utilizzato per motivi di performance Idea di base: Rendere laccesso al DB necessario solo quando si devono reperire dati non sono gi disponibili sulla cache La applicazione pu avere bisogno di svuotare (invalidare) la cache se il DB viene aggiornato o se non possibile sapere se la cache mantiene ancora copie aggiornate First-level cache Associata con loggetto Session Second-level cache Associata con loggetto SessionFactory
DAO, ORM e Hibernate 89

Hibernate: Strategie di caching Cache di primo livello : usata da Hibernate allinterno dei confini di una singola transazione principalmente al fine di ridurre il numero di query SQL generate

allinterno di una transazione

Ad es. se un oggetto modificato diverse volte allinterno della medesima transazione, Hibernate genera un unico statement SQL UPDATE alla fine della transazione, con tutte le modifiche Cache di secondo livello : mantiene dati al livello di

Session Factory, utilizzabili da diverse transazioni (across transaction boundaries) Oggetti persistenti disponibili per lintera applicazione, non solo per lutente che sta eseguendo le query e per il SessionBean associato
DAO, ORM e Hibernate 90

Hibernate in azione Cinque ingredienti principali di una applicazione che fa uso di Hibernate per la gestione della persistenza: le classi di dominio realizzate in Java una base di dati (per noi realizzata in DB2) un file XML che definisce il mapping di ogni classe persistente uno o pi file di configurazione di Hibernate le interfacce Hibernate per l'accesso alla base di dati: Session, Transaction e Query + package org.hibernate

DAO, ORM e Hibernate

91

Classi di dominio e DB Sappiamo gi come realizzarli dalle slide precedenti Esempio: classe User e relativa tabella UTENTE:
public class User {
private String nome; private String cognome; private String username; private String password; private String email; private Indirizzo indirizzo; public User(){} public User(String user){ username=user; } }

CREATE TABLE UTENTE( username VARCHAR(10) PRIMARY KEY, nome VARCHAR(15), cognome VARCHAR(15), cod_fis VARCHAR(16) UNIQUE, password VARCHAR(8), email VARCHAR(20), via VARCHAR(20), civico INT, cap VARCHAR(5), citta VARCHAR(15));

DAO, ORM e Hibernate

92

File di mapping per le classi persistenti File XML che definisce come si mappano le propriet delle classi Java persistenti sulle tabelle del DB Deve soddisfare la grammatica specificata all'interno

di un apposito DTD chiamato

hibernate-mapping-3.0.dtd N.B. Per verificare la correttezza sintattica del file XML, Hibernate cercher il DTD all'interno del classpath e lo trover nella libreria .jar di Hibernate (ammesso che il classpath la includa) qualora non dovesse trovare il DTD, Hibernate lo cercher all'indirizzo specificato nella dichiarazione del DOCTYPE
DAO, ORM e Hibernate 93

File di mapping per le classi persistenti: Esempio


File User.hbm.xml <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="User" table="UTENTE"> <id name="username" column="username"></id> <property name="nome" column=nome"></property> <property name="cognome" column=cognome"></property> <property name="email"></property> <property name="password"></property> </class> </hibernate-mapping>

DAO, ORM e Hibernate

94

File di mapping per le classi persistenti: Commenti L'elemento class dichiara il nome della classe

persistente e la tabella a cui essa corrisponde


dice a Hibernate come rendere persistente e caricare gli oggetti della classe User sfruttando la tabella UTENTE, ovvero ogni istanza rappresentata

da una tupla della tabella


L'elemento id dichiara: il nome della propriet della classe che gioca il

ruolo di identificatore

Importante: una classe persistente sempre caratterizzata da una propriet che ne identifica le istanze; una volta creato un oggetto della classe, tale propriet non potr essere modificata dalla applicazione
il corrispondente metodo set pu essere definito privato
DAO, ORM e Hibernate 95

File di mapping per le classi persistenti: Commenti

tuple mappate su oggetti (primary key) L'elemento property dichiara il nome delle propriet persistenti della classe e a quali attributi della tabella corrispondono; di default, nessuna propriet
persistente Importante: come per la propriet che identifica gli oggetti, il nome della propriet indica ad Hibernate

il nome dell'attributo della tabella che identifica le

quali metodi set e get usare

DAO, ORM e Hibernate

96

File di configurazione per Hibernate Hibernate costituisce la parte dell'applicazione che gestisce la persistenza, ovvero che si connette al DB ha bisogno di avere le informazioni necessarie per effettuare la connessione, quali il DBMS, il driver JDBC, la base di dati, utente/password, etc. Un file XML fornisce tutte queste informazioni Tale file deve soddisfare la grammatica specificata nel DTD hibernate-configuration-3.0.dtd

DAO, ORM e Hibernate

97

File di configurazione per Hibernate: Esempio


File hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- Database connection settings --> <property name="hibernate.connection.driver_class"> COM.ibm.db2.jdbc.app.B2Driver</property> <property name="hibernate.connection.url"> jdbc:db2://localhost/tw_stud</property> <property name="connection.username">*****</property> <property name="connection.password">*****</property>

DAO, ORM e Hibernate

98

File di configurazione per Hibernate: Esempio


<!-- SQL dialect --> <property name="dialect"> org.hibernate.dialect.DB2Dialect</property> <!-- JDBC connection pool (use C3P0) --> <property name="c3p0.min_size">5</property> <property name="c3p0.max_size">20</property> <property name="c3p0.timeout">300</property> <property name="c3p0.max_statement">50</property> <!-- Show and print nice SQL on stdout --> <property name="show_sql">true</property> <property name="format_sql">true</property> <!-- List of XML mapping files --> <mapping resource="User.hbm.xml" /> </session-factory> </hibernate-configuration>
DAO, ORM e Hibernate 99

File di configurazione per Hibernate: Commenti L'elemento session-factory definisce le

impostazioni per l'accesso a un particolare DB


Le propriet il cui nome hanno la forma (hibernate).connection.* contengono le informazioni necessarie per impostare la connessione JDBC La propriet dialect specifica la variante di SQL che deve generare Hibernate

DAO, ORM e Hibernate

100

File di configurazione per Hibernate: Commenti Le proprieta c3p0.* indicano le impostazioni necessarie a configurare il software c3p0 per il pooling di connessioni min size: numero minimo di connessioni che devono essere pronte in ogni momento max size: numero massimo di connessioni aperte gestite dal pool timeout: tempo al termine del quale una connessione aperta non pi usata viene rimossa max statements: numero di prepared statements che sono mantenuti in cache Infine mapping include lelenco dei file di mapping

XML
DAO, ORM e Hibernate 101

Le interfacce Hibernate Tre sono le interfacce principali per l'accesso al DB, tutte appartenenti al package org.hibernate Session: ogni istanza rappresenta una sessione di

comunicazione tra applicazione e base di dati

comprende i metodi per salvare/caricare oggetti nella/dalla base di dati Transaction: ogni istanza rappresenta una

transazione

maggiore disaccoppiamento dell'applicazione: non

necessario usare l'API JDBC per impostare una transazione

DAO, ORM e Hibernate

102

Le interfacce Hibernate

che accede a pi DB all'interno di una unica unita di lavoro di sistema Query: interfaccia che permette di creare ed eseguire query

Gioca il ruolo di gestore di transazioni in un sistema

sia nel linguaggio di query di Hibernate (HQL) che in SQL che usino al loro interno delle variabili (:nomeVaraibile)

DAO, ORM e Hibernate

103

Interfacce Hibernate: Esempio d'uso


File Bid.java package bid; import java.util.*; import org.hibernate.*; import persistence.HibernateUtil; public class Bid { public static void main(String[] args) { //First unit of work Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); User user = new User("pippo"); String userId = (String) session.save(user); tx.commit(); session.close();
DAO, ORM e Hibernate 104

Interfacce Hibernate: Esempio d'uso


//Second unit of work session = HibernateUtil.getSessionFactory().openSession(); tx = session.beginTransaction(); user = (User) session.get(User.class,userId); user.setNome("Filippo"); tx.commit(); session.close();
//Third unit of work session = HibernateUtil.getSessionFactory().openSession(); tx = session.beginTransaction() List users = session.createSQLQuery("select * from UTENTE order by username").addEntity(User.class).list(); System.out.println(users.size()+" user(s) found: "); for (Iterator iter= users.iterator(); iter.hasNext(); ) { User userId = (User) iter.next(); System.out.println (userId.getNome()); } tx.commit(); session.close(); HibernateUtil.shutdown(); //Shutting down the application } } DAO, ORM e Hibernate

105

Interfacce Hibernate: Commenti L'utilizzo della interfaccia Transaction imposta l'autocommit a false necessit di chiamare il metodo commit Tutti i comandi SQL sono generati a runtime La prima unit di lavoro, quando eseguita, corrisponde ad effettuare sul DB un comando SQL simile a:
insert into UTENTE (USERNAME,NOME,COGNOME, COD_FIS,PASSWORD,EMAIL,VIA,CIVICO,CAP,CITTA) values (pippo, null, null, null, null, null, null, null, null, null);

DAO, ORM e Hibernate

106

Interfacce Hibernate: Commenti La seconda unit di lavoro mostra l'abilita di: caricare un oggetto dalla base di dati, a partire dalla classe di cui istanza e dal suo identificatore
il metodo get(Class,Serializable) restituisce una istanza della classe persistente data in input caratterizzata dall'identificatore in input, e null se la suddetta istanza non esiste

effettuare un dirty checking automatico: senza che sia richiesto esplicitamente di fare l'update dell'istanza, Hibernate si accorge delle modiche

apportate sulla propriet nome ed aggiorna automaticamente la base di dati

DAO, ORM e Hibernate

107

Interfacce Hibernate: Commenti La terza unita di lavoro mostra come possibile incapsulare una query di accesso al DB e ricavare dai risultati oggetti del dominio questo tipo di accesso deve essere limitato a quei

casi in cui necessario effettuare una ricerca sul DB non di tipo diretto, ad esempio, FindByCriteria

DAO, ORM e Hibernate

108

Inizializzazione di Hibernate: SessionFactory Per inizializzare Hibernate, si costruisce un oggetto SessionFactory a partire da un oggetto Configuration Un oggetto Configuration, sostanzialmente, rappresenta il file di configurazione di Hibernate
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

quando new Configuration() invocato, Hibernate cerca un file chiamato hibernate.properties e tutte le impostazioni definite sono associate all'oggetto di Configuration quando configure() invocato, Hibernate cerca il file hibernate.cfg.xml

DAO, ORM e Hibernate

109

Inizializzazione di Hibernate: SessionFactory Nella maggior parte delle applicazioni, SessionFactory deve essere istanziato una sola volta durante la fase di inizializzazione di Hibernate, e gioca il ruolo di gestore delle sessioni, nel senso che ogni istanza di Session deve essere creata a partire da lui buona prassi realizzare una classe HibernateUtil per l'inizializzazione di Hibernate e la gestione della singola istanza di SessionFactory

DAO, ORM e Hibernate

110

Gestore delle sessioni: HibernateUtil


File HibernateUtil.java package persistence; import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateUtil { private static SessionFactory sessionFactory = initHibernateUtil(); private static SessionFactory initHibernateUtil(){ try { return new Configuration().configure().buildSessionFactory(); } catch (HibernateException ex) { throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } public static void shutdown() { getSessionFactory().close(); //Close caches and connection pools } }
DAO, ORM e Hibernate 111

Mappare una classe Java significa... Stabilire una corrispondenza tra le sue istanze e le

tuple della tabella corrispondente Mappare il suo identificatore Mappare le sue propriet persistenti

propriet che sono valori propriet che sono istanze di una altra classe di dominio Java

DAO, ORM e Hibernate

112

Mappare gli identificatori delle classi di dominio Dal punto di vista sintattico, una propriet che identica una classe deve essere mappata attraverso l'elemento XML <id> (che deve essere definito) <id> pu avere un elemento figlio <generator> che deve avere un attributo class che specifica una classe Java che implementa l'interfaccia org.hibernate.id.IdentifierGenerator e che viene usata per generare identificatori unici ; Hibernate viene fornito con delle classi built-in per generare identificatori, tra le altre:
assigned: significa che l'applicazione assegna

l'identificatore all'istanza prima che sia chiamato il metodo save - questo e il comportamento di default se generator non
compare native: usa i generatori di identificatori forniti dal DBMS sottostante; mantiene il mapping portabile
DAO, ORM e Hibernate 113

Mappare propriet delle classi di dominio Abbiamo gi visto come mappare una propriet persistente di una classe quando la stessa

corrisponde a un valore con molteplicit massima pari a uno


mediante luso dell'elemento XML property

Quando invece una propriet una collezione

omogenea di valori gestiti da una altra tabella , allora


nel file di mapping si definisce un elemento apposito, quale Set, List, ecc.

Si rimanda alla documentazione e al materiale dellesercitazione guidata in laboratorio per dettagli


Diciamo qualcosa in pi sul sistema di tipi di Hibernate
DAO, ORM e Hibernate 114

Il sistema di tipi di Hibernate I tipi Hibernate sono di fatto dei convertitori che

traducono da tipi Java a tipi SQL e viceversa La maggior parte dei tipi built-in di Hibernate hanno lo
stesso nome del tipo Java che mappano Possono per esserci pi tipi Hibernate per uno stesso tipo Java bisogna allora indicare nel file di mapping il tipo di mapping che Hibernate deve usare

DAO, ORM e Hibernate

115

Tipi primitivi di Hibernate: Corrispondenze SQL-Java

DAO, ORM e Hibernate

116

Tipi di dati Hibernate sulle date e il tempo

DAO, ORM e Hibernate

117

Come usare i tipi di Hibernate nei mapping: Esempio


<class name="Item" table="ITEM"> (...) <property name="giornoInizio" type="time" column="INIZIO"/> </class>

N.B. Se non specifichiamo il tipo di Hibernate, allora Hibernate usa la reflection, ovvero risale al tipo Java della propriet giornoInizio della classe Item e assume un comportamento di default se abbiamo definito la propriet giornoInizio di tipo java.util.Date, Hibernate cerca di convertirla nel tipo TIMESTAMP (diverso da TIME)
DAO, ORM e Hibernate 118

Riferimenti
DAO: http://java.sun.com/blueprints/corej2eepatterns/ Patterns/DataAccessObject.html ORM:
http://www.agiledata.org/essays/mappingObjects.html

Hibernate: http://www.hibernate.org/ http://www.visualbuilder.com/java/hibernate/ tutorial/ http://docs.jboss.org/hibernate/stable/core/ reference/en/html/ API: http://docs.jboss.org/hibernate/core/3.5/api/ Helen Feddema. DAO Object Model: The Definitive Reference, O'Reilly Media Christian Bauer and Gavin King. Java Persistence with Hibernate, Manning
DAO, ORM e Hibernate 119

Tecnologie Web T Gestione delle Transazioni e Livelli di Isolamento

Home Page del corso: http://www-db.deis.unibo.it/courses/TW/ Versione elettronica: 5.03.Transazioni.pdf Versione elettronica: 5.03. Transazioni-2p.pdf
Gestione Transazioni 1

Introduzione Caratteristica di base delle nostre applicazioni Web quella di avere un elevato numero di utenti che accedono, anche in maniera concorrente, ai dati (base di dati) verso i quali si interfacciano Il sistema di gestione dei dati (DBMS) deve garantire affidabilit e prestazioni la base di dati deve essere sempre in uno stato

consistente

La gestione della concorrenza e della affidabilit nell'accesso ai dati una delle propriet fondamentali

che ci offrono i moderni DBMS

Un concetto cardine quello di transazione

Gestione Transazioni

Transazioni Informalmente, una transazione una sequenza di

operazioni che pu concludersi con un successo o un insuccesso in caso di successo: il risultato delle operazioni deve essere permanente in caso di insuccesso: si deve tornare allo stato precedente all'inizio della transazione

Gestione Transazioni

Definizione di transazione Transazione parte di programma caratterizzata da un inizio (begin-transaction, start transaction in SQL), una fine (end-transaction, non esplicitata in SQL) e al cui interno deve essere eseguito una e una sola volta uno dei seguenti comandi: commit work per terminare correttamente rollback work per abortire la transazione

Un sistema transazionale (OLTP) in grado di definire ed eseguire transazioni per conto di un certo numero di applicazioni concorrenti

Gestione Transazioni

Applicazioni e transazioni L'esecuzione di un programma pu essere visto come una sequenza di transazioni (eventualmente intervallate da operazioni non relative ai dati)

begin T1

AZIONI PROGRAMMA APPLICATIVO


end T1 begin T2

TRANSAZIONE T1

AZIONI
end T2

TRANSAZIONE T2

Gestione Transazioni

Una transazione SQL


Esempio: trasferimento di 10 unit dal conto 42177 al conto

12202

start transaction; update ContoCorrente set Saldo = Saldo + 10 where NumConto = 12202; update ContoCorrente set Saldo = Saldo - 10 where NumConto = 42177; commit work;

Gestione Transazioni

Una transazione con varie decisioni


Esempio: trasferimento di 10 unit dal conto 42177 al conto

12202 con il controllo che il saldo del cc da cui si preleva sia positivo
start transaction; update ContoCorrente set Saldo = Saldo + 10 where NumConto = 12202; update ContoCorrente set Saldo = Saldo 10 where NumConto = 42177; select Saldo as A from ContoCorrente where NumConto = 42177; if (A>=0) then commit work; else rollback work;
Gestione Transazioni

Il concetto di transazione Una definizione pi precisa di transazione: unit di elaborazione che gode delle propriet "ACIDE" (ACID): Atomicit Consistenza Isolamento Durabilit (persistenza)

Gestione Transazioni

ACID: Atomicit Una transazione una unit atomica (tutto o niente) di

fondamentale per garantire l'integrit dei dati Se qualcosa va storto il sistema deve essere in grado di annullare tutti i cambiamenti fatti a partire dall'inizio della transazione La base di dati non pu essere lasciata in uno stato intermedio
un guasto o un errore prima del commit debbono causare l'annullamento (UNDO) delle operazioni svolte un guasto o errore dopo il commit non deve avere

elaborazione

conseguenze

Esito

Commit = caso "normale" e pi frequente Abort (o rollback)


richiesto dall'applicazione = suicidio richiesto dal sistema (violazione dei vincoli, concorrenza, incertezza in caso di fallimento) = omicidio
Gestione Transazioni 9

ACID: Consistenza La transazione rispetta i vincoli di integrit Conseguenza: se lo stato iniziale corretto anche lo stato finale corretto

Gestione Transazioni

10

ACID: Isolamento La transazione non risente degli effetti delle altre

transazioni concorrenti

l'esecuzione concorrente di una collezione di transazioni deve produrre un risultato che si potrebbe ottenere con una esecuzione sequenziale Conseguenza: una transazione non espone i suoi stati intermedi

Gestione Transazioni

11

ACID: Durabilit (Persistenza) Gli effetti di una transazione andata in commit non vanno perduti ("durano per sempre"), anche in presenza di guasti Commit significa impegno

Gestione Transazioni

12

Controllo di concorrenza Se la propriet di isolamento non completamente soddisfatta, due (o pi) transazioni effettuate su un database consistente possono portare il database in uno stato inconsistente Due azioni sullo stesso oggetto si dicono essere in

confitto se almeno una delle due una operazione di scrittura

Date due transazioni T1 e T2 in conflitto, si possono verificare tre tipologie di situazioni anomale conflitto Write-Read (W-R): T2 legge un dato precedentemente scritto da T1 conflitto Read-Write (R-W): T2 scrive un dato precedentemente letto da T1 conflitto Write-Write (W-W): T2 scrive un dato precedentemente scritto da T1
Gestione Transazioni 13

Conflitti WR: Reading uncommitted data Si pu verificare una anomalia se una transazione T2 legge un dato che stato modificato da una transazione T1 non ancora conclusa (quindi uncommitted) In particolare questa situazione pu generare letture sporche

Gestione Transazioni

14

Lettura sporca

t1 traferisce 100 da A a B t2 incrementa sia A che B del 6%

N.B. Assumiamo sempre un begin of transaction (BOT ) come prima operazione di ogni transazione
Gestione Transazioni 15

Lettura sporca

supponiamo che sia A che B all'inizio valgano 1000: con una esecuzione seriale t1 t2
t1 r1(A) A = A - 100 w 1 (A) r1(B) B = B + 100 w1(B)
commit

t2

A = 900*1.06 = 954 B = 1100*1.06 = 1166 A+B=2120


Gestione Transazioni 16

tempo

r2(A)

A = A * 1.06 w2(A) r2(B) B = B * 1.06 w2(B) commit

Lettura sporca

supponiamo che sia A che B all'inizio valgano 1000: con una esecuzione seriale t2 t1
t1 t2 r2(A)
A = A * 1.06 w2(A) r2(B) B = B * 1.06 w2(B) commit

tempo
r1(A) A = A - 100 w 1 (A) r1(B) B = B + 100 w1(B)
commit

A = 960 B = 1160 A+B = 2120


Gestione Transazioni 17

Lettura sporca

supponiamo che sia A che B all'inizio valgano 1000: con esecuzione concorrente di t2 t1
t1 r1(A) A = A - 100 w1(A) t2

tempo

r2(A)

A = A * 1.06 w2(A) r2(B) B = B * 1.06 w2(B) commit

r1(B)

B = B + 100 w1(B) commit

t2 ha letto uno stato intermedio ("sporco")

A = 954 B = 1160 NB: alla fine qualcuno ci ha perso ... e il totale cambia: chi ha guadagnato?
Gestione Transazioni 18

Conflitti RW: Unrepeatable read Si possono verificare diverse anomalie se una transazione T2 cambia il valore di un dato che stato letto da una transazione T1 mentre T1 ancora in esecuzione In particolare, questa situazione pu generare: perdita di aggiornamento, lettura inconsistente

(unrepeatable read)

Gestione Transazioni

19

Letture inconsistenti t1 legge due volte x :


t1 r1(x)
tempo

t2 r2(x) x=x+1 w2(x)


commit

r1(x)

commit

t1 legge due valori diversi per x !

Gestione Transazioni

20

Perdita di aggiornamento Due transazioni identiche: t1: r(x), x = x + 1, w(x) t2 : r(x), x = x + 1, w(x) Inizialmente x=2; dopo una esecuzione seriale x=4 Una esecuzione concorrente:
t1 r1(x) x=x+1 w1(x) t2 r2(x) x=x+1 w2(x)
tempo

commit

commit

Un aggiornamento viene perso: x = 3


Gestione Transazioni 21

Conflitti WW: Overwriting uncommitted data Si possono verificare anomalie se una transazione T2 sovrascrive il valore di un dato che gi stato modificato da una transazione T1, mentre T1 ancora in esecuzione questa situazione pu generare effetti fantasma

Gestione Transazioni

22

Effetti fantasma
vincolo: x+y+z=1000

t1
sum = 0 read(x) sum = sum + x
tempo

t2

read(y) y = y - 100 write(y)

T1 calcola in maniera errata la somma di x, y, z (supponiamo T2 stia spostando soldi dal conto y al conto z: il totale di cassa non cambia per T1 invece si!)

read(y) sum = sum + y read(z) sum = sum + z commit read(z) z = z + 100 write(z) commit
Gestione Transazioni

23

Gestione di transazioni mediante lock I DBMS per evitare anomalie nelle transazione

concorrenti usano diverse tecniche Una delle pi comuni basata su lock Il lock un meccanismo che blocca l'accesso ai dati
ai quali una transazione accede ad altre transazioni lock a livello di riga, tabella, database lock in operazioni di scrittura/lettura Quando una risorsa bloccata, le transazioni che ne

richiedono l'accesso vengono messe in coda

quindi devono aspettare (che il lock sia rimosso) In sostanza, questo un meccanismo efficace, ma influisce sulle prestazioni

Gestione Transazioni

24

Livelli di isolamento Idealmente vorremmo avere sempre garantita la propriet di isolamento delle transazioni Ma questa propriet ha dei costi che possono limitare le prestazioni del sistema I DBMS offrono diversi livelli di isolamento: maggiori restrizioni, minori prestazioni Il programmatore deve conoscere i livelli di isolamento

e scegliere quello sufficiente ai propri obiettivi

Gestione Transazioni

25

Livelli di isolamento SQL


SERIALIZABLE assicura che
la transazione T legge solo cambiamenti fatti da transazioni concluse nessun valore letto o scritto da T verr cambiato da altre transazione finch T non conclusa se T legge un insieme di valori acceduti secondo qualche condizione di ricerca, l'insieme non viene modificato da altre transazione finch T non conclusa

REPEATABLE READ assicura che


la transazione T legge solo cambiamenti fatti da transazioni concluse nessun valore letto o scritto da T verr cambiato da altre transazione finch T non conclusa

READ COMMITTED assicura che


la transazione T legge solo cambiamenti fatti da transazioni concluse T non vede nessun cambiamento eventualmente effettuato da transazioni concorrenti non concluse tra i valori letti all'inizio di T

READ UNCOMMITTED
a questo livello di isolamento una transazione T pu leggere modifiche fatte ad un oggetto da un transazione in esecuzione; ovviamente l'oggetto pu essere cambiato mentre T in esecuzione. Quindi T soggetta a effetti fantasma

Gestione Transazioni

26

Livelli di isolamento SQL Il livello di isolamento pu essere scelto per ogni transazione read uncommitted permette letture sporche, letture inconsistenti, aggiornamenti fantasma e inserimenti fantasma read committed evita letture sporche ma permette letture inconsistenti, aggiornamenti fantasma e inserimenti fantasma repeatable read evita tutte le anomalie esclusi gli inserimenti fantasma serializable evita tutte le anomalie Nota: la perdita di aggiornamento sempre evitata Inoltre le transazioni possono essere definite read-only

Gestione Transazioni

27

Livelli di isolamento e anomalie

livello di isolamento
READ UNCOMMITTED READ COMMITTED

lettura sporca
pu verificarsi NO

lettura inconsistente
pu verificarsi pu verificarsi NO NO

effetto fantasma
pu verificarsi pu verificarsi pu verificarsi NO

REPEATABLE READ NO SERIALIZABLE NO

Gestione Transazioni

28

Transazioni in SQL
START TRANSACTION SET TRANSACTION ISOLATION LEVEL livello

istruzioni SQL
COMMIT

Gestione Transazioni

29

Transazioni in JDBC Scelta della modalit delle transazioni: un metodo definito nell'interfaccia Connection:
setAutoCommit(boolean autoCommit)

connection.setAutoCommit(true) (default) "autocommit ": ogni operazione una transazione connection.setAutoCommit(false) gestione delle transazioni da programma
connection.commit() connection.rollback()

N.B. non c' start transaction


Gestione Transazioni 30

JDBC e livelli di isolamento Il metodo setTransactionIsolation() permette di modificare il livello di isolamento delle transazioni Riceve un parametro intero che pu assumere uno dei valori costanti definiti nella interfaccia Connection TRANSACTION_NONE: le transazioni non vengono supportate. Passare questo parametro a setTransactionIsolation() equivalente ad una chiamata al metodo setAutoCommit(true) TRANSACTION_READ_UNCOMMITTED: nessun livello di isolamento garantito, quindi possono presentarsi tutte le anomalie

Gestione Transazioni

31

JDBC e livelli di isolamento TRANSACTION_READ_COMMITTED: vengono prevenute solo le letture sporche. Le altre anomalie possono ancora presentarsi TRANSACTION_REPEATABLE_READ: possono presentarsi solo inserimenti fantasma TRANSACTION_SERIALIZABLE: il massimo livello di isolamento. Nessuna anomalia pu presentarsi

Gestione Transazioni

32

Esempio transazioni con JDBC


public void evadiOrdine (int codProdotto, String idOrdine, int qnt, Connection con) public void evadiOrdine (int codProdotto, String idOrdine, int qnt, Connection con) throws PersistenceException { throws PersistenceException { try { try { con.setAutoCommit(false); con.setAutoCommit(false); con.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ); con.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ); PreparedStatement updateProd updateProd = PreparedStatement = con.prepareStatement("UPDATE prodotti con.prepareStatement("UPDATE prodotti SET quantita=(quantita - ?) SET quantita=(quantita - ?) WHERE codiceProdotto = ? "); WHERE codiceProdotto = ? "); updateProd.setInt(1, codProdotto); updateProd.setInt(1, codProdotto); updateProd.setInt(2, qnt); updateProd.setInt(2, qnt); PreparedStatement updateOrd = PreparedStatement updateOrd = con.prepareStatement("UPDATE ordini SET ordini = 'evaso' where con.prepareStatement("UPDATE stato SET stato = 'evaso' idOrdine=?"); where idOrdine=?"); updateOrd.setInt(1, idOrdine); idOrdine); updateOrd.setInt(1, int nProd = prepareProd.executeUpdate(); int nProd = prepareProd.executeUpdate(); int nOrd = prepareOrd.executeUpdate(); int nOrd = prepareOrd.executeUpdate(); if (nProd+nOrd != 2) if (nProd+nOrd != 2) con.rollback(); con.rollback(); else else con.commit(); con.commit(); } catch (SQLException ex) { try { } catch (SQLException ex) { con.rollback(); try { throw new PersistenceException("Transaction failed: " + con.rollback(); ex.getMessage()); throw new PersistenceException("Transaction failed: " + ex.getMessage()); } catch (SQLException sqx) { } catch (SQLException sqx) { throw new PersistenceException("Rollback failed: " + sqx.getMessage()); throw new PersistenceException("Rollback failed: " + sqx.getMessage()); } } } } } }

Gestione Transazioni

33

JDBC e livelli di isolamento Attenzione: non tutti i DBMS supportano le transazioni

e non tutti quelli che le supportano permettono l'impostazioni di tutti i livelli di isolamento previsti da JDBC

compito del programmatore che usa l'API JDBC verificare le effettive capacit del DBMS in uso A tal fine l'interfaccia Connection mette a disposizione il metodo getMetaData(), che restituisce un oggetto DatabaseMetaData

Gestione Transazioni

34

JDBC e livelli di isolamento L'interfaccia DatabaseMetaData offre metodi per reperire informazioni sul DBMS In particolare, per verificare il supporto alle transazioni, abbiamo i metodi: supportsTransactions(): restituisce true se le transazioni sono supportate dal database, false se non lo sono. In questo ultimo caso, il metodo commit() non esegue alcuna operazione e il livello di isolamento sempre TRANSACTION_NONE supportsTransactionIsolationLevel(int): permette di sapere se il DBMS supporta il livello di isolamento passato come parametro (secondo le costanti definite dall'interfaccia Connection nella slide precedente)

Gestione Transazioni

35

JDBC e livelli di isolamento


import java.sql.*; public class TransactionCapabilities { public static void main(String[] args) throws SQLException { try { Class.forName("COM.ibm.db2.jdbc.app.DB2Driver"); } catch(ClassNotFoundException e) { System.err.println("Driver non trovato"); } String url = "jdbc:db2:tw_stud"; Connection con = null; try { con = DriverManager.getConnection(url, ******", ******"); }catch(SQLException e){ System.err.println("Connessione non restituita"); } try { DatabaseMetaData dbMetaData = con.getMetaData(); if (dbMetaData.supportsTransactions()) System.out.println("tranzazioni supportate"); if (dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED)) System.out.println("TRANSACTION_READ_UNCOMMITTED"); if (dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED)) System.out.println("TRANSACTION_READ_COMMITTED"); if (dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ)) System.out.println("TRANSACTION_REPEATABLE_READ"); if (dbMetaData.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE)) System.out.println("TRANSACTION_SERIALIZABLE"); } catch(SQLException e){ System.err.println("Errori lettura metadati"); } finally { con.close(); } } } Gestione Transazioni

36

Limiti di JDBC JDBC rappresenta una buona soluzione per la gestione di transazioni che manipolano un unico DB, ovvero che coinvolgono una unica Connection! In sistemi che manipolano dati appartenenti a diversi

DB, ogni unit di lavoro richiede laccesso a pi di una risorsa

in questi casi non possibile garantire la propiet ACID di atomicit con JDBC! Occorre un transaction manager in grado di gestire diverse sorgenti dati (DB) in un unico sistema

transazionale

Gestione Transazioni

37

Java Transaction API (JTA) Java Transaction API (JTA) fornisce un servizio per la gestione di transazioni distribuite per la piattaforma J2EE Una transazione distribuita coinvolge un transaction manger e uno o pi resource manger (ovvero qualunque tipo di datastore persistente) Il transaction manger responsabile del coordinamento di tutti i partecipanti alla transazione

Gestione Transazioni

38

JTA JTA permette linterazione con lo sviluppatore mediante linterfaccia javax.transaction.UserTransaction e i metodi begin(), commit() e rollback()
Starting a transaction with JTA: Example
import javax.transaction.*; import javax.naming.*; // ... UserTransaction utx = (UserTransaction) new InitialContext() .lookup("java:comp/UserTransaction"); utx.begin(); // ... DataSource ds = obtainXADataSource(); Connection conn = ds.getConnection(); pstmt = conn.prepareStatement("UPDATE MOVIES ..."); pstmt.setString(1, "Spinal Tap"); pstmt.executeUpdate(); // ... utx.commit(); // ...

Gestione Transazioni

39

Transazioni e Hibernate Come visto nelle precedenti lezioni, Hibernate astrae dalle API JDBC/JTA sottostanti livello di applicazione pu essere trasparente a questi dettagli Hibernate espone linterfaccia org.hibernate.Transaction che permette di lavorare on top a JDBC e JTA Rappresenta la demarcazione unificata delle transazioni Compatibile sia a JDBC che a JTA Il maggior beneficio di Hibernate rispetto a JDBC e JTA di permettere stretta integrazione con il

contesto di persistenza Es. flush automatico di Session al commit


Gestione Transazioni

40

Transazioni e Hibernate: Esempio


import java.util.*; import org.hibernate.*; import persistence.HibernateUtil; //... //First unit of work Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); User user = new User("pippo"); String userId = (String) session.save(user); tx.commit(); session.close(); //...

Gestione Transazioni

41

Hibernate Come gi sappiamo, linterfaccia principale di Hibernate Session All'apertura di un nuovo oggetto della classe Session metodo openSession()della classe SessionFactory viene creata una nuova connessione JDBC con la base di dati di default, Hibernate imposta l'autocommit a false ; dunque comincia a tutti gli effetti una transazione JDBC

Gestione Transazioni

42

Hibernate Una Session Hibernate si dice essere pigra; questo un punto a favore di Hibernate La Session non consuma alcuna risorsa fino a che le stesse non sono strettamente necessarie Solo allinizio di una transazione viene resa disponibile una Connection dal pool di connessioni La chiamata beginTransaction() si traduce in setAutoCommit(false) nella Connection JDBC corrispondente

Gestione Transazioni

43

Hibernate Il blocco di statement SQL di una transazione sono eseguiti seguendo la regola il pi tardi possibile (write-behind ), ovvero al flushing del contesto di persistenza della Session Ci accade di default al commit() di Transaction Dopo il commit (o il roll-back) della transazione la connessione rilasciata e unbound dalla Session Linizio di una nuova transazione con la stessa Session necessita di una nuova connessione dal pool di connessioni disponibili

Gestione Transazioni

44

Locking ottimistico di sessione In caso di accesso concorrente, affinch non occorrano anomalie di tipo lost-update, Hibernate prevede la possibilit di abilitare un meccanismo di locking ottimistico tale che nel momento in cui viene invocato il flushing, verifica se la porzione della base di dati che sar modificata non sia cambiata se cambiata lancia una eccezione StaleObjectStateException Per abilitare il locking ottimistico, nell'elemento class del file di mapping relativo alla classe su cui verte la modifica, necessario definire l'attributo optimistic-lock pari a all

Gestione Transazioni

45

Long-lived transactions Tra il momento in cui si leggono i dati dal DB ed il momento in cui eventuali modiche si rendono persistenti pu trascorrere molto tempo Hibernate applica il pattern session-per-conversation: necessario disabilitare il flushing automatico chiamando il metodo setFlushMode(FlushMode.MANUAL) quando la sessione aperta l'isolamento garantito in quanto, abilitando il locking ottimistico, le modiche fatte in transazioni concorrenti sono riconosciute l'atomicit garantita dal fatto che il flushing viene eseguito solo al termine della transazione, e se la sessione viene chiusa senza fare il flushing, la transazione viene abortita
Gestione Transazioni 46

Controllo ottimistico di concorrenza Per la gestione efficiente di accessi concorrenti

Hibernate sfrutta la tecnica Optimistic Concurrency Control (OCC) OCC si basa sullassunzione che la maggior parte delle transazioni verso DB non sono in conflitto con altre transazioni; questo permette di essere
piuttosto permissivi nel rilasciare la possibilit di esecuzione Se i conflitti sono rari, post-validazioni possono

essere svolte efficientemente => alto throughput OCC sfrutta versioning dei dati per ottenere elevati gradi di concorrenza e alta scalabilit Version checking sfrutta numeri di versione o timestamp per fare la detection di aggiornamenti
che possono determinare conflitti
DAO, ORM e Hibernate 47

Riferimenti JDBC API: http://java.sun.com/j2se/1.5.0/docs/api/ index.html Hibernate API: http://docs.jboss.org/hibernate/core/ 3.5/api/ Atzeni, Ceri, Fraternali, Paraboschi, Torlone Basi di dati Architetture e linee di evoluzione, McGraw-Hill Italia, 2009 Christian Bauer and Gavin King. Java Persistence with Hibernate, Manning

Gestione Transazioni

48

HTML / XHTML Quick Reference

This document: http://www.utoronto.ca/ian/books/extras/

HTML AND XHTML QUICK REFERENCE CHARTS: HEAD AND BODY MARKUP
Element
<html> ... </html> <head> ... </head> <base /> <isindex /> <link /> <meta /> <script> ... </script> <style> ... </style> <title> ... </title> <body> .. </body> <address> ... </address> <blockquote> ... </blockquote> <center> ... </center> <div> ... </div> <hn> ... </hn> <hr /> <p> ... </p> <pre> ... </pre> <form> ... </form> <keygen /> <button> ... </button> <fieldset> ... </fieldset> <legend> ... </legend> <label> ... </label> <input /> <select> ... </select> <optgroup> </optgroup>

Description and Browser Support

Bounds of HTML or XHTML document Document head (document meta data) Base URL for the document (i.e., original URL) Simple search interface (use form instead) Relationship(s) to other resources (e.g., style sheets) Document meta-information (e.g., for search engines) Inline script program (e.g., JavaScript, VBscript) Style sheet rules [IE3+, NN4+, OP3.6+] Document title (contains text only, no markup) Document body (contains what gets displayed) Address information Block quotation Center element contents (use div instead) Block division of document Headings, from h1 to h6 Horizontal rule or divider Paragraph Preformatted text (preserve white space characters) Fill-in form Create encrypted key to identify user [NN3+, OP3.6+] Advanced input button [IE4+, NN6] Grouped set of input elements [IE4+, NN6] Label for a fieldset [IE4+, NN6] Label for an input [IE4+, NN6] General input element (text, checkboxes, etc.) Selectable list of items Group of option elements in a selectable list [No support] <option> ... </option> Item in list (inside select or optgroup) <textarea> ... </textarea> Multi-line text input area <dl> ... </dl> Glossary or description list <dt> ... </dt> Term in list <dd> ... </dd> Term description <ol> ... </ol> Ordered list (., numbered) <li> ... </li> List item <ul> ... </ul> Unordered list (e.g., bulleted) <li> ... </li> List item Directory-style listing (use ul instead) <dir> ... </dir> <li> ... </li> List item Menu list (use ul instead) <menu> ... </menu> <li> ... </li> List item <table> ... </table> Tabular content (columns and rows) <caption> ... </caption> Table caption <colgroup> ... </colgroup> Define groups of columns [IE4+, NN6] <col /> Set column properties [IE4+, NN6] <tbody> ... </tbody> Group rows making up table body [IE4+, NN6] <tfoot> ... </tfoot> Group rows making up table footer [IE4+, NN6] <thead> ... </thead> Group rows making up table header [IE4+, NN6] Table row (preferably inside thead,tbody or tfoot) <tr> ... </tr> <td> ... </td> Table content -- data <th> ... </th> Table content -- header (row or column description) Multi-column text [NN4 only] <multicol> ... </multicol> Frameset document (replaces body element) Defines frame content (using a URL) Subdivides a frame into additional frames Alternate content ( if frames not supported) a body (containing, in turn, regular body content)

Key to this Figure


HTML Version <tag> <tag> <tag> Standard elements Netscape/Microsoft extensions avoid if possible Deprecated -- avoid if possible

Element Tag Rules <tag> ... </tag> Element has content, and the end tag is mandatory. <tag /> Element is empty. Element Content Rules Right hand elements must be inside indicated left-hand element. Left hand element can contain the indicated righthand elements. frameset is an alternative to the body element Browser Support Descriptions Elements are supported by essentially all current browsers unless a list of browsers is given in square brackets after the description. If such a list is present, then only the listed browsers support the element. The following 2letter notation is used to describe these browsers: IE NN OP LY WT Internet Explorer Netscape Navigator Opera Lynx WebTV

... followed by a browser version number. This may then by followed by a '+' sign if the element is also supported by subsequent versions of that browser For example: IE4+ Supported by Internet Explorer 4 and greater. NN4 Supported by Navigator 4, but not by Navigator 6.

<frameset> ... </frameset> <frame /> <frameset> ... </frameset /> <noframes> ... </noframes> <body> ... </body>

Last Update: 7 November 2000 Copyright 1996-2000 Ian S. Graham

1/2

The XHTML 1.0 Language and Design Sourcebook http://www.utoronto.ca/ian/books/xhtml1/

HTML / XHTML Quick Reference

This document: http://www.utoronto.ca/ian/books/extras/

HTML AND XHTML QUICK REFERENCE CHARTS: INLINE MARKUP


Inline (Inclusion) Elements
<audioscope /> <applet> ... </applet> <param /> <img /> <iframe /> <embed /> <noembed> ... </noembed> <noscript> ... </noscript> <object> ... </object> <param /> <br /> <spacer /> <wbr /> <basefont /> <bgsound /> <map> ... </map> <area /> <script> ... </script> <server> ... </server> Display audio chart [WT only] Inline program (applet) Parameter for applet Inline image Inline frame [IE3+, NN6] Embed arbitrary data Markup alternative to embed Markup alternative to script Embed data and/or data handling program/applet [IE4+, NN4+] Parameter for object Forced line break Horizontal and/or vertical spacer [NN4+ only] Word break Set base font properties Background audio [IE3+ only] Client-side imagemap Region of map Script program for browser Script program to run on server [Netscape servers only] Overlay presentation layer Overlay layer (relative positioning) Alternative for non-layer browsers Hypertext anchor

Inline (Physical Markup) Elements


<b> ... </b> <blackface> ... </blackface> <bdo> ... </bdo> <big> ... </big> <blink> ... </blink> <font> ... <font> <i> ... </i> <marquee> ... </marquee> <nobr> ... </nobr> <s> ... </s> <small> ... </small> <span> ... </span> <strike> ... </strike> <sub> ... </sub> <sup> ... </sup> <tt> ... </tt> <u> ... </u> <abbr> ... </abbr> <acronym> ... </acronym> <cite> ... </cite> <code> ... </code> <dfn> ... </dfn> <em> ... </em> <kbd> ... </kbd> <q> ... </q> <samp> ... </samp> <strong> ... </strong> <var> ... </var> <del> ... </del> <ins> ... </ins> Bold face Extra bold [WT only] Bi-directional override [IE4+, NN6] Bigger Blinking [NN1+ only] Change font properties Italics Scrolling text [IE3+ only] No line break Struck-through [Not by Opera] Smaller Inline text block [IE3+, NN4+, OP3.6+] Struck-out subscript [NN3+, IE3+, OP3.6+, WT] superscript [NN3+, IE3+, OP3.6+, WT] Fixed-width/monospace Underline Abbreviation [NN6, OP4] Acronym [IE4+, NN6, OP4] Citation Typed code Definition Emphasized Keyboard input Inline quotation [IE4+, NN6, OP4] Sample text Strongly emphasized A variable Deleted content [IE4+, NN6, OP4] Inserted content [IE4+, NN6, OP4]

Inline (Character-like) Elements

Inline (Meta-Information) Elements

Inline (Logical Markup) Elements

Netscape Layer Elements [NN4 only]


<layer> ... </layer> <ilayer> ... </ilayer> <nolayer> ... </nolayer> <a> ... </a>

Special Markup: Inserted/Deleted Content

Inline - Hypertext Anchors NOTE on Lynx Browser Support.

Lynx is a text-mode browser that does not render inline images, and that can generally only display text using one font (with, in some cases, reverse video, boldface and underlining). Thus many inline text-formatting styles are not possible with Lynx. If you want pages to work with lynx, you want to avoid inclusion, character-like (except br) and special markup elements, and restrict yourself to only simple physical/logical elements (e.g., em, strong). You will also want to avoid table elements, and framesets.

SIMPLIFIED ELEMENT CONTENT RULES FOR INLINE MARKUP


Inclusion Elements Character-like & MetaInformation Netscape Layer Elements Physical/Logical Text Markup Hypertext Anchors Special Markup
If they can take content (many, like img, cannot), they take content appropriate to their context (i.e., text or inline markup if they are themselves inline, block markup if they are a block) Generally allowed inside any non-empty block or inline element that can appear inside the body (see also preceding page). Can contain almost any inline element or any element that can be placed inside the body element (see preceding page) -- they cannot appear in the document head. Can contain text or any of the other inline or special markup elements described above Like physical or logical inline text markup, but cannot contain additional anchor elements. Can contain text or almost any block or inline element, or any element that can be placed inside the body (see front cover)

Last Update: 7 November 2000 Copyright 1996-2000 Ian S. Graham

2/2

The XHTML 1.0 Language and Design Sourcebook http://www.utoronto.ca/ian/books/xhtml1/