outline - università degli studi di milano-bicoccamiddle east 5.12 million europe 190.91 million...

41
1 Applicazioni Applicazioni Web Web Flavio De Paoli [email protected] 2 Outline Outline Il web come architettura di riferimento Architettura di una applicazione web Servlet e JSP Gestione delle sessioni: cookies Accesso a database con una servlet

Upload: others

Post on 09-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

1

ApplicazioniApplicazioni Web Web

Flavio De Paoli

[email protected]

2

OutlineOutline

Il web come architettura di riferimento

Architettura di una applicazione web

Servlet e JSP

Gestione delle sessioni: cookies

Accesso a database con una servlet

Page 2: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

3

PerchéPerché ilil web web

Basato su Internet

Ambiente standard (TCP/IP)

Larga diffusione

Indipendente dalle piattaforme

Semplicità d’uso

Interfaccia grafica (Browsers)

Infrastruttura completa

Supporta sistemi aperti

Strumenti sempre più potenti: evoluzioni di HTML, CGI, JavaScript, Java,

4

Diffusione del webDiffusione del web

Page 3: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

5

Persone on-linePersone on-line

Dic 2000: total world wide: 275.54 million

Source: http://www.nua.ie/surveys/

September 2002.

33.35 millionLatin America

182.67 millionCanada &

USA

5.12 millionMiddle East

190.91 millionEurope

187.24 millionAsia/Pacific

6.31 millionAfrica

605.60 millionWorld Total

6

HTTP/CGIHTTP/CGI

URL definisce un naming globale

HyperText Transfer Protocol (HTTP)

fornisce un modello tipo RPC basato su socket

permette di invocare programmi sul server

Common Gateway Interface (CGI)

permette al server di attivare un programma e di passargli le richieste e i

parametri provenienti dal client

Page 4: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

7

Architettura web Architettura web appapp

Internet

HTTPserver

CGIHTTP

8

ArchitetturaArchitettura CGI CGI

Page 5: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

9

CGI CGI latolato Client Client

La pagina web deve contenere il riferimento allo script

<center> <h1> Prova CGI</h1></center>

<p><a href="http://149.132.196.196/Scripts/nome">

Click per eseguire

</a></p>

Il browser invia una richesta tipo:

GET /Scripts/nome HTTP/1.0

10

CGI e FormCGI e Form

Si possono usare le form per inviare dati

...

<FORM ACTION=“http://123.45.6.78/Scripts/nomeScript”>

Server: <INPUT TYPE=“text” NAME=Jserver”

VALUE=“pippo.pluto.it” MAXLENGTH=“256”>

<INPUT TYPE=“checkbox” NAME=“inviaRisposta”

“VALUE=“yes”> risposta?

<INPUT TYPE=“submit”>

</FORM>

...

Page 6: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

11

CGI e formCGI e form

Il client puo’ usare uno dei due metodi:

GETInclude l’input in coda alla URL

E’ idempotente: ogni esecuzione ha lo stesso effetto => la

risposta viene messa nella cache del client

Usata per ottenere pagine html e immagini

POSTL’input segue come documento autonomo

Non e’ idempotente: ogni esecuzione ha un diverso effetto =>

La risposta NON viene messa nella cache

Usata per processare FORM e interagire con DB

EsempioGET Scripts/nomeScript/Jserver=“pippo.pluto.it”

/inviaRisposta=“false” HTTP/1.0

12

CaratteristicheCaratteristiche

HTTP e CGI stanno tra client e server

architettura complessa e quindi scomoda

performance penalizzate dal protocollo HTTP a caratteri (lentezza,

casting, …)

Non c’è stato

ogni form è un messaggio autonomo

per includere le stesse info in froms successive si possono usare

- campi nascosti

- cookie

Page 7: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

13

OltreOltre i i limitilimiti delledelle CGI CGI

Numerose proposte per infrastrutture e API proprietarie

WinCGI

JSP/Servlets (Sun)

WebObjects (NeXT/Apple)

ASP (Microsoft)

14

Java Java ServletServlet

Page 8: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

15

Java Java ServletsServlets

Sono piccole applicazioni Java residenti sul server

Java Web Server di JavaSoft

