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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide Common Gateway Interface • Interfaccia che consente al Web Server di eseguire applicazioni esterne in grado di creare pagine dinamicamente Nome dell’evento 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide Esecuzione 3. Il server lancia in esecuzione l’applicazione richiesta #^@@ P$&*£ Nome dell’evento 19 December 2015 - slide Esecuzione 4. L’applicazione stampa la sua risposta sullo standard output Nome dell’evento 19 December 2015 - slide Esecuzione 5. Il server ridireziona lo standard output sulla rete e quindi verso il client Nome dell’evento 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide FORM HTML Nome dell’evento 19 December 2015 - slide Struttura di un programma CGI leggi le variabili d’ambiente elabora stampa intestazione MIME “Content-type: text/html” stampa codice HTML Nome dell’evento 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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) 19 December 2015 - slide 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 19 December 2015 - slide Architetture “application server” Applicazioni Base di dati Client Nome dell’evento Web server Application server App. Servers 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide Risultato Nome dell’evento 19 December 2015 - slide 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(),.. 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide Active server page – ASP + ADO Nome dell’evento 19 December 2015 - slide ADO and WEB Nome dell’evento 19 December 2015 - slide Active Server Page - ASP Nome dell’evento 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide Risultato Nome dell’evento 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide 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”] 19 December 2015 - slide 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 19 December 2015 - slide 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 19 December 2015 - slide