Database Access from Web Servers Motivazioni Produrre pagine “al volo” in base alle esigenze dell’utente e da contenuti strutturati (p.e. database) Scripting & componenti client-side non bastano Soluzioni: Nome dell’evento Architetture per produrre contenuti dinamici a lato-server 4 June 2017 - slide 2 Web Server: estensioni CGI (Common Gateway Interface) Nome dell’evento Web Server launches application named in URL CGI application gets HTTP headers & URL arguments CGI application returns HTTP headers and HTML document Runs in separate process from Web Server High startup cost (load plus process creation) Typically written in C, C++, Perl 4 June 2017 - slide 3 Web Server: estensioni ISAPI (Internet Server API) Microsoft Internet Information Server high performance API Functionally similar to CGI, but runs much faster Runs in same process as Web Server Low startup cost (after first load, stays in memory) Typically written in C, C++ Netscape NSAPI is similar Nome dell’evento 4 June 2017 - slide 4 Common Gateway Interface • Interfaccia che consente al Web Server di eseguire applicazioni esterne in grado di creare pagine dinamicamente Nome dell’evento 4 June 2017 - slide 5 Caratteristiche di CGI • Non e’: •un linguaggio di programmazione •un protocollo di comunicazione • Definisce solo un insieme di variabili di ambiente utili alla applicazione (ad es. parametri inviati dal client) %&£$$ pp*&£$ Nome dell’evento 4 June 2017 - slide 6 Invocazione • Il cliente specifica nell’URL il nome del programma da eseguire •Il programma deve stare in una posizione precisa (di solito il direttorio cgi-bin) http://mio.server.web/cgi-bin/xyz.exe root cgi-bin xyz.exe Nome dell’evento 4 June 2017 - slide 7 Esecuzione 1. Il server riconosce dall’URl che la risorsa richiesta dal cliente e’ un eseguibile http://mio.server.web/cgi-bin/xyz.exe Nome dell’evento 4 June 2017 - slide 8 Esecuzione 2. Il server decodifica i parametri inviati dal cliente e riempie le variabili d’ambiente es: request_method, query_string, content_length, content_type http://mio.server.web/cgi-bin/xyz.exe?#^@@ #^@@ P$&*£ Nome dell’evento 4 June 2017 - slide 9 Esecuzione 3. Il server lancia in esecuzione l’applicazione richiesta #^@@ P$&*£ Nome dell’evento 4 June 2017 - slide 10 Esecuzione 4. L’applicazione stampa la sua risposta sullo standard output Nome dell’evento 4 June 2017 - slide 11 Esecuzione 5. Il server ridireziona lo standard output sulla rete e quindi verso il client Nome dell’evento 4 June 2017 - slide 12 Invio di parametri a un programma CGI • Il client puo’ usare due metodi: •GET •POST •GET: i parametri sono codificati nell’URL http://www.mioserver.it/cgi-bin/xyz?par=val •POST : i parametri sono spediti al server separatamente, usando il body del messaggio di richiesta HTTP •NB: il metodo POST richiede l’uso di un costrutto HTML chiamato FORM Nome dell’evento 4 June 2017 - slide 13 FORM HTML Esempio: invio al server il nome dell’utente <form action=http://www.mysrvr.it/cgi-bin/xyz.exe method=post> <p>Dimmi il tuo nome: <input type=text name=“chisei” ></p> <input type=submit > </form> Nome dell’evento 4 June 2017 - slide 14 FORM HTML Nome dell’evento 4 June 2017 - slide 15 Struttura di un programma CGI leggi le variabili d’ambiente elabora stampa intestazione MIME “Content-type: text/html” stampa codice HTML Nome dell’evento 4 June 2017 - slide 16 Decodifica dei parametri leggi la variabile Request_method Valore? GET leggi la variabile Query_string POST leggi la variabile content_length leggi content_length caratteri da standard input Nome dell’evento 4 June 2017 - slide 17 Revisione critica di HTTP HTTP non prevede metodi per identificare l’utente Ogni richiesta è trattata come un evento isolato Una nuova richiesta non ricorda nulla della precedente Non esiste il concetto di sessione interattiva dell’utente Impossibile fare applicazioni personalizzate Nome dell’evento 4 June 2017 - slide 18 Revisione critica di CGI Il web server genera un nuovo processo cgi ad ogni richiesta Il processo viene terminato alla fine del computo della risposta Altissimo sovraccarico di esecuzione per la creazione e distruzione di processi Impossibile: Nome dell’evento Tenere informazioni sulla sessione dell’utente in memoria centrale (serve un database) Tenere allocate risorse condivise tra più richieste o più utenti (es. pool di connessioni a database) 4 June 2017 - slide 19 Obiettivi delle architetture server side Migliori prestazioni: creare processi solo in fase di inizializzazione del sistema e riusare un pool di processi pronti Mantenimento dello stato: sfruttare la persistenza del processo per mantenere informazioni sulla sessione dell’utente (stateful application) Condivisione delle risorse: mantenere allocate le risorse condivise Scalabilità: aumentare il numero di processi applicativi all’aumentare del traffico Nome dell’evento 4 June 2017 - slide 31 Architetture “application server” Applicazioni Base di dati Client Nome dell’evento Web server Application server App. Servers 4 June 2017 - slide 32 Java Servlet http://java.sun.com/products/servlet/index.html JVM HTTP Request Browser HTTP Response parametri Servlet container risposta Applicazioni (servlets) Servlet container: un programma Java che fornisce un ambiente persistente di esecuzione per applicazioni Web ed espone le caratteristiche del Web server come oggetti Java Servlet: l’analogo di uno script CGI nel mondo Java Nome dell’evento 4 June 2017 - slide 33 Esempio di servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class RequestInfo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML>"); out.println("<HEAD>"); out.println("<TITLE>Request Information Example</TITLE>"); out.println("</HEAD>"); out.println("<BODY>"); out.println("<H3>Request Information Example</H3>"); out.println("Method: " + request.getMethod()); out.println("<BR>"); out.println("Request URI: " + request.getRequestURI()); out.println("<BR>"); out.println("User Agent:"+request.getHeader("User-Agent")); out.println("</BODY>"); out.println("</HTML>"); } } Nome dell’evento 4 June 2017 - slide 34 Risultato Nome dell’evento 4 June 2017 - slide 35 Classi/interfacce di utilità HTTPServletRequest METODI: getHeader(), getMethod(), getQueryString(),.. HTTPServletResponse METODI: getWriter(), setContentLenght, setContenType(), setHeader(), setStatus(), .. HTTPSession METODI: getAttribute(), invalidate(), isNew, setMaxInactiveInterval() Cookie Nome dell’evento METODI: setValue(), GetValue(), getName(), setMaxAge(),.. 4 June 2017 - slide 36 Valutazione Astrazione object-oriented delle proprietà di un server HTTP esteso (request, response, session ecc) Programmazione complessa perchè bisogna produrre sia il testo statico che i contenuti dinamici La presentazione HTML è mescolata al codice applicativo Esigenza: serve una soluzione più semplice per produrre pagine in modo dinamico a lato server Nome dell’evento 4 June 2017 - slide 37 Server-side scripting Idea: inserire istruzioni per il calcolo dei contenuti dinamici all’interno della pagina HTML Il codice è interpretato dal server Il browser riceve HTML puro <HTML> …. </HTML> <%> …... </%> <HTML> <BODY> …. </BODY> </HTML> Web server + Esecutore script Template: testo+script da interpretare sul server Nome dell’evento 4 June 2017 - slide 38 Active server page – ASP + ADO Nome dell’evento 4 June 2017 - slide 39 ADO and WEB Nome dell’evento 4 June 2017 - slide 40 Active Server Page - ASP Nome dell’evento 4 June 2017 - slide 41 ASP Server Framework ASP Server Scripting Hosts VB Script natively Perl, JavaScript also supported Enables scripting of ASP Server Controls ASP Server Controls Built on standard tools: VB, VC/C++, Java Objects compatible w/ OLE Automation hosts Database connectivity is native Nome dell’evento Via OLEdb - ADO 4 June 2017 - slide 42 ADO and VBScript: an example Prepare the form <hmtl> tags and intrinsic objects </hmtl> Get a recordset <object id=rs classid=”……………."></object> <script language="VBScript"> Provider, DataSource rs.open ………. View the data HTMLObject.Text = rs.Fields(“……”).Value Data Browsing Nome dell’evento rs.MoveNext, rs.MovePrevious 4 June 2017 - slide 43 An example of data access -DEMO An MDB file (MS – Access) No registration, no DSN definition, no declaration Only two components (plus the browser) Middle tier User tier Run Query Data Access Data tier Data Base Multi scroll Call SP Nome dell’evento 4 June 2017 - slide 44 Java Server Pages (JSP) JSP è una architettura per server-side scripting proposta da Sun (come alternativa a ASP di Microsoft) Si fonda su tecnologia Java: linguaggio Java, Java Servlet, Java Beans Cronologia: Nome dell’evento Proposta presentata a JavaOne 98 Versione 0.92: revisione pubblica conclusa a Genn. 99 Versione 1.0 disponibile 1Q 99 Versione 1.1 disponibile 1Q 00 Versione 1.2 in uso da ottobre 2001 4 June 2017 - slide 45 File JSP Un file .asp contiene una combinazione di: Testo Tag HTML Istruzioni di server-side scripting E’ necessario disporre di un ambiente di compilazione apposito (ad es. Tomcat di Apache Jakarta) Nome dell’evento 4 June 2017 - slide 46 Procedure ed espressioni Scriptlets procedure racchiuse tra delimitatori (<%…….%>) scritte in Java Espressioni Un’espressione ha la forma: <%= variable%> La variabile viene valutata e il valore risultante, convertito in stringa, viene inserito nella pagina al posto dell’espressione Nome dell’evento 4 June 2017 - slide 47 Direttive Direttive: <%@ variable=“value” %> il tipo di linguaggio da utilizzare all’interno del file JSP (<%@ language=”java”%>) il file .jsp o .html che viene ritornato al client se l’esecuzione della pagina JSP restituisce un errore (<%@ errorepage=”contactwebmaster.html”%>) i moduli (packages) importati dagli oggetti usati nella pagina (<%@ import=”java.io.*, java.util.Hashtable%>) Nome dell’evento 4 June 2017 - slide 48 Esempio <HTML> <HEAD> <TITLE>Request Information Example</TITLE> </HEAD> <BODY> <H3>Request Information Example</H3> Method: <%= request.getMethod() %> <BR> Request URI: <%= request.getRequestURI() %> <BR> User Agent: <%= request.getHeader("User-Agent") %> </BODY> </HTML> Risultato: la stessa pagina computata dal servlet mostrato in precedenza Nome dell’evento 4 June 2017 - slide 49 Compilazione Il file JSP viene prima tradotto in un servlet Il servlet viene compilato in bytecode La versione compilata viene tenuta in memoria per rendere più veloce una successiva richiesta della pagina NB: La versione originaria di Microsoft ASP (non ASP.NET) non compilava i template Nome dell’evento 4 June 2017 - slide 50 Valutazione Indipendenza dal tipo di browser utilizzato Il browser vede solamente pagine HTML All’utente non sono necessari programmi proprietari o estensioni del browser Maggior facilità di apprendimento e utilizzo rispetto a servlet Oggetti di utilità Nasconde la presenza di programmi script agli utenti e ad eventuali hacker Resta però codice (anche se poco) frammisto a markup HTML Nome dell’evento 4 June 2017 - slide 51 Tag eseguiti a lato server Obiettivo: togliere il codice dai template di pagina Soluzione: nascondere il codice “dietro” tag “magici”, eseguiti dal server <%@ taglib uri="http://www.myserver.com/mytaglib" prefix=“mytag" %> <HTML> <HEAD><TITLE>Esempio di tag iteratore</TITLE></HEAD> <BODY> <mytag:iteratore att1=“un” att2=“due” att3=“tre!”> <p><mytag:elemento></p> </mytag:iteratore> </BODY> </HTML> Nome dell’evento 4 June 2017 - slide 52 Risultato Nome dell’evento 4 June 2017 - slide 53 ASP .NET Overview Originally Active Server Pages (ASP) ASP.NET Successor of ASP Different paradigm (.NET Framework) Topics Nome dell’evento Stateless web paradigm Code behind pages Response and Request objects Session and Application variables 4 June 2017 - slide 55 Stateless web paradigm Client may return to any page at any time in any state State information is posted during each page request (?xxxxx=xxxxx) ASP.NET web controls automatically repost their own state to maintain the ViewState of the page Nome dell’evento 4 June 2017 - slide 56 Code behind pages Binds HTML page to a code file written in a .NET language HTML page is encapsulated in a System.Web.UI.Page class Events such as Page_Load may be handled All ASP.NET controls can be used as regular .NET objects Scripts in HTML page may call code behind functions Everything will eventually end up as HTML Nome dell’evento 4 June 2017 - slide 57 Response and Request objects Response Represents the client browser Response.Redirect(http://www.microsoft.com) Response.Cookies[“UserName”] = “Bob” Request Nome dell’evento Represents the server Request.PhysicalApplicationPath UserName = (String)Request.Cookies[“UserName”] 4 June 2017 - slide 58 Session and Application variables Session variables Hashtable-style collection of name-value pairs Remembered until the client closes the browser (or the session timeout expires – default 20 minutes) Only for one client Session[“ValidUser”] = true Application variables Hashtable-style collection of name-value pairs Always remembered For all clients Application[“NumClients”] = NumClients + 1 Nome dell’evento 4 June 2017 - slide 59 Riferimenti CGI: http://hoohoo.ncsa.uiuc.edu/cgi/ Java Servlet http://java.sun.com/products/servlet/index.html JSP: http://java.sun.com/products/jsp/index.html .NET: http://samples.gotdotnet.com/quickstart/aspplus/ Nome dell’evento 4 June 2017 - slide 60