Java Servlet Development Kit per i web server più diffusi

Apache/Tomcat

16

CaratteristicheCaratteristiche

Hanno una interfaccia standard

sono limitati

sono semplici

Sono residenti in memoria

mantengono uno stato

consentono interfaccia con un altro servlet

Vantaggi

sono più efficienti e potenti delle CGI

sono meno potenti di un ambiente di programmazione distribuito

(CORBA, EJB)

Page 9: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

17

CosCos’’e e come funzionae e come funziona

Una servlet e’ un componente gestito in modo automatico da un

container o engine

L’interfaccia definisce un set di operazioni predichiarate e

(ri)definibili di volta in volta

Il container controlla le servlet (attiva/disattiva) in base alle

richieste dei client

18

ProblemaProblema: Come : Come fa il fa il containercontainerad ad ““eseguireeseguire”” la la servletservlet??

Ogni servlet definisce un insieme di operazioni standard che il

container può invocare

Realizzare una servlet significa associare un “programma” alle

operazioni predefinite

In questo modo è possibile personalizzare il comportamento di

un componente standard

Page 10: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

19

Interfaccia ServletInterfaccia Servlet

Ogni servlet implementa l’interfaccia javax.servlet.Servlet, con 5

metodi

void init(ServletConfig config)Inizializza la servlet

ServletConfig getServletConfig()Restituisce i parametri di inizializzazione e il

ServletContext che da accesso all’ambiente

void service(ServletRequest request,

ServletResponse response)Invocato per gestire le richieste dei client

String getServletInfo()Restituisce informazioni tipo autore e versione

void destroy()Chiamata quando la servlet termina (es: per chiudere un file o

una connessione con un database)

20

Classi astratteClassi astratte

Sono presenti due classi astratte che implementano i metodi

dell’interfaccia

In pratica si eredita da queste classi e si ridefiniscono i metodi

che interessano

javax.servlet.GenericServlet

javax.servlet.http.HTTPServletDefinisce metodi per l’uso in ambiente web

Page 11: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

21

La classeLa classe HTTPServlet HTTPServlet

Implementa service in modo da invocare i metodi per servire

le richieste dal web

doGetProcessa le richieste

di tipo GET

doPostProcessa le richieste

di tipo POST

Parametri:HTTPServletRequest

HTTPServletResponse

EccezioniServletException

IOException

22

Richieste e risposteRichieste e risposte

Interfaccia HTTPServletRequest

Viene passato un oggetto da service

Contiene la richiesta del client

Estende ServletRequest

Interfaccia HTTPServletResponse

Viene passato un oggetto da service

Contiene la risposta per il client

Estende ServletResponse

Page 12: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

23

Richieste e risposteRichieste e risposte

I metodi

String getParameter(String name)Restituisce il valore dell’argomento name

Enumeration getParameterNames()Restituisce l’elenco dei nomi degli argomenti

String[] getParametersValues(String name)Restituisce i valori dell’argomento name

Cookie[] getCockies()Restituisce i cookies del server sul client

void addCookie(Cookie cookie)Aggiunge un cookie nell’intestazione della risposta

HTTPSession getSession(boolean create)Una HTTPSession dentifica il client.Viene creata se create=true

24

Richieste e risposteRichieste e risposte

I metodi (continua)

void setContentType(String type)Specifica il tipo MIME della risposta per dire al

browser come visualizzare la risposta

Es: “text/html” dice che e’ html

ServletOutputStream getOutputStream()Restituisce lo stream di byte per comunicare con il

client

PrintWriter getWriter()Restituisce lo stream di caratteri per comunicare con

il client

Page 13: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

25

Un esempio con GETUn esempio con GET

1) // da Internet e WWW – How to program, Dietel&Dietel, Prentice Hall

2) // Creating and sending a page to the client

3) public class HTTPGetServlet extends HttpServlet {

4) public void doGet( HttpServletRequest request,

5) HttpServletResponse response )

6) throws ServletException, IOException {

7) PrintWriter output;

8) response.setContentType( "text/html" ); // content type

9) output = response.getWriter(); // get writer

10) // create and send HTML page to client

11) StringBuffer buf = new StringBuffer();

