The current time is <%= (new Date()).toString() %> data.jsp Salvare temporaneamente data.jsp a root di contesto (swebi) Laboratorio di Servizi Web - JSP - Ardissono"> The current time is <%= (new Date()).toString() %> data.jsp Salvare temporaneamente data.jsp a root di contesto (swebi) Laboratorio di Servizi Web - JSP - Ardissono">

La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Servlet e Java Server Pages

Presentazioni simili


Presentazione sul tema: "Servlet e Java Server Pages"— Transcript della presentazione:

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 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) Laboratorio di Servizi Web - JSP - Ardissono

3 Laboratorio di Servizi Web - JSP - Ardissono
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> usa JSP <JSP tags> <java code> Prima richiesta Web browser JSP <JSP tags> <java code> usa Traduzione Risposta generata Servlet Richieste successive Laboratorio di Servizi Web - JSP - Ardissono

5 Laboratorio di Servizi Web - JSP - Ardissono
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 Laboratorio di Servizi Web - JSP - Ardissono
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 import="java.util.Date"%> <html> <body> The current time is <%= (new Date()).toString() %> </body> </html> data.jsp Laboratorio di Servizi Web - JSP - Ardissono

7 Laboratorio di Servizi Web - JSP - Ardissono
JSP directives directiveName attribute=“value” attribute=“value” ... %> Es: 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 Laboratorio di Servizi Web - JSP - Ardissono
JSP directives - page page attribute=“val” attribute=“val” ... %> Es: 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 import="java.util.Date"%> <html> <body> The current time is <%= (new Date()).toString() %> include file=”JSP-EX/prova.html" %> </body> </html> swebi src JSP-EX WEB-INF Laboratorio di Servizi Web - JSP - Ardissono

10 Laboratorio di Servizi Web - JSP - Ardissono
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 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 Laboratorio di Servizi Web - JSP - Ardissono
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 src JSP-EX 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 descrittore di libreria di tag Prefisso da usare per identificare tag library <myTag:tagname … /> Laboratorio di Servizi Web - JSP - Ardissono

15 Laboratorio di Servizi Web - JSP - Ardissono
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 di variabili e metodi Espressione Espressione 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 di variabili 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 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> Molto simile a PHP e ASP. Poco leggibile testScriptlet2.jsp 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> Espressione Espressione 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
Web server request 4 response Web browser 2 Web browser JavaBean 3 Web container 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 che usa javaBean (SimpleBean.java) Laboratorio di Servizi Web - JSP - Ardissono

25 Esempio - Estratto di JSP
Dichiarazione bean usato <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"/> </BODY></HTML> Salva valore dei parametri di richiesta HTTP con nome = property di bean Recupera valore property per visualizzaz Visualizza codice interno di operaz scelta 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.java
package …; 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 che coincide 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 Bean associato a singola JSP (scope=“page”)
<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> ….. Salvataggio dati utente: istanza di bean salva variabili di stato localmente ad esecuzione di JSP (se bean vivesse per tutta la sessione utente lo potrebbero usare anche altre JSP per 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 Laboratorio di Servizi Web - JSP - Ardissono
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) Formato esterno tradotto da bean (logica applicativa) Valore parametro “tipoInfo” 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 - I package 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 che coincide con parametri di HTTPServletRequest Laboratorio di Servizi Web - JSP - Ardissono

34 OPBean.java - II Metodo di gestione public String getOperazione() {
di logica applicativa 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) Laboratorio di Servizi Web - JSP - Ardissono

35 Laboratorio di Servizi Web - JSP - Ardissono
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 di richiesta 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 richiesta Invoco 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 ulteriori parametri 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
parametro “login” parametro “tipoInfo”: no, nomi, cc <FORM METHOD="POST" ACTION="informa.jsp"> 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 ulteriori parametri 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 Laboratorio di Servizi Web - JSP - Ardissono
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 Laboratorio di Servizi Web - JSP - Ardissono
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) Laboratorio di Servizi Web - JSP - Ardissono

57 JSP: Architettura Model 2
1 (controller) Servlet Web server request (Model) JavaBean 2 3 instantiate (view) JSP 5 4 response Web container Laboratorio di Servizi Web - JSP - Ardissono

58 Laboratorio di Servizi Web - JSP - Ardissono
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 Music without borders – pagina principale - II
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 Laboratorio di Servizi Web - JSP - Ardissono

62 Music without borders – pagina principale - III
Laboratorio di Servizi Web - JSP - Ardissono

63 Music without borders – pagina carrello - I
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>   Laboratorio di Servizi Web - JSP - Ardissono

64 Music without borders – pagina carrello
   <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> <% } %> 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 Music without borders – Servlet (controller) - I
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”) … Forward a pagina principale (Eshop.jsp) Laboratorio di Servizi Web - JSP - Ardissono

66 Music without borders – Servlet (controller)
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 Invia controllo a pagina Di checkout (Checkout.jsp) Laboratorio di Servizi Web - JSP - Ardissono


Scaricare ppt "Servlet e Java Server Pages"

Presentazioni simili


Annunci Google