ASOS ~ Introduzione alla Java Servlet Technology

Java Servlet
& Java Server Pages
(una semplice introduzione)
SAPIENZA – Università di Roma
Corso di Progetto di Applicazioni Software
Java Servlet Technology
• Le Servlet
– sono una tecnologia offerta da Java per l'estensione
delle funzionalità di server che ospitino applicazioni
accedute dai client tramite un modello di
comunicazione request-response
• HTTP
– sono delegate a processare le request ed emettere le
response
– consistono in moduli di codice Java in esecuzione su
un ambiente server
• le API sono in un pacchetto incluso in J2EE
– javax.servlet
– javax.servlet.http
– hanno un funzionamento che ricorda le CGI
– sono dispiegate (deployed) ed eseguite (run) in un
servlet container all'interno del Server
– non sono thread-safe!
2
Servlet Container
• Infrastruttura software in cui una Servlet…
1. … viene eseguita
• simile al concetto di Sandbox;
2. … scorre il proprio ciclo di vita.
3
Servlet Container
• Infrastruttura software in cui una Servlet…
1. … viene eseguita
• simile al concetto di Sandbox;
2. … scorre il proprio ciclo di vita.
• Nel resto del corso e nelle esercitazioni verrà adoperato
Apache Tomcat
4
Gerarchia Servlet
• Le Servlet sono in relazione
con classi ed interfacce
contenute nei package:
– javax.servlet
– javax.servlet.http
• javax.servlet comprende
classi ed interfacce…
– … indipendenti dal protocollo
di comunicazione;
– … estese da classi ed
interfacce in
javax.servlet.http
• specifiche per il
protocollo HTTP.
5
Java Servlet Technology
6
Ciclo di vita delle Servlet
• public void init()
–
–
–
–
invocato dal Servlet Container
precede qualunque ulteriore invocazione
termina prima di qualsiasi ulteriore invocazione
tipicamente si effettua overriding di questo metodo per creare le
connessioni ad altri oggetti Container-managed, utili durante
tutto il resto del ciclo di vita
• public void destroy()
– invocato dal Servlet Container
– termina solo dopo che ogni altra invocazione ha terminato la
propria esecuzione
– tipicamente si effettua overriding di questo metodo per rilasciare le
risorse occupate prima che la Servlet venga distrutta
7
Ciclo di vita delle Servlet
• public void service(
ServletRequest req,
ServletResponse res
)
– gestisce la richiesta del client (req)
• il parametro req fornisce informazioni contestuali, ad esempio
– String getRemoteAddr() // indirizzo IP del client
– Enumeration getParameterNames() // parametri di invocazione
– …
– imposta la risposta del server (res)
• la scrittura sull'output avviene tramite l'oggetto
ServletOutputStream associato
– ServletOutputStream getOutputStream()
– eseguito dal server in modalità multithread
8
La specializzazione HTTP
• Per ogni comando (METODO) HTTP 1.0 e 1.1…
–
–
–
–
POST
GET
HEAD
altri (PUT, DELETE, TRACE...)
• … HttpServlet definisce metodi nel formato
protected void do‹Metodo›(
HttpServletRequest req,
HttpServletResponse res
)
–
–
–
–
doPost(…)
doGet(…)
doHead(…)
doPut(…), doDelete(…), doTrace(…), … , service(…)
9
GET
10
POST
Parametri URL-encoded
11
GET
Parametri
URL-encoded
(query string)
Servlet
12
HttpServletRequest
HttpServletResponse
• HttpServletRequest estende ServletRequest
– metodi specifici
• public String getMethod()
– restituisce il metodo HTTP; ad esempio:
» Se la HTTP request è…
GET http://www.dis.uniroma1.it/index.jsp?question=answer
» … il metodo restituisce:
"GET"
• public String getRequestURI()
– restituisce la parte di URL dal nome di dominio alla query string, esclusi
» Se la HTTP request è…
GET http://www.dis.uniroma1.it/index.jsp?question=answer
» … il metodo restituisce:
"/index.jsp"
• …
13
HttpServletRequest
HttpServletResponse
• HttpServletResponse estende ServletResponse
– metodi specifici
• public String sendRedirect(String location)
– redireziona il browser del client verso la pagina indicata
• public String sendError(int sc, String msg)
– restituisce un codice di errore al client (sc sta per status code),
con un messaggio HTML definito
» si pensi per esempio ad un codice di errore tipico
sc := HttpServletResponse.SC_FORBIDDEN // 403
• …
Servlet
14
Mantenimento della
Sessione
• HTTP è un protocollo stateless
• Al di sopra, è stato costruito un sistema di registrazione
di variabili di stato relative alla navigazione del client
• È la Sessione
– Identifica univocamente il browser in uso sulla macchina client
durante la navigazione su una o più pagine residenti sul server
• Viene inizializzata dal server
– Può scadere per
• timeout
– impostato opzionalmente dal server
• disabilitazione esplicita
• Si pensi al meccanismo di login / logout dei siti ad
accesso protetto
– Registrazione / cancellazione della sessione autenticata
15
Mantenimento della
Sessione
• Fisicamente, le variabili di stato vengono salvate su file
temporanei del Server
– L'identificativo della Sessione (e del file sotteso)…
• … viene salvato dal client in un cookie, oppure
• … riscritto come parametro di request in tutti i link e le action dei
form nelle pagine scritte dal server
– pratica, quest'ultima, sconsigliabile
16
HttpSession
• HttpSession è la classe preposta a gestire la sessione
– HttpServletRequest espone il metodo
• HttpSession getSession([boolean create])
– il parametro create indica se forzare la creazione di una
sessione laddove non fosse stata già inizializzata
» per default è true
– Metodi di HttpSession
• Object getAttribute(String name)
• void setAttribute(String name, Object value)
– metodi getter e setter per ricevere (risp., impostare) valori in
sessione
• void invalidate()
– annulla la sessione in corso
• …
17
Packaging e deploying di
un progetto Servlet
•
Per dispiegare l'applicazione
web basata su Servlet
occorre
– creare un file WAR con
• nella sub-directory
WEB-INF/
– file bytecode
(*.class)
– descrittore
web.xml
• nella sub-directory
META-INF/
– file
MANIFES
T.MF
• eventuali altri file di
utilità
– spostare il file WAR all'interno
della specifica directory del
servlet container
18
WEB-INF/web.xml
Servlet
19
Servlet Demo (1)
20
Servlet Demo (2)
21
Servlet Demo (3)
22
Servlet Demo (4)
23
JSP (Java Server Pages)
È la tecnologia Java per lo sviluppo di
applicazioni Web mediante l’utilizzo di “pagine
dinamiche”