12) buf.append( "<HTML><HEAD><TITLE>\n" );

13) buf.append( "A Simple Servlet Example\n" );

14) buf.append( "</TITLE></HEAD><BODY>\n" );

15) buf.append( "<H1>Welcome to Servlets!</H1>\n" );

16) buf.append( "</BODY></HTML>" );

17) output.println( buf.toString() );

18) output.close(); // close PrintWriter stream

19) }

20) }

26

La pagina HTMLLa pagina HTML

1) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2) <HTML>

3) <HEAD>

4) <TITLE>Servlet HTTP GET Example</TITLE>

5) </HEAD>

6) <BODY>

7) <FORM ACTION="http://localhost:8080/servlet/HTTPGetServlet"

8) METHOD="GET">

9) <P>Click the button to have the servlet send

10) an HTML document</P>

11) <INPUT TYPE="submit" VALUE="Get HTML Document">

12) </FORM>

13) </BODY>

14) </HTML>

Tipo di richiesta

Come processare il form

Crea un bottone Etichetta esposta

Page 14: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

27

La pagina HTMLLa pagina HTML

28

Un esempio POSTUn esempio POST

1) // A simple survey servlet.

2) // This servlet writes data to a file on the Web server.

3) import javax.servlet.*;

4) import javax.servlet.http.*;

5) import java.text.*;

6) import java.io.*;

7) public class HTTPPostServlet extends HttpServlet {

8) private String animalNames[] =

9) { "dog", "cat", "bird", "snake", "none" };

10) public void doPost( HttpServletRequest request,

11) HttpServletResponse response )

12) throws ServletException, IOException

13) {

14) int animals[] = null, total = 0;

15) File f = new File( "survey.dat" );

Page 15: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

29

16) if ( f.exists() ) {

17) // Determine # of survey responses so far

18) try {

19) ObjectInputStream input = new ObjectInputStream(

20) new FileInputStream( f ) );

21) animals = (int []) input.readObject();

22) input.close(); // close stream

23)

24) for ( int i = 0; i < animals.length; ++i )

25) total += animals[ i ];

26) }

27) catch( ClassNotFoundException cnfe ) {

28) cnfe.printStackTrace();

29) }

30) }

31) else

32) animals = new int[ 5 ];

33) // read current survey response

34) String value =

35) request.getParameter( "animal" );

36) ++total; // update total of all responses

30

37) // determine which was selected and update its total

38) for ( int i = 0; i < animalNames.length; ++i )

39) if ( value.equals( animalNames[ i ] ) )

40) ++animals[ i ];

41) // write updated totals out to disk

42) ObjectOutputStream output = new ObjectOutputStream(

43) new FileOutputStream( f ) );

44) output.writeObject( animals );

45) output.flush();

46) output.close();

47) // Calculate percentages

48) double percentages[] = new double[ animals.length ];

49)

50) for ( int i = 0; i < percentages.length; ++i )

51) percentages[ i ] = 100.0 * animals[ i ] / total;

Page 16: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

31

52) // send a thank you message to client

53) response.setContentType( "text/html" ); // content type

54) PrintWriter responseOutput = response.getWriter();

55) StringBuffer buf = new StringBuffer();

56) buf.append( "<html>\n" );

57) buf.append( "<title>Thank you!</title>\n" );

58) buf.append( "Thank you for participating.\n" );

59) buf.append( "<BR>Results:\n<PRE>" );

60) DecimalFormat twoDigits = new DecimalFormat( "#0.00" );

61) for ( int i = 0; i < percentages.length; ++i ) {

62) buf.append( "<BR>" );

63) buf.append( animalNames[ i ] );

64) buf.append( ": " );

65) buf.append( twoDigits.format( percentages[ i ] ) );

66) buf.append( "% responses: " );

67) buf.append( animals[ i ] );

68) buf.append( "\n" );

69) }

70) buf.append( "\n<BR><BR>Total responses: " );

71) buf.append( total );

72) buf.append( "</PRE>\n</html>" );

73) responseOutput.println( buf.toString() );

74) responseOutput.close();

75) }

76) }

32

La pagina HTMLLa pagina HTML

1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

2. <HTML>

