View
6
Download
0
Category
Preview:
Citation preview
1
ApplicazioniApplicazioni Web Web
Flavio De Paoli
depaoli@disco.unimib.it
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
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
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
7
Architettura web Architettura web appapp
Internet
HTTPserver
CGIHTTP
8
ArchitetturaArchitettura CGI 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>
...
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
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
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)
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
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
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
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
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
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" );
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;
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>
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
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
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)
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)
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);
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)
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
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) }
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) }
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
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
55
S1ID=#
Sessione
S2
Cookie(ID,#)
Cookie(ID,#)
Cookie(ID,#)
56
Java JSPJava JSP
Flavio De Paoli
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
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>
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
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
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” />
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
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
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
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
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() ...;
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
79
Architettura MVC1Architettura MVC1
80
Architettura MVC2Architettura MVC2
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++;
}
}
Recommended