05_DBWeb - Studenti Dipartimento di Ingegneria Industriale e dell

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