3. <HEAD>

4. <TITLE>Servlet HTTP Post Example</TITLE>

5. </HEAD>

6. <BODY>

7. <FORM ACTION="http://localhost:8080/servlet/HTTPPostServlet"

8. METHOD="POST">

9. What is your favorite pet?<BR><BR>

10. <INPUT TYPE="radio" NAME="animal" VALUE="dog">Dog<BR>

11. <INPUT TYPE="radio" NAME="animal" VALUE="cat">Cat<BR>

12. <INPUT TYPE="radio" NAME="animal" VALUE="bird">Bird<BR>

13. <INPUT TYPE="radio" NAME="animal" VALUE="snake">Snake<BR>

14. <INPUT TYPE="radio" NAME="animal" VALUE="none"

15. CHECKED>None

16. <BR><BR><INPUT TYPE="submit" VALUE="Submit">

17. <INPUT TYPE="reset">

18. </FORM>

19. </BODY>

20. </HTML>

Page 17: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

33

La pagina HTMLLa pagina HTML

34

Esecuzione di una Esecuzione di una servletservlet

Viene creata un’istanza della servlet

Condivisa da tutti client

Ogni richiesta genera un Thread che esegue la doXXX appropriata

HTTPserver

Servletcontainer

servlet

Page 18: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

35

Ciclo di vitaCiclo di vita

Una servlet viene creata dal container

Quando viene effettuata la prima chiamata

Viene invocato il metodo init() per inizializzazioni specifiche

Una servlet viene distrutta

Quando non ci sono servizi in esecuzione

Quando e’ scaduto un timeout predefinito

all’occorrenza di uno dei due eventi

Viene invocato il metodo destroy() per terminare

correttamente la servlet

36

TerminazioneTerminazione

Container e richieste dei client devono sincronizzarsi sullaterminazione

Alla scadenza del timeout potrebbe essere ancora in esecuzione la

service()

Bisogna

Tener traccia dei thread in esecuzione

Progettare il metodo destroy() in modo da notificare lo sutdown e

attendere il completamento del metodo service()

Progettare i metodi lunghi in modo che verifichino periodicamente se e’ in

corso uno shutdown e comportarsi di conseguenza

Page 19: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

37

Standard Directory LayoutStandard Directory Layout

A web application is defined as a hierarchy of directories and files

in a standard layout

"unpacked" form

each directory and file exists in the filesystem separately

"packed" form

Web ARchive, or WAR file

38

Standard Directory LayoutStandard Directory Layout

application's"document root"

directory

*.html, *.jsp, etc.The HTML and JSP pages, alongwith other files.

WEB-INF/web.xmlThe Web Application DeploymentDescriptor for your application.

WEB-INF/classes/This directory contains any Javaclass files (and associatedresources) including both servletand non-servlet classes, that arenot combined into JAR files.

WEB-INF/lib/This directory contains JAR filesthat contain Java class files (andassociated resources)

Page 20: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

39

Le stato del Le stato del clientclient

HTTP non prevede persistenza

Non si possono mantenere informazioni tra una chiamata e l’altra

Non si possono identificare i clienti

Coockies

Informazioni memorizzate sul client

Permettono di gestire sessioni

HTTPSession

Gestito automaticamente dal container

(con cookie o riscrittura delle URL)

40

CookieCookie

Stringhe di caratteri restituite dal server insieme alle risposte

Inserite nell’header del messaggio HTTP in risposta

Vengono memorizzati

nome, valore e host di provenienza

tempo di validita’ (fino a maxCookie)

Page 21: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

41

User-server interaction: cookiesUser-server interaction: cookies

server sends “cookie” to client

in response mst

Set-cookie: 1678453

client presents cookie in later

requests

cookie: 1678453

server matches presented-

cookie with server-stored info

authentication

remembering userpreferences, previouschoices

client server

usual http request msg

usual http response +Set-cookie: #

usual http request msgcookie: #

usual http response msg

usual http request msgcookie: #

usual http response msg

cookie-spectific

action

cookie-spectific

action

42

Definire un Definire un CookieCookie

// creare un cookie

Cookie nomeCookie = new Cookie("nome", valore);

// definire gli attributi