Sono pagine Web (HTML o XHTML) che
risiedono sul server Web



possono contenere codice Java attraverso l’utilizzo di opportuni tag, e
componenti JavaBean
Le pagine JSP vengono interpretate e tradotte
in Servlet al momento della prima chiamata da
client remoti

Java Servlet è la tecnologia sottostante ma JSP facilita la creazione di
interfacce
24
Servlet vs. JSP



Servlet: richiede una dettagliata conoscenza della
programmazione Java per lo sviluppo ed il mantenimento di
tutti gli aspetti dell’applicazione Web, dato che il codice di
esecuzione della richiesta ed il codice HTML risiedono
nello stesso punto
Servlet: cambiare il comportamento dell’applicazione o
aggiungere supporto a nuovi tipi di client richiede una
modifica del codice della servlet ed una sua ri-compilazione
Servlet: è difficile trovare vantaggio dai tool per lo sviluppo
di pagine Web quando si progetta l’interaccia
dell’applicazione. ll codice HTML associato alla servlet
deve essere inserito manualmente nel codice delle Servlet:



Time-consuming
Error-prone
Boring
25
Servlet vs. JSP
Servlet: si prestano meglio alla realizzazione di
applicazioni service-oriented (Web service
endpoints sono implementati come servlet)

JSP: separa il processamento delle richieste
(codice di business logic) dalla presentazione
dell’informazione

JSP: separando la request processing e la
business logic dalla presentazione è possibile
dividere lo sviluppo di tasks tra le persone aventi
differenti skills

Web designer per l'interfaccia (presentazione)

Programmatori per la logica dell'applicazione

26
Funzionamento di
JSP
prova.jsp
Read
GET
prova.jsp
Generate
provaServlet.java
Compile
<html>prova</html>
Execut
e
provaServlet.class
1.
il client richiede la pagina “prova”
2.
Il server legge la pagina prova.jsp
3.
Il server genera la servlet provaServlet.java
4.
Il server compila la servlet.java ottenendo una classe eseguibile
5.
Il server esegue la servlet
6.
La risposta viene inviata la client
27
Elementi JSP
Template text

Commenti JSP

Elementi di scripting

Codice java da inserire nella servlet risultante

Direttive JSP

Controllano la struttura della servlet risultante

Azioni JSP

Controllano il comportamento del motore JSP

28
Template text e commenti JSP
Template text: tutte le parti di testo che non
sono definite come elementi JSP sono copiate
nella pagina di risposta

Commenti JSP:
•
Sitassi: <%-- commento --%>
•
Vengono eliminati dal container in fase di
compilazione/traduzione della pagina
•
i commenti HTML sono considerati come
normale elemento di testo

29
Elementi JSP

Porzioni di codice in uno scripting language
specificato nelle direttive (di default Java)



Scriptlet: con sintassi <% code %>; possono contenere variabili
locali valide solo per una singola esecuzione della Servlet
(prodotta in seguito alla compilazione della JSP)
Declaration: con sintassi <%! declaration
[declaration] ...%>; sono metodi o variabili la cui durata è
quella della Servlet (conservano il loro valore per tutte le esecuzioni
della servlet)
Expression: con sintassi <%= expression %>; l’espressione
viene valutata e scritta nella pagina di risposta della JSP
30
Direttive JSP: page

Definisce attributi e parametri dipendenti dalla pagina, come ad esempio
il linguaggio di scripting usato, la pagine di errore, requisiti di buffering.

Attributi:

language: indica il linguaggio di script usato negli script
elements. Il valore di default è Java (se siano supportati altri
linguaggi o meno dipende dal container)

import: serve ad importare package all’interno della JSP,
equivalente alla import del linguaggio Java (ma si possono
specificare più package contemporaneamente, separati da virgole)

buffer: indica se l’output stream debba essere bufferizzato e,
contestualmente, la dimensione minima del buffer (il default è
8KB). Utile nel caso di redirezione richiesta a runtime quando dei
dati sono stati già inviati in output (come nel caso di error pages)

errorpage: Indica la pagina a cui si viene reindirizzati in caso di
eccezioni. Ha un valore espresso da un URL.
31