Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per...
-
Upload
margherita-corradi -
Category
Documents
-
view
223 -
download
1
Transcript of Laboratorio di Servizi Web - JSP - Ardissono 1 Servlet e Java Server Pages Servlet sono ottime per...
Laboratorio di Servizi Web - JSP - Ardissono
1
Servlet e Java Server Pages
• Servlet sono ottime per programmare applicazioni Server side complesse, ma poco adatte a generazione di interfaccia utente
• JSP introdotte per facilitare stesura di interfaccia utente– permettono scrittura diretta di codice HTML,
anzichè richiedere inserimento di codice in PrintWriter, riga per riga
– permettono di inserire codice java (scriptlets) per implementare semplici operazioni
Laboratorio di Servizi Web - JSP - Ardissono
2
Java Server Pages - I
• Volte a semplificare creazione e gestione di pagine dinamiche (sintatticamente simili a PHP e ASP)
• Combinano markup statico (HTML) con tag di scripting
<%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> </body></html>
data.jsp
Salvare temporaneamente data.jsp a root di contesto (swebi)
http:130.192.241.1:10000/swebi/data.jsp
Laboratorio di Servizi Web - JSP - Ardissono
3
Java Server Pages - II
• Basate su tecnologia Servlet • Da JSP Web Container genera Servlet S equivalente
– S contiene package e imports necessari
– S implementa metodo doGet/doPost che crea pagina di output di JSP (usa PrintWriter, definisce formato di output, scrive su PrintWriter per generare codice HTML statico, permette invocazione di metodi java)
• Generazione e compilazione avvengono a primo richiamo di JSP da parte di client (translation time)
• Poi ogni richiamo di JSP causa esecuzione di S (run time)
Laboratorio di Servizi Web - JSP - Ardissono
4
Translation time e run time
JSP<JSP tags><java code>Web
browser
JSP<JSP tags><java code>
Prima richiesta
Risposta generata
Servlet
Traduzione
JSP<JSP tags><java code>
usa
usa
Richieste successive
Laboratorio di Servizi Web - JSP - Ardissono
5
Espansione di JSP • Web Container implementa interfaccia
javax.servlet.jsp.HttpJspPage• Da pagina JSP Web Container genera Servlet che
estende implementazione di HttpJspPage• javax.servlet.jsp.HttpJspPage
– public void jspInit(): metodo invocato da Web Container a tempo di inizializzazione di servlet generata
– public void jspDestroy(): invocato a tempo di distruzione di servlet
– public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException: ad ogni HTTP request
Laboratorio di Servizi Web - JSP - Ardissono
6
Struttura di una JSP
• A metà tra pagina statica e Servlet. Contiene– codice java racchiuso tra <% e %>
– tag HTML e XML-like
– testo, ...
• Categorie di JSP tag– JSP Directives
– Scripting elements
– Actions <%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> </body></html> data.jsp
Laboratorio di Servizi Web - JSP - Ardissono
7
JSP directives
• <%@ directiveName attribute=“value” attribute=“value” ... %>– Es: <%@page import="java.util.Date"%>
• istruzioni che danno specifiche per generazione di codice effettuata da Web Container quando crea Servlet
• non producono output per generazione di risposta a invocazione di JSP
• influenzano intera pagina JSP (non altre pagine di applicazione)
• Directives: page, include, taglib
Laboratorio di Servizi Web - JSP - Ardissono
8
JSP directives - page • <%@ page attribute=“val” attribute=“val” ... %>
– Es: <%@page import="java.util.Date,java.rmi.*” session=“true” isThreadSafe=“true” %>
• JSP può contenere + page directives ma ciascun attributo (eccetto import) può comparire al più una volta
• Alcuni attributi (vd libro per gli altri)
– import: specifica classi da importare per esecuzine di JSP– session: specifica se pagina partecipa ad HttpSession
• Se session=“true” pagina può usare oggetto implicito session per accedere a dati di sessione utente
• se session=“false” non si gestisce sessione utente
• default: session=“true”
– errorPage: specifica URL di pagina JSP di applicazione invocata in caso di eccezioni
Laboratorio di Servizi Web - JSP - Ardissono
9
JSP directives - include - I
• <%@ include file=“fileName” %>• specifica che durante generazione di Servlet il
Web Container deve includere risorsa specificata• fileName: path relativo a contesto di applicazione
<%@page import="java.util.Date"%><html> <body> The current time is <%= (new Date()).toString() %> <%@ include file=”JSP-EX/prova.html" %> </body></html> swebi
JSP-EXsrc WEB-INF
Laboratorio di Servizi Web - JSP - Ardissono
10
prova.html
Laboratorio di Servizi Web - JSP - Ardissono
11
JSP directives - include - II
• Contenuto di file incluso è analizzato sintatticamente a translation time
• si possono includere vari tipi di file: html, jsp, …– Es: esempio.jsp contiene il seguente directive:
<@% include file=“JSP-EX/inclusa.jsp” %>
– inclusa.jsp contiene codice<%@page import="java.util.Date"%>
<%= “data odierna: “ + new Date() %>
• se file modificato, non è garantito che Web Container ricompili automaticamente JSP
Laboratorio di Servizi Web - JSP - Ardissono
12
JSP directives - include - III
Servlet generata a partire da JSP (circa…)
public class esempio extends javax.servlet.jsp.HttpJspPage ... {public void _jspService(HttpServletRequest request,
HttpServletResponse response) throws … {...out.write(“<html>\r\n >head>\r\n …..out.print(“data odierna: “ + new Date());…out.close(); }
...}
Laboratorio di Servizi Web - JSP - Ardissono
13
NB: packaging di JSP
• Potete organizzare le JSP in directory sotto vostro contesto di applicazione ma– directory deve essere leggibile e attraversabile
da tutti– la prima JSP invocata per accedere ad
applicazione deve stare sotto swebi (se no web container inserisce JSP-EX in path relativi)
swebi
JSP-EXsrc WEB-INF
Laboratorio di Servizi Web - JSP - Ardissono
14
JSP directives - taglib (cenni)
• <%@ taglib uri=“tagLibraryURI” prefix=“tagPrefix” %>
• • Directive taglib permette che pagina JSP utilizzi
tag extensions (custom tags)• tag extensions: si definiscono tag associati a
codice java• directive taglib specifica tag library contenente
codice java compilato che definisce tag da usare
URI di descrittoredi libreria di tagPrefisso da usare per
identificare tag library<myTag:tagname … />
Laboratorio di Servizi Web - JSP - Ardissono
15
Scripting elements• Permettono di inserire codice java in pagina JSP
– dichiarazioni di variabili– dichiarazioni di metodi– scriptlets: blocchi di codice eseguiti quando client
richiede pagina JSP– espressioni
<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>
Dichiarazioni divariabili e metodi
EspressioneEspressione
Laboratorio di Servizi Web - JSP - Ardissono
16
Scripting elements: dichiarazioni di variabili e metodi
• <% dichiarazioni di variabili e metodi java %>• inserite come elementi globali in Servlet generata• variabili inizializzate quando Servlet inizializzata• non producono output
<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>
Dichiarazioni divariabili e metodi
Laboratorio di Servizi Web - JSP - Ardissono
17
Scripting elements: scriptlets - I
• <% statements java %>• blocchi di codice java eseguiti a tempo di
processamento di richiesta HTTP• possono produrre output per client• se pagina contiene più scriptlets, questi vengono
combinati e Servlet generata li contiene nell’ordine in cui appaiono in JSP
Laboratorio di Servizi Web - JSP - Ardissono
18
Scripting elements: scriptlets - II
<html><head>…</head><body> <h1> prova di scriptlet </h1> <%
for (int i=0; i<5; i++) {out.println(“ciao n. “ + i);}
%></body></html>
testScriptlet.jsp
http:130.192.241.1:10000/swebi/JSP-EX/testScriptlet.jsp
Laboratorio di Servizi Web - JSP - Ardissono
19
Scripting elements: scriptlets - III
In JSP si può inserire codice statico in scriptlets, utilizzando statement complessi (con parentesi graffe)
<html><head>…</head><body> <h1> prova di scriptlet complessa </h1> <%
if (18>= request.getParameter(“age”)) { %> Sei maggiorenne, dunque puoi votare!!
<% } else { %> Mi spiace, ancora non hai diritto di voto. <% } %></body></html> testScriptlet2.jsp
Molto similea PHP e ASP.Poco leggibile
Laboratorio di Servizi Web - JSP - Ardissono
20
Scripting elements: espressioni • <%= espressione java da valutare %>• Permettono di valutare espressioni java
(invocazione metodi, valutazione variabili) e inviare risultato a client in output stream (String)
• Sono scriptlets abbreviate
<%! int anno = 2003; public String saluta(String name) { return “Ciao, “ + name + “!!”; }%><html><head>…</head><body> <p> Ciao <%= saluta(“carissimo”)%>, siamo nel <%= anno %></body></html>
EspressioneEspressione
Laboratorio di Servizi Web - JSP - Ardissono
21
Scriptlets e JavaBeans • Utile per applicazioni molto semplici• Se si inserisce troppo codice in JSP
– pagine risultano difficili da leggere– si perde separazione tra aspetti di interfaccia e di
sviluppo di logica applicativa (obiettivo iniziale di sviluppo di JSP!)
• Introdotto uso di Java Beans per separare logica applicativa da markup in JSP– JSP include markup HTML e invocazione di metodi su
bean– Java Bean implementa codice dei metodi (accesso a
DB, …) meno codice java presente in JSP
Laboratorio di Servizi Web - JSP - Ardissono
22
JSP: Architettura Model 1
Webbrowser
Webserver
JSP
JavaBean
Web container
Webbrowser
request
response
1
2
3
4
Laboratorio di Servizi Web - JSP - Ardissono
23
JSP e java beans – acquisizione dati da form
• In JSP si può dichiarare che si utilizza istanza di classe (JavaBean) per– salvare parametri di richieste HTTP– recuperare valore di tali parametri quando serve
• dati (parametri) acquisiti attraverso form in JSP vengono “automaticamente” salvati in properties del bean usato da JSP
• bean serve come raccoglitore di dati acquisiti da form
Laboratorio di Servizi Web - JSP - Ardissono
24
Esempio - form
parametro “login”
parametro “tipoInfo”: no, nomi, cc
Invocazione di JSP cheusa javaBean (SimpleBean.java)
Laboratorio di Servizi Web - JSP - Ardissono
25
Esempio - Estratto di JSP
<jsp:useBean id=“sBean" scope="page" class="application.other.SimpleBean"/>
<jsp:setProperty name=“sBean" property="*"/><HTML><HEAD>...</HEAD><BODY> …<p><center> Ciao<jsp:getProperty name=“sBean" property="login"/> !</center></p><p> Hai richiesto la seguente operazione: <jsp:getProperty name=“sBean" property="tipoInfo"/></p></BODY></HTML>
Dichiarazione bean usato
Recupera valore property per visualizzaz
Visualizza codice interno di operaz scelta
Salva valore dei parametri di richiesta HTTP con nome = property di bean
Laboratorio di Servizi Web - JSP - Ardissono
26
Esempio - Pagina visualizzata
Ciao liliana!
Hai richiesto la seguente operazione: nomi
Laboratorio di Servizi Web - JSP - Ardissono
27
Esempio : SimpleBean.javapackage …;public class SimpleBean { private String login;
private String tipoInfo; public SimpleBean() { }
public void setLogin(String login) {this.login = login; } public String getLogin() {return login; }
public void setTipoInfo(String tipoInfo) {this.tipoInfo = tipoInfo;} public String getTipoInfo() {return tipoInfo;}}
Properties con nome checoincide con parametri di
HTTPServletRequest
• memorizza login di utente (login) e tipo di info richieste da utente (tipoInfo)
Laboratorio di Servizi Web - JSP - Ardissono
28
Commenti
<jsp:useBean id=“sBean" scope="page" class="application.other.SimpleBean"/>
<jsp:setProperty name=“sBean" property="*"/><HTML>…
Ciao<jsp:getProperty name=“sBean" property="login"/> !</center></p>…..
Bean associato a singola JSP
(scope=“page”)
Salvataggio dati utente: istanza di bean salva variabili di statolocalmente ad esecuzione di JSP (se bean vivesse per
tutta la sessione utente lo potrebbero usare anche altre JSPper recuperare variabili di stato (vd dopo)
Laboratorio di Servizi Web - JSP - Ardissono
29
JSP e java beans – logica applicativa
• Istanza di Java Bean usata anche per eseguire metodi di gestione di logica applicativa (in base a dati forniti da utente via form HTML)– definizione di metodi aggiuntivi rispetto a quelli di
gestione di properties associate ai parametri di richieste HTTP
– Tali metodi sono invocati da JSP per gestire richieste utente
Laboratorio di Servizi Web - JSP - Ardissono
30
Java Bean
• Java Bean: Classe che definisce il bean deve seguire standard di definizione dei javaBeans– getXXX di ogni proprietà XXX del javaBean, per
leggere valore di property– setXXX di ogni proprietà XXX del javaBean, per
assegnare valore a property
• Logica applicativa può essere implementata definendo metodi di setXXX() e getXXX() che effettuano i servizi necessari
Laboratorio di Servizi Web - JSP - Ardissono
31
Gestione logica applicativa - esempio esteso
Ciao franca!
Hai richiesto la seguente operazione: nomi persone(codice interno: nomi)
Valore parametro “tipoInfo”
Formato esterno tradotto da bean
(logica applicativa)
Laboratorio di Servizi Web - JSP - Ardissono
32
Estratto di JSP – esempio esteso<jsp:useBean id="opBean" scope="page"
class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD><TITLE>...</TITLE></HEAD><BODY> <h1> … </h1><p><center> Ciao<jsp:getProperty name="opBean" property="login"/> !</center></p><p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )</p></BODY></HTML>
Invocazione metodo di traduzione (logica app)
Laboratorio di Servizi Web - JSP - Ardissono
33
OPBean.java - Ipackage application.other;public class OPBean { private String login;
private String tipoInfo; public OPBean() { }
public void setLogin(String login) {… } public String getLogin() {… }
public void setTipoInfo(String tipoInfo) {… } public String getTipoInfo() {… }
Properties con nome checoincide con parametri di
HTTPServletRequest
Laboratorio di Servizi Web - JSP - Ardissono
34
OPBean.java - II
public String getOperazione() { String out = ""; if (tipoInfo.equals("no")) out = "nessuna
informazione"; else if (tipoInfo.equals("nomi")) out = "nomi
persone"; else if (tipoInfo.equals("cc")) out = "conti
correnti bancari"; else out = "tipo di informazione non gestita"; return out; }
} //chiusura bean
Logica applicativa (semplice, ma potrebbe prevedere accesso a DB)
NB: metodo usa altri valori inseriti da utente e salvati in Java Bean (variabili
di stato)
Metodo di gestionedi logica applicativa
Laboratorio di Servizi Web - JSP - Ardissono
35
JSP Standard actions • Tag predefiniti che influenzano comportamento di
JSP a run-time e risposta inviata a client. Implementati da tutti i Web Container
• Associati a codice java che viene inserito da Web Container quando genera Servlet per JSP– jsp:useBean (per invocare oggetti esterni: java bean)– jsp:setProperty (gestione properties di bean)– jsp:getProperty (interrogazione java beans)– jsp:param (parametri richieste HTTP)– jsp:include (inclusione risorse)– jsp:forward (forward a risorse)– jsp:plugin (inclusione applet)
Laboratorio di Servizi Web - JSP - Ardissono
36
Standard actions - jsp:useBean
• Sintassi<jsp:useBean id=”name" scope=”sc" bean_details />
• usata per istanziare JavaBean o per identificare istanza di bean esistente e specificare identificatore
• scope: specifica visibilità di bean– page: visibilità associata a richiesta specifica di pagina
– request: bean associato a richiesta HTTP visibile ad altre JSP incluse, o a cui si fa forward di richiesta
– session: associato a sessione utente
– application: visibile da tutte JSP di applicazione
Laboratorio di Servizi Web - JSP - Ardissono
37
Uso di istanze di Java Bean in diverse JSP
<jsp:useBean id=”name" scope=”sc" bean_details /> • Se scope di Java Bean è session, istanza di java bean
creata da prima JSP invocata e usata da altre JSP durante sessione utente
• Gestione di istanza di Java Bean– Basata su id (“name”) associato a istanza di Java Bean
– Tutte le JSP devono usare stesso id con stesso scope
– Web Container cerca istanza di bean con id richiesto nell’ambito dello scope specificato da JSP
• Se lo trova, lo usa come riferimento in esecuzione di JSP
• Altrimenti lo crea
Laboratorio di Servizi Web - JSP - Ardissono
38
jsp:useBean – esempio I<%-- informa.jsp : questo è un commento per JSP --%><jsp:useBean id="opBean" scope="page"
class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD><TITLE>...</TITLE></HEAD><BODY> <h1> … </h1><p><center> Ciao<jsp:getProperty name="opBean" property="login"/> ! Come stai?</center></p><p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )</p></BODY></HTML>
Laboratorio di Servizi Web - JSP - Ardissono
39
jsp:useBean – esempio II<%-- informa.jsp : questo è un commento per JSP --%>
<jsp:useBean id="opBean" scope="page" class="application.other.OPBean"/>
<jsp:setProperty name="opBean" property="*"/>
<HTML>
<HEAD><TITLE>...</TITLE></HEAD>
<BODY>
<h1> … </h1>
...
Dichiarazione di bean di nome opBean con proprietà di visibilità
Salvo valore di tutti i parametri dirichiesta HTTP con nome = property di bean
Laboratorio di Servizi Web - JSP - Ardissono
40
jsp:useBean – esempio III...
<p><center>
Ciao
<jsp:getProperty name="opBean" property="login"/> ! Come stai?
</center></p>
<p>
Hai richiesto la seguente operazione:
<jsp:getProperty name="opBean" property="operazione"/>
(codice interno <jsp:getProperty name="opBean" property="tipoInfo"/> )
</p>
</BODY></HTML>
Recupero valore di property “login”di bean (recupero parametro di richiesta…)
NB: “operazione” non è parametro di richiestaInvoco metodo di bean che “gestisce” richiesta
Laboratorio di Servizi Web - JSP - Ardissono
41
Standard actions - jsp:setProperty • <jsp:setProperty name=”beanName" property_details />• setta properties (semplici o indexate - array) di bean• per settare proprietà di bean con nome = a parametri di
richiesta HTTP– <jsp:setProperty name=”beanName" property=“*” />
• per settare properties specifiche (nome=parametro)– <jsp:setProperty name=”beanName" property=“propName”
/>
• property con nome da parametri di richiesta HTTP– <jsp:setProperty name=”beanName" property=“propName”
param=“paramName” />
• … vd libro
Laboratorio di Servizi Web - JSP - Ardissono
42
Standard actions - jsp:getProperty
• <jsp:getProperty name=”beanName”
property=“prName” />• recupera valore di property di bean (convertendolo in
String - toString(), valueOf())• per recuperare valori di richieste salvate in bean• per invocare metodi di gestione di logica applicativa
– <jsp:getProperty name="opBean"
property="operazione"/>
– invoca metodo getOperazione() di bean
Se istanza di Java Bean ha scope più ampio di “page”, JSP può recuperare dati memorizzati in
precedenti passi di interazione con utente
Laboratorio di Servizi Web - JSP - Ardissono
43
Standard actions - jsp:include - I
• <jsp:include page=”URL" flush=“true” />• <jsp:include page=”URL" flush=“true” >
<jsp:param name=“parName” value=“parValue” /> </jsp:include>
• permette inserimento di risorsa statica o dinamica specificata da URL in JSP
• inclusione risorsa effettuato a request processing time meno efficiente di directive include, ma adatto a includere risorse che cambiano spesso
• NB: Buffer usato da printWriter per mantenere dati temporanei da inviare a browser (si può scegliere dimensione minima di buffer da imporre a Web Container, che può allocare un buffer di tale dimensione o più grande)
Permette specifica di ulterioriparametri rispetto a richiesta HTTP originale
Laboratorio di Servizi Web - JSP - Ardissono
44
Standard actions - jsp:include - II
• pagina inclusa può accedere a JSPWriter object, non può settare cookies o headers
• flush: specifica se buffer di output deve essere ripulito prima di includere la pagina o meno
• flush: default=false. Se true, buffer “flushed” prima di inclusione di pagina ( non si può fare forward ad altre risorse o usare error pages)
• jsp:include directive include– con directive include, risorsa inclusa a translation time e
web container fa compilare la pagina ottenuta– con jsp:include inclusione fatta a run time, no precedente
compilazione. Adatto a includere Servlet java
Laboratorio di Servizi Web - JSP - Ardissono
45
Standard actions - jsp:param
• <jsp:param name=”parName" value=“parValue” />
• usato in jsp:include e jsp:forward per invocare risorse aggiungendo parametri rispetto a quelli di HttpServletRequest originale
• specifica nuovi attributi come coppie <chiave, valore>
Laboratorio di Servizi Web - JSP - Ardissono
46
Esempio di uso di java bean • Sviluppiamo applicazione “Prova” che
– tramite form HTML permette a utente di richiedere 3 servizi: nessuna informazione (no), nomi persone (nomi) o dati su conti correnti bancari (cc)
– Form HTML invoca (post) JSP di gestione dei servizi– JSP invoca bean per gestire il servizio richiesto,
passando scelta utente come parametro, e raccoglie risultato da visualizzare in pagina per browser utente
– bean traduce richiesta utente da codice interno a esterno• Es: da cc a conti correnti bancari, da no a nessuna
informazione
– NB: metodi di bean potrebbero essere più complessi, e.g., accesso a DB per recupero dati
Laboratorio di Servizi Web - JSP - Ardissono
47
Invocazione JSP da form HTML
<FORM METHOD="POST" ACTION="informa.jsp">
parametro “login”
parametro “tipoInfo”: no, nomi, cc
Laboratorio di Servizi Web - JSP - Ardissono
48
Laboratorio di Servizi Web - JSP - Ardissono
49
Esempio di inclusione di Servlet <jsp:useBean id="opBean" scope="page" class="application.other.OPBean"/><jsp:setProperty name="opBean" property="*"/><HTML><HEAD> … </HEAD><BODY...<p><center>Ciao <jsp:getProperty name="opBean" property="login"/>! Come stai?</center></p>
<p> Hai richiesto la seguente operazione:<jsp:getProperty name="opBean" property="operazione"/>(codice interno: <jsp:getProperty name="opBean" property="tipoInfo"/> )</p>
<p>Ecco il risultato: sto per invocare la servlet application.servlets.Informazioni.java!!<jsp:include page="servlet/info" flush="true" /> </p>
<CENTER><INPUT TYPE="Submit" NAME="btnSubmit" VALUE="Submit request"></CENTER></FORM></BODY></HTML>
Include senza parametri extra
Laboratorio di Servizi Web - JSP - Ardissono
50
Standard actions - jsp:forward - I
• <jsp:forward page=”URL” />• <jsp:forward page=”URL">
<jsp:param name=“parName” value=“parValue” /> </jsp:forward>
• permette invio di richiesta ad altra risorsa di applicazione (pagina HTML, JSP, Servlet)
• flusso di esecuzione passa a risorsa invocata• buffer viene ripulito prima di forward (non si fa
merge di output delle due risorse)• equivalente a metodo forward() di
javax.servlet.RequestDispatcher
Permette specifica di ulterioriparametri rispetto a richiesta HTTP originale
Laboratorio di Servizi Web - JSP - Ardissono
51
Standard actions - jsp:forward - II
<HTML><HEAD>...</HEAD><BODY>...<% if (request.getParameter("login").equals(“raf”)) %><jsp:forward page=“wellcomeRAF.jsp” /><% } else %><%@ include file=“completeRegistration.html” %><% } %></BODY></HTML>
Laboratorio di Servizi Web - JSP - Ardissono
52
Standard actions - jsp:plugin
• Permette di includere java applet in pagine generate da JSP
• vd libro
Laboratorio di Servizi Web - JSP - Ardissono
53
Oggetti Java impliciti
• request: rappresenta oggetto HttpServletRequest che ha originato invocazione di metodo service(). Visibilità: a livello di singola richiesta HTTP
• response: oggetto HttpServletResponse che rappresenta risposta a richiesta HTTP. Visibilità: a livello di pagina
• session: oggetto HttpSession generato da connessione di client. Visibilità: a livello di sessione
• config: oggetto ServletConfig associato a JSP
queste variabili (e altre) possono essere usate esplicitamente in JSP perchè create a translation time
(anche ASP etc. hanno “request”, “session”, …)
Laboratorio di Servizi Web - JSP - Ardissono
54
Commenti
• JSP adatte a sviluppo di interfaccia utente di applicazioni– facilitano specifica di layout di pagine
– nascondono in parte dettagli implementativi di applicazioni web
• JSP non adatte a gestione di logica applicativa– inserimento di troppo codice java in pagina JSP causa
poca leggibilità del codice
– compilazione di pagine evidenzia errori in codice di pagine in modo indiretto (compilazione avviene su Servlet espansa, non su JSP) difficile fare debugging
Laboratorio di Servizi Web - JSP - Ardissono
55
Architettura Model 1 – page centric
• In architettura Model 1 interfaccia utente composta di una o più JSP– utente carica JSP home page di servizio– esecuzione JSP invoca metodi di JavaBean per
generare parti dinamiche di pagina da visualizzare su browser utente
– pagina visualizzata include bottoni e link per continuare interazione
– a seconda di azione utente, JSP opportuna viene invocata
– continua in modo simile
Laboratorio di Servizi Web - JSP - Ardissono
56
Model 2
• JSP hanno RequestDispatcher e offrono istruzioni – include per includere risorse (pagina HTML, Servlet)
– forward per delegare risorse a gestione richiesta HTTP
• Per sviluppo di applicazioni complesse, meglio combinare JSP e Servlet (e pagine statiche)– JSP e pagine statiche per gestione interazione con utente
– Servlet per gestione di attività di backend
– combinazione basata su pattern Model View Controller (Model 2)
• http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html
Laboratorio di Servizi Web - JSP - Ardissono
57
JSP: Architettura Model 2
Webserver
(controller)Servlet
Web container
request
response
1
3
5 (view)JSP
(Model)JavaBean
2
instantiate
4
Laboratorio di Servizi Web - JSP - Ardissono
58
Architettura Model 2
• Servlets per gestire logica applicativa• JSP per generare presentation layer• Servlet
– intercetta richieste utente (post, …)
– in base a valore di parametri di richiesta decide a quale JSP forwardare richiesta
– crea java beans necessari a JSP
• JSP– recupera oggetti e beans creati da Servlet
– estrae da oggetti contenuto dinamico da visualizzare in pagina da inviare a browser utente
Laboratorio di Servizi Web - JSP - Ardissono
59
Architettura Model 2 – Esempio
• Music without borders: negozio elettronico
• Interfaccia utente realizzata con diverse JSP che generano porzioni diverse di interfaccia – es: pagina principale include JSP di
visualizzazione di carrello spesa– pagina di checkout (chiusura interazione)
• Servlet gestisce flusso di interazione scegliendo JSP a cui forwardare richieste utente ad ogni passo
Laboratorio di Servizi Web - JSP - Ardissono
60
Music without borders – pagina principale - I
Laboratorio di Servizi Web - JSP - Ardissono
61
<%@ page session="true" %><html><head><title>Music Without Borders</title></head><body><font face="Times New Roman,Times" size="+3">Music Without Borders</font><hr><p><center><form name="shoppingForm" action="/examples/servlet/ShoppingServlet"
method="POST"> <b>CD:</b> <select name=CD>
<option>Yuan | The Guo Brothers | China | $14.95</option> … <option>Ibuki | Kodo | Japan | $13.95</option> </select>
<b>Quantity: </b><input type="text" name="qty" SIZE="3" value=1><input type="hidden" name="action" value="ADD"><input type="submit" name="Submit" value="Add to Cart">
</form></center></p> <jsp:include page="Cart.jsp" flush="true"/> </body></html>
Include JSP di carrello spesa:visualizza prodotti già scelti
Music without borders – pagina principale - II
Laboratorio di Servizi Web - JSP - Ardissono
62
Music without borders – pagina principale - III
Laboratorio di Servizi Web - JSP - Ardissono
63
<%@ page session="true" import="java.util.*, shopping.CD" %><% Vector buylist = (Vector) session.getValue("shopping.shoppingcart"); if (buylist != null && (buylist.size() > 0)) { %>
<center><table border="0" cellpadding="0" width="100%" bgcolor="#FFFFFF"><tr> <td><b>ALBUM</b></td> <td><b>ARTIST</b></td> …
<td><b>QUANTITY</b></td> <td></td> </tr><% for (int index=0; index < buylist.size();index++) {
CD anOrder = (CD) buylist.elementAt(index); %><tr> <td><b> <%= anOrder.getAlbum() %> </b></td> ….
<td><b> <%= anOrder.getQuantity() %> </b></td> <td><form name="deleteForm“
action="/examples/servlet/ShoppingServlet“ method="POST"> <input type="submit" value="Delete">
<input type="hidden" name= "delindex" value='<%= index %>'> <input type="hidden" name="action" value="DELETE"> </form> </td></tr>
<% } %><\table>
Music without borders – pagina carrello - I
Laboratorio di Servizi Web - JSP - Ardissono
64
<p> <form name="checkoutForm" action="/examples/servlet/ShoppingServlet" method="POST"> <input type="hidden" name="action" value="CHECKOUT"> <input type="submit" name="Checkout" value="Checkout"> </form> </center><% } %>
Music without borders – pagina carrello
NB: questo codice è vecchio, parziale e potrebbe contenere errori… vediamolo solo per
capire come si integrano Servlet e JSP in Model 2
Laboratorio di Servizi Web - JSP - Ardissono
65
public class ShoppingServlet extends HttpServlet { … …
public void doPost (…) throws … { HttpSession session = req.getSession(false); if (session == null) {forward a pagina error.html);} Vector buylist = (Vector)session.getValue("shopping.shoppingcart"); String action = req.getParameter("action"); if (action.equals("DELETE")) {elimina item da carrello (buyList);} else if (action.equals("ADD")) {aggiunge item a carrello;}
session.putValue("shopping.shoppingcart", buylist); String url="/jsp/shopping/EShop.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req, res); } else if (action.equals(“CHECKOUT”) …
Music without borders – Servlet (controller) - I
Forward a pagina principale (Eshop.jsp)
Laboratorio di Servizi Web - JSP - Ardissono
66
else if (action.equals("CHECKOUT")) { amount = calcola prezzo da pagare;} req.setAttribute("amount",amount); String url="/jsp/shopping/Checkout.jsp"; ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher(url); rd.forward(req,res); } } // fine servlet
Music without borders – Servlet (controller)
Invia controllo a pagina Di checkout (Checkout.jsp)