nomeCookie.setComment("Questo e’ un commento " +

"al cookie.");

nomeCookie.maxAge(nSecondi);

// inviare il cookie con la risposta

// NOTA: deve essere aggiunta alla risposta prima

// dei dati (prima di invocare getWriter)

response.add(nomeCookie);

Page 22: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

43

Recuperare un Recuperare un CookieCookie

Cookie[] cookies = request.getCookies();

for(i=0; i < cookies.length; i++) {

Cookie thisCookie = cookie[i];

if (thisCookie.getName().equals("nome") &&

thisCookie.getValue().equals(valore)) {

...

// cancella il cookie mettendo l'eta' a 0

thisCookie.setMaxAge(0);

}

}

44

Le sessioni JavaLe sessioni Java

Un oggetto della classe HTTPSession crea una sessione per

un cliente-browser

Una sessione permette di avere memoria durante una serie di

chiamate dallo stesso browser

Le sessioni sono condivise da tutte le servlet usate dallo stesso

cliente

Le azioni possibili sono

Creare/ottenere una sessione

Memorizzare/recuperare i dati

Invalidare una sessione (non necessario)

Page 23: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

45

Ottenere una sessioneOttenere una sessione

Dalla richiesta e’ possibile estrarre una sessione

se l'argomento e' true viene creata se non esiste

deve essere ottenuta prima di scrivere i dati in risposta (prima di invocare

getWriter)

HttpSession session = request.getSession(true);

...

out = response.getWriter();

46

Leggere/scrivere datiLeggere/scrivere dati

I dati che si possono memorizzare sono

Identificatore di sessione

Coppie nome/valore => String/Object

I nomi vanno scelti in modo da evitare conflitti dovuti alle

condivisioni

Es: nomeServlet.nome

L’API prevede i metodi

public void setAttribute(java.lang.String name,java.lang.Object value)

public java.lang.ObjectgetAttribute(java.lang.String name)

// restituisce null se non esiste

Page 24: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

47

Un esempio Un esempio HTTPSessionHTTPSession1) // Using sessions.

2) import javax.servlet.*;

3) import javax.servlet.http.*;

4) import java.io.*;

5) public class SessionExample extends HttpServlet {

6) private final static String names[] =

7) { "C", "C++", "Java", "Visual Basic 6" };

8) private final static String isbn[] = {

9) "0-13-226119-7", "0-13-528910-6",

10) "0-13-012507-5", "0-13-456955-5" };

11) private String getISBN( String lang ) {

12) for ( int i = 0; i < names.length; ++i )

13) if ( lang.equals( names[ i ] ) )

14) return isbn[ i ];

15) return ""; // no matching string found

16) }

48

17) public void doPost(HttpServletRequest request,

18) HttpServletResponse response )

19) throws ServletException, IOException {

20) PrintWriter output;

21) String language = request.getParameter( "lang" );

22) // Get the user's session object.

23) // Create a session (true) if one does not exist.

24) HttpSession session = request.getSession( true );

25) // add a value for user's choice to session

26) session.setAttribute( language, getISBN( language ) );

27) response.setContentType( "text/html" );

28) output = response.getWriter();

29) // send HTML page to client

30) output.println( "<HTML><HEAD><TITLE>" );

31) output.println( "Sessions" );

32) output.println( "</TITLE></HEAD><BODY>" );

33) output.println( "<P>Welcome to Sessions!</P>" );

34) output.println( "<P>" );

35) output.println( language );

36) output.println( " is a great language.</P>" );

37) output.println( "</BODY></HTML>" );

38) output.close(); // close stream

39) }

Page 25: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

49

40) public void doGet( HttpServletRequest request,

41) HttpServletResponse response )

42) throws ServletException, IOException {

43) PrintWriter output;

44) // Get the user's session object.

45) // Don't create a session (false) if one does not exist.

46) HttpSession session = request.getSession( false );

47) // get names of session object's values

48) java.util.Enumeration valueNames;

49) if ( session != null )

50) valueNames = session.getAttributeNames();

51) else

52) valueNames = null;

53) response.setContentType( "text/html" );

54) output = response.getWriter();

