• Non ci sono risultati.

Servlet e JDBC Programmazione in Rete e Laboratorio

N/A
N/A
Protected

Academic year: 2021

Condividi "Servlet e JDBC Programmazione in Rete e Laboratorio"

Copied!
5
0
0

Testo completo

(1)

Servlet e JDBC

Programmazione in Rete e Laboratorio

Matteo Baldoni Dipartimento di Informatica Universita` degli Studi di Torino C.so Svizzera, 185 I-10149 Torino baldoni@di.unito.it

http://www.di.unito.it/~baldoni/didattica

2

Servlet e Web Server

Servlet:

estensioni del Java API

permettono di scrivere applicazioni indipendenti eseguite all’interno del Web server

possono servire richieste in parallelo

mantengono la sessione di lavoro con il singolo utente

efficienti e semplici da utilizzare rispetto ai programmi CGI

3

Servlet e Web Server

Web Server Client Browser

Java Virtual Machine

Servlet HttpServletResponse HttpServletRequest

Sono oggetti!

4

Servlet e Web Server

Una servlet è una classe Java (estensione di HttpServlet).

Un Web Server può ospitare più servlet (con relativi alias)

Quando il processo Web Server viene lanciato, genera un thread Java che inizializza l’oggetto Servlet (metodo init), questo persiste per tutta la durata per processo Web Server

Ogni servlet è un thread all’interno del Web Server (vs CGI dove viene eseguito un processo esterno)

5

Servlet

Ogni volta che il Web Server riceve una richiesta per una servlet S:

identifica la servlet S

invoca il metodo service dell’oggetto Servlet S, per far eseguire le operazioni richieste

Il metodo service rappresenta l’interfaccia del secondo livello di applicazione. Al termine del metodo, S rimanda una risposta sotto forma di pagina HTML

Il Web server spedisce la pagina al browser chiamante

6

Richieste

ES:http://nbbaldoni.di.unito.it/servlets/splppp0001.Registration?

cognome1=Baldoni&nome1=Matteo

La classe HttpServletRequest offre i metodi per

determinare i parametri di una richiesta (cognome1, nome1)

estrarre i valori speficati per i parametri nella richiesta (Baldoni, Matteo)

metodi gestiti: POST (doPost), GET (doGet)

(2)

7

Servlet e Web Server

Apache, Netscape, Microsoft o Oracle Web Server

le servlet erano inizialmente solo integrate nel Java Web Server della Sun

JSP: Java Server Pages, analogo di ASP (Active Server Pages), progetto Tomcat

Modulo ApacheJServ

8

Un esempio: AccessCounter.java

Si vuole realizzare un contatore di accessi

Nella realizzazione si deve tenere conto che piu` utenti potrebbero accedere contemporaneamente alla stessa pagina

9

AccessCounter.java

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class AccessCounter extends HttpServlet { int counter = 1;

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html");

PrintWriter out = res.getWriter();

[…]

}

10

AccessCounter.java

[…]

