1 / 66

Servlet e Java Server Pages

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

aloha
Download Presentation

Servlet e Java Server Pages

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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> http:130.192.241.1:10000/swebi/data.jsp data.jsp Salvare temporaneamente data.jsp a root di contesto (swebi) 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> 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. 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 risorsaspecificata • 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 src JSP-EX 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 src JSP-EX WEB-INF Laboratorio di Servizi Web - JSP - Ardissono

  14. JSP directives - taglib (cenni) URI di descrittore di libreria di tag • <%@ 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 Prefisso 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 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 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> 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 1 JSP 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. Dichiarazione bean usato 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> 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 Properties con nome che coincide con parametri di HTTPServletRequest 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;} } • memorizza login di utente (login) e tipo di info richieste da utente (tipoInfo) Laboratorio di Servizi Web - JSP - Ardissono

  28. Bean associato a singola JSP (scope=“page”) 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> ….. 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. 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 Properties con nome che coincide con parametri di HTTPServletRequest 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() {… } Laboratorio di Servizi Web - JSP - Ardissono

  34. OPBean.java - II Metodo di gestione 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. 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 Dichiarazione di bean di nome opBean con proprietà di visibilità <%-- 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> ... 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 Recupero valore di property “login” di bean (recupero parametro di richiesta…) ... <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> 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:setPropertyname=”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:getPropertyname=”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:includepage=”URL" flush=“true” /> • <jsp:includepage=”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:paramname=”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:forwardpage=”URL” /> • <jsp:forwardpage=”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

More Related