55) output.println( "<HTML><HEAD><TITLE>" );

56) output.println( "Sessions II" );

57) output.println( "</TITLE></HEAD><BODY>" );

50

58) if ( valueNames != null && valueNames.hasMoreElements() ) {

59) output.println( "<H1>Recommendations</H1>" );

60) // get value for each name in valueNames

61) for ( ; valueNames.hasMoreElements(); ) {

62) String name = (String) valueNames.nextElement();

63) String value = (String) session.getAttribute( name );

64) output.println(

65) name + " How to Program. " +

66) "ISBN#: " + value + "<BR>" );

67) }

68) }

69) else {

70) output.println( "<H1>No Recommendations</H1>" );

71) output.println( "You did not select a language" );

72) }

73) output.println( "</BODY></HTML>" );

74) output.close(); // close stream

75) }

76) }

Page 26: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

51

Riscrittura Riscrittura delldell’’URLURL

Se un browser non ammette i cookie si ricorre alla riscrittura

dell’URL

Ogni link della risposta deve essere riscritto includendo l’ID della

sessione

Si usano i metodipublic java.lang.String encodeURL(java.lang.String

url)

public java.lang.String redirectURL(java.lang.String

url)

La getSession provvede a generare correttamente una

sessione da una successiva richiesta

52

ComunicazioneComunicazione

Una servlet puo’ comunicare

Con una chiamata HTTP (invocazione URL ad altre risorse – servlet,

JSP, CGI)

Attraverso un oggetto RequestDispatcher

Scambiandosi i reference agli oggetti con HTTPSession

Page 27: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

53

Ottenere un Ottenere un dispatcherdispatcher

Si usa la getRequestDispatcher

Parametro una URL valida per la risorsa – HTML, JSP, Servlet

Eventulamente restituisce null

// Get the dispatcher;

// it gets the main page to the user

RequestDispatcher dispatcher =

getServletContext().getRequestDispatcher(

"/bookstore/bookstore.html");

...

54

Usare un Usare un dispatcherdispatcher

Si puo’ delegare la risposta a un’altra risorsa – Servlet, HTML,

JSP

public void forward(ServletRequest request,

ServletResponse response)

throws ServletException,

java.io.IOException

Si puo’ inserire nella risposta quella dell’altra risorsa

public void include(ServletRequest request,

ServletResponse response)

throws ServletException,

java.io.IOException

Page 28: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

55

S1ID=#

Sessione

S2