out.println("<HEAD><TITLE>” +

“Contatore degli accessi a questa pagina” + “</TITLE></HEAD>");

out.println("<BODY>");

out.println("<H2>Contatore accessi a questa pagina</H2>");

int localCounter;

synchronized(this) { localCounter = counter++;

}

out.println("<P>Questa pagina e` stata visitata " + localCounter + " volte.");

out.println("</BODY>");

[…]

11

AccessCounter.java

Web Server Client Browser

Java Virtual Machine

AccessCounter

HttpServletResponse HttpServletRequest

Client Browser

12

AccessCounter.java

Anche quando non vi sono accessi al server l’oggetto (la servlet) di tipo AccessCounter permane nella Java Virtual Machine del server stesso.

Web Server

Java Virtual Machine

AccessCounter

(3)

13

Un esempio: Registration.java

Analizzare le informazioni dei componenti di un gruppo inserite tramite una form ed inviate mediante il metodo POST

Se non sono rilevati errori spedire una mail con il numero del gruppo (assegnato in modo automatico) e spedire le varie infomazioni raccolte tramite mail

Se sono rilevati errori nell’immissione dei dati nella form segnalarli tramite una pagina html

14

registration.html

<FORM ACTION="https://baldo.di.unito.it:8080/registration/servlets/Registration"

METHOD="post”>

[…]

<INPUT TYPE="text" NAME=cognome1 VALUE="" SIZE=40>

[…]

<INPUT TYPE="text" NAME=nome1 VALUE="" SIZE=40>

[…]

<INPUT TYPE="text" NAME=email1 VALUE="" SIZE=40>

[…]

<INPUT TYPE="text" NAME=cognome2 VALUE="" SIZE=40>

[…]

<INPUT TYPE="text" NAME=nome2 VALUE="" SIZE=40>

[…]

<INPUT TYPE="text" NAME=email2 VALUE="" SIZE=40>

[…]

<TEXTAREA NAME=commenti COLS=50 ROWS=5></TEXTAREA> <br>

[…]

<INPUT TYPE="submit" VALUE="Inoltra">&nbsp;&nbsp;

<INPUT TYPE="reset" VALUE="Cancella">&nbsp;&nbsp;

</FORM>

15

Registration.java

public class Registration extends HttpServlet { […]

int counter;

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

res.setContentType("text/html");

PrintWriter out = res.getWriter();

[…]

}

Viene utilizzato sia per l’invio con POST sia con GET

MIME type della risposta PrintWriter per l’output

16

HTMLPage

In una servlet la pagina HTML di risposta da inviare all’utente è costruita mediante una serie di

“stampe” ma questo puo`

risultare pesante. Una soluzione a questo è data da JSP, un’altra è definirsi in proprio una classe che permetta di definire oggetti di tipo pagina HTML e che si occupino di inserire tutti i comandi HTML necessari alla formattazione di una pagina HTML

17

Registration.java

[…]

HTMLPage page = new HTMLPage();

[…]

String cognome1 = req.getParameter("cognome1").trim();

String nome1 = req.getParameter("nome1").trim();

String email1 = req.getParameter("email1").trim();

[…]

int localCounter;

synchronized(this) { localCounter = counter++;

saveState();

}

[…]

out.println(page);

[…]

Attenzione questa classe l’ho definita io per facilitare la creazione di una pagina HTML

Estrazione dei parametri inviati alla servlet dalla form

Incremento del contatore per il numero del gruppo

Output della pagina HTML counter è una variabile condivisa dai vari thread delle diverse richieste della stessa servlet

18

Registration.java

public void init(ServletConfig config) throws ServletException { super.init(config);

try {

FileReader fileReader =

new FileReader("/tmp/InitDestroyCounter.initial");

BufferedReader bufferedReader = new BufferedReader(fileReader);

String initial = bufferedReader.readLine();

counter = Integer.parseInt(initial);

return;

}

catch(FileNotFoundException ignored) { } catch(IOException ignored) { } catch(NumberFormatException ignored) { } counter = 1;

}

public void destroy() { saveState();

}

Questo metodo è eseguito quando la servlet è creata (una volta sola alla prima richiesta)

Questo metodo è eseguito automaticamente prima dello shutdown del Web Server

(4)

19

HTTP È Stateless

Una connessione HTTP è stateless

Non vi è nessuna relazione tra una connessione ed una successiva

Come trattare informazioni che si vorrebbero persistenti?

(esempio il carrello della spesa on-line)

Web Server Client Browser

Client Browser qualche secondo dopo...

20

HTTP È Stateless: Cookie!

È possibile fare uso dei cookie per memorizzare le informazioni che vogliamo rendere persistenti

I cookie sono memorizzati presso il client dal browser

I cookie sono memorizzati in forma di stringhe

Web Server Client Browser

Client Browser qualche secondo dopo...

Cookie

21

PesonalAccessCounter.java With Cookie

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class PersonalAccessCounterWithCookie extends HttpServlet { public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html");

PrintWriter out = res.getWriter();

HTMLPage page = new HTMLPage();

page.header.setTitle("Contatore personale degli accessi");

page.header.setAuthor("Matteo Baldoni");

page.body.addHeading(2, "Contatore personale");

[…]

page.body.addParagraph("L'utente ha visitato questa pagina " + ival + " volte.");

out.println(page);

} }

22

Pesonal Access Counter With Cookie

[…]

Cookie[] cookies = req.getCookies();

int ival = 1;

Cookie cookie = null;

if (cookies.length > 0) {

int i = 0; boolean found = false;

while (i < cookies.length && !found) { cookie = cookies[i];

if ((cookie.getName()).equals("PersonalCounter")) { ival = (new Integer(cookie.getValue())).intValue() + 1;

cookie.setValue(ival+"");

found = true;

} }

if (!found) {

cookie = new Cookie("PersonalCounter", "1");

} } else {

cookie = new Cookie("PersonalCounter", "1");

}

res.addCookie(cookie); […]

I cookie possono essere prelevati presso l’oggetto HttpServletRequest

Aggiunta di un cookie all’oggetto HttpServletResponse

23

HTTP È Stateless: HttpSession

Se le informazioni che si vogliono rendere persistenti possono crescere facilmente

Perche` non sfruttare la persistenza degli oggetti presso il server? Questa è la soluzione proposta con la classe HttpSession

Web Server Client Browser

Client Browser qualche secondo dopo...

Cookie

24

HTTP È Stateless: HttpSession

Web Server Client Browser

Client Browser qualche secondo dopo...

Cookie

Java Virtual Machine

Servlet

HttpServletResponse HttpServletRequest

Id user

Id user

Id user

Id user

Id user è generato e assegnato dal Web Server

Solo un cookie con lo Id user viaggia dal server al browser mediante un cookie

(5)

25

Pesonal Access Counter With Session

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class PersonalAccessCounter extends HttpServlet {

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { HttpSession session = req.getSession(true);

res.setContentType("text/html");

PrintWriter out = res.getWriter();

[…]

out.println(page);

} }

Creazione di un oggetto di tipo HttpSession se non esiste, previevo dello stesso dalla Java Virtual Machine, altrimenti

26

Pesonal Access Counter With Session

[…]

HTMLPage page = new HTMLPage();

page.header.setTitle("Contatore personale degli accessi");

page.header.setAuthor("Matteo Baldoni");

page.body.addHeading(2, "Contatore personale");

Integer ival = (Integer) session.getValue("counter");

if (ival == null) ival = new Integer(1);

else

ival = new Integer(ival.intValue() + 1);

session.putValue("counter", ival);

page.body.addParagraph("L'utente " + session.getId() +

" ha visitato questa pagina " + ival + " volte.");

[…]

Memorizzazione di un oggetto

Prelievo di un oggetto dal proprio HttpSession

27

HttpSession: vantaggi

Piu` facili da gestire

Solo l’identificativo dell’utente viene memorizzato tramite cookie

Si possono memorizzare veri e propri oggetti mentre con la tecnica dei cookie si deve trasformare l’informazione da rendere persistente in stringa da spedire al browser

Sfruttano la persistenza degli oggetti presso il Web Server

28 Web Server

Client Browser

Java Virtual Machine

Servlet HttpServletResponse HttpServletRequest

Internet 3-level Architecture

DB Server RMI/

CORBA

JDBC

29

JDBC

Interfaccia di programmazione Java per la connessione e l’uso di database

Permette di scrivere un’interfaccia SQL unica per i principali DB:

Oracle, MS Access, Sybase, ...

Sfrutta la security di Java e quella del database attraverso lo specifico driver

JDBC API

Driver JDBC - ODBC

ODBC di Microsoft Access

Microsoft Access

30

Bibliografia

Paolo Malacarne. Java Servlet. Apogeo, 2001. ISBN 88- 7303-870-0. 21,69 euro.

Giuseppe Naccarato. Java database e programmazone client/server. Apogeo, 2001. ISBN 88-7302-773-9. 35,64 euro.

Riferimenti

Documenti correlati

OGGETTO: Rinnovo contratto di assistenza e manutenzione degli apparati di rete, dei server, dei personal computer e del software dell’Azienda per l’anno 2013. LIQUIDAZIONE

- che nel periodo maggio/giugno 2013 la ditta SHN Sistemi ha effettuato diversi interventi oltre a fornire materiale hardware sostitutivo e che pertanto è

Infatti, a questo punto, si può scegliere l'ultima opzione per la configurazione automatica, quella centrale per quella manuale (in tal caso bisogna selezionare View per una

Se viene usato un tool di monitoring del server in grado di registrare alcuni dati statistici a livello di sistema, come l'utilizzo della CPU, l'I/O su disco e la cache di

Nei rapporti con gli organi della pubblica amministrazione e i gestori di pubblici servizi i certificati e gli atti di notorietà sono sempre sostituiti dalle

• Bytecode Verifier Soundness Theorem: For any program P, the bytecode verifier either rejects P or during the verification satisfies the type assignment conditions for P. •

Salvatelo col nome ciao.pl ed avviatelo per la verifica, utilizzando il procedimento illustrato nella lezione precedente, se tutto è andato bene e non avete commesso gravi errori

Permettono la configurazione da remoto e la visualizzazione tramite browser web su PC, smartphone, visualizzatori web e tablet dei dati provenienti da: dispositivi di