Cookie(ID,#)

Cookie(ID,#)

Cookie(ID,#)

56

Java JSPJava JSP

Flavio De Paoli

Page 29: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

57

OutlineOutline

Cos’e’ una JSP

Gli elementi che compongono una JSP

JSP e JavaBeans

58

Java Server Java Server PagesPages

Tecnologia per la creazione di applicazioni web

Specifica l’interazione tra un contenitore/server ed un insieme di “pagine” che

presentano informazioni all’utente

Le pagine sono costituite da tag tradizionali (HTML, XML, WML, …) e da tag

applicativi che controllano la generazione del contenuto

Rispetto ai servlet, facilitano la separazione tra logica applicativa e

presentazione

Analogo alla tecnologia Microsoft Active Server Page (ASP)

Differenze

una Java Server Page chiama un programma Java eseguito sul Web server

una Active Server Page contiene uno script VBScript o JScript

Page 30: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

59

Java Server Java Server PagesPages

JavaServer Pages (JSP) separano la parte dinamica delle pagine dal template

HTML statico

Il codice JSP va incluso in tag speciali, delimitati da "<%" e "%>".

Esempio

una pagina che visualizza

“Grazie per la scelta di Internet Guida Pratica”

quando l’utente si connette all’URLhttp://host/OrderConfirmation.jsp?title=Internet+Guida+Pratica

contieneGrazie per la scelta di <I><%= request.getParameter("title") %>

</I>

La pagina viene convertita automaticamente in una servlet java la prima volta

che viene richiesta

60

JSP: esempioJSP: esempio

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD><TITLE>Uso di JSP</TITLE><LINK REL=STYLESHEET HREF="My-Style-Sheet.css" TYPE="text/css"></HEAD><BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000"><CENTER><TABLE BORDER=5 BGCOLOR="#EF8429"> <TR><TH CLASS="TITLE"> Using JavaServer Pages</TABLE></CENTER><P>Some dynamic content created using various JSP mechanisms:<UL> <LI><B>Expression.</B><BR> Your hostname: <%= request.getRemoteHost() %>. <LI><B>Scriptlet.</B><BR> <% out.println("Attached GET data: " + request.getQueryString()); %> <LI><B>Declaration (plus expression).</B><BR> <%! private int accessCount = 0; %> Accesses to page since server reboot: <%= ++accessCount %> <LI><B>Directive (plus expression).</B><BR> <%@ page import = "java.util.*" %> Current date: <%= new Date() %></UL></BODY></HTML>

Page 31: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

61

Il risultatoIl risultato

62

Come Come funzionafunziona

In entrambe le modalità, il file JSP viene prima compilato

la versione compilata viene tenuta in memoria per rendere più

veloce una successiva richiesta della pagina

Page 32: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

63

Ciclo di vita delle applicazioni JSPCiclo di vita delle applicazioni JSP

Client

WebServer

ServletContainer

Servlet

JSP

JSP compiler

64

Gli elementi di una JSPGli elementi di una JSP

Template textLe parti statiche della pagina

Commenti<%-- questo e’ un commento -->

Direttive<%@ direttiva ... di compilazione %>

AzioniIn XML: <tag attributes> body </tag>

Elementi di scriptingIstruzioni nel linguaggio specificato nelle direttive

Sono di tre tipi: scriplet, declaration, expression

Page 33: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

65

DirettiveDirettive

page

Liste di attributi/valore

Valgono per la pagina in cui sono inseriti<%@ page import="java.util.*" buffer="16k" %><%@ page import=“java.math.*, java.util.*” %><%@ page session=“false” %>

include

Include in compilazione pagine HTML o JSP<%@ include file="copyright.html" %>

taglib

Dichiara tag definiti dall’utente implementando opportune classi<%@ taglib uri=“TableTagLibrary” prefix=“table”%><table:loop> … </table:loop>

66

Direttive JSPDirettive JSP

forward

determina l’invio della richiesta corrente, eventualmente aggiornata con ulteriori

parametri, all’URL indicata<jsp:forward page=“login.jsp” %>

<jsp:param name=“username” value=“user” />

<jsp:param name=“password” value=“pass” />

</jsp:forward>

include

invia dinamicamente la richiesta ad una data URL e ne include il risultato<jsp:include page=“login.jsp” %>

useBean

localizza ed istanzia (se necessario) un javaBean nel contesto specificato

Il contesto può essereLa pagina, la richiesta, la sessione, l’applicazione

<jsp:useBean id=“cart” scope=“session” class=“ShoppingCart” />

Page 34: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

67

Elementi di Elementi di scriptingscripting

Declaration <%! declaration [declaration] ...%>

Variabili o metodi usati nella pagina<%! int[] v= new int[10]; %>

Le var valgono per la durata della servlet

Expression <%= expression %>

Una espressione nel linguaggio di scripting che viene valutata e sostituita con ilrisultato<p>La radice di 2 vale <%= Math.sqrt(2.0) %></p>

Scriptlet <% codice %>

Frammenti di codice che controllano la generazione della pagina,valutati alla richiesta<table><% for (int i=0; i< v.length; i++) { %>

<tr><td> <%= v[i] %></td></tr><% } %></table>

Le variabili valgono per la singola esecuzione

Ciò che viene scritto sullo stream di output sostituisce lo scriptlet

68

Elementi di Elementi di scriptingscripting

Linguaggio di script ha lo scopo di

interagire con oggetti java

gestire le eccezioni java

Oggetti impliciti

Sono gli elementi delle servlet (sono 9)request

response

out

page

pageContext

session

application

config

exception

Page 35: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

69

Oggetti e loro Oggetti e loro ““scopescope””

Gli oggetti possono essere creati

implicitamente usando le direttive JSP

esplicitamente con le azioni

direttamente usando uno script (raro)

Gli oggetti hanno un attributo che ne definisce lo “scope”

70

SessioniSessioni

Accede ad un

oggetto

HTTPSession

Esempi

Page 36: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

71

Javaserver ArchitectureJavaserver Architecture

72

EsecuzioneEsecuzione didi JSP JSP

BrowserJSP

Pages

Beans

Beans

Database

Il client richiede via HTTP un file .JSP

Il file .JSP viene interpretato e accede a componenti lato-server

(Java Beans, Servlet) che generano contenuti dinamici

il risultato viene spedito al client sotto forma di pagine HTML

Page 37: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

73

la richiesta viene inviata ad un Java Servlet che genera i dati dinamici richiesti

dall’utente

Il Servlet successivamente richiama un file .jsp, che si occupa di formattare in

HTML i risultati e inviarli all’utente

Browser

JSP

Pages

JDBC

Beans

DatabaseServlet

JSP e JSP e ServletServlet

74

JSP e JDBCJSP e JDBC

Page 38: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

75

AzioniAzioni

Forward

Delega la risposta<jsp:forward page="somePage.jsp" /><jsp:forward page="<%= somePage %>" ><jsp:param name="name1" value="value1" /><jsp:param name="name2" value="value2" />

</jsp:forward>

Include

Include la risposta<jsp:include page="shoppingcart.jsp" flush="true"/>

76

JavaBeanJavaBean

Un bean è una classe che segue regole precise

Deve avere costruttori senza parametri

Dovrebbe avere campi (property) private

I metodi di accesso ai campi (property) sono set/get

setXxx e getXxx/isXxx (xxx = property)

class Libro {

private String titolo;

private boolean disponibile;

void setTitolo(String t) ...;

String getTitolo() ...;

void setDisponivile(boolean b) ...;

boolean isDisponibile() ...;

Page 39: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

77

JSP e JSP e JavaBeanJavaBean

Azioni per utilizzare un bean

Accedere ad un bean (inizializzazione)<jsp:useBean id="user" class="com.jguru.Person"

scope="session" />

<jsp:useBean id="user" class="com.jguru.Person"

scope="session">

<% user.setDate(DateFormat.getDateInstance(

).format(new Date())); //etc.. %>

</jsp:useBean>

Accedere alle proprietà<jsp:getProperty name="user" property="name" />

<jsp:setProperty name="user" property="name"

value="jGuru" />

<jsp:setProperty name="user" property="name"

value="<%=expression %>" />

78

Accesso ad un Accesso ad un JavaBeanJavaBean

<jsp:useBean id="Attore" class="MyThread" scope="session"type="Thread"/>

Lo scope determina la vita del beanpage e’ lo scope di default: viene messo in pageContext ed acceduto congetAttrubute

request: viene messo in ServletRequest ed acceduto congetAttrubute

session e application: se non esiste un bean con lo stesso id, neviene creato uno nuovo

Il type permette di assegnargli una superclasse

Al posto della classe si puo’ usare il nome del beanbeanName="nome"nome e’ la classe o un file serializzato

Page 40: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

79

Architettura MVC1Architettura MVC1

80

Architettura MVC2Architettura MVC2

Page 41: Outline - Università degli Studi di Milano-BicoccaMiddle East 5.12 million Europe 190.91 million Asia/Pacific 187.24 million Africa 6.31 million World Total 605.60 million 6 HTTP/CGI

81

Counter.jspCounter.jsp1) <%@ page import="CounterBean" %>

2) <jsp:useBean id="session_counter" class="CounterBean"scope="session" />

3) <jsp:useBean id="app_counter" class="CounterBean"

scope="application" />

4) <% session_counter.increaseCount();

5) synchronized(page) { app_counter.increaseCount(); }

6) %>

7) <h3>

8) Number of accesses within this session:

9) <jsp:getProperty name="session_counter" property="count" />

10) </h3>

11) <p>

12) <h3>

13) Total number of accesses:

14) <% synchronized(page) { %>

15) <jsp:getProperty name="app_counter" property="count" />

16) <% } %>

17) </h3>

82

CounterBeanCounterBean.java.java

public class CounterBean {

//declare a integer for the counter

int count;

public int getCount() {

//return count

return count;

}

public void increaseCount() {

//increment count;

count++;

}

}