Servlet

annuncio pubblicitario
1
Java Servlet
2
Introduzione
Java è linguaggio orientato alla programmazione
di tipo client/server, distribuita e delle reti
□
Esempi:
Gestione delle comunicazioni via socket
Gestione di oggetti remoti attraverso
l’invocazione remota di metodi (RMI)
Programmazione Web Oriented:
□
Il client è costituito da un web browser che
interegisce con la parte server tramite protocollo
HTTP
3
Programmazione Web
Oriented
Modello Common Gateway Interface (CGI)
consente ad un client web di interfacciarsi con
risorse/servizi residenti su un server
Sequenza operazioni:
□
□
□
Client effettua una chiamata al server tramite
browser
Il web server esegue l'applicazione
L'applicazione produce un output passato al
Web Server che lo invia al client
4
La Servlet API
API introdotta da SUN a partire dalla JDK 1.2 per
la realizzazione di applicazioni CGI in Java
E' una libreria opzionale di Java che permette di
realizzare classi Java caricate dinamicamente,
per espandere le funzionalità di un Web Server
Una Servlet è un programma Java in esecuzione
sul server in grado di colloquiare con un client per
mezzo del protocollo HTTP
5
Servlet vs CGI
CGI utilizza un processo per ciascun programma
e/o richiesta
Le Servlet possono essere gestite da thread
separati in esecuzione all'interno dello stesso
processo, oppure da più thread all'interno di
diversi processi sparsi su più Web Server di
backend
Le Servlet sono:
□
□
Più efficienti e scalabili
Più portabili rispetto al sistema operativo (grazie alla tecnologia
Java in cui sono implementate)
6
Supporto per le Servlet
Java Servlet sono un pacchetto opzionale
(Standard Extension) presente nel pacchetto
J2EE
Le API (l'ultima versione è la 2.5) sono:
□
javax.servlet
□
javax.servlet.http
□
Scaricabili dal sito della SUN http://java.sun.com/products/servlet
Le servlet sono eseguite e dispiegate (deploy) in
un servlet container o servlet engine
7
Servlet Container
Oggetto in cui la Servlet vive ed in cui trova un contesto di
esecuzione personalizzato
In questo corso sarà utilizzato il JBOSS Application
Server (vers. 4.0.3) scaricabile dal sito del corso
□
JBOSS utilizza il container Apache Tomcat (vers. 5.5)
8
La Servlet API (2)
Le servlet usano le classi e le interfacce contenute
nei due package: javax.servlet e
javax.servlet.http
Il package javax.servlet contiene le classi e
le interfacce per realizzare una generica servlet
(indipendentemente dal protocollo http)
Sono estese dalle classi presenti nel package
javax.servlet.http per aggiungere le
funzionalità del protocollo http
9
La Servlet API (3)
Ogni servlet deve implementare l'interfaccia
javax.servlet.Servlet
Si estende una delle due classi speciali
□
□
javax.servlet.GenericServlet (per servlet
indipendenti dal protocollo)
javax.servlet.http.HttpServlet (per HTTP servlet)
10
Gerarchia delle classi - servlet
Interface javax.servlet.Servlet
●
init(Servlet Config c)
●
service(Request req, Response res)
●
destroy() altri metodi…
Interface javax.servlet.ServletConfig
Mantiene i dati di configurazione
della servlet
abstract class javax.servlet.GenericServlet
Implements Servlet, ServletConfig, Serializable
Offre un’implementazione dell’interfaccia servlet indipendente dal protocollo
abstract class javax.servlet.http.HttpServlet
extends GenericServlet implements Serializable
Offre un’implementazione dell’interfaccia servlet specifica per HTTP
11
Esempio Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
//import java.util.*;
public class PrimaProva extends HttpServlet
{
public void service(HttpServletRequest req, HttpServletResponse res) throws
IOException,ServletException
{
String param1=req.getParameter("da");
String param2=req.getParameter("a");
int da=Integer.parseInt(param1);
int a=Integer.parseInt(param2);
OutputStream os=res.getOutputStream();
PrintWriter out=new PrintWriter(os);
out.println("<HTML><HEAD><TITLE>Prima Prova</TITLE></HEAD>");
out.println("<BODY><TABLE BORDER=\"1\">");
for(int i=da;i<=a;i++)
{
out.println("<TR><TD>");
out.println(i);
out.println("</TD></TR>");
}
out.println("</TABLE></BODY></HTML>");
out.close();
}
}
12
Ciclo di vita: inizializzazione
Metodo init():
□
□
Effettua le operazioni necessarie per
l'inizializzazione della nuova servlet e per il suo
corretto funzionamento
Derivato dalla classe GenericServlet
public void init(ServletConfig config) throws ServletException
{
{
Viene invocato quando la servlet viene caricata per
la prima volta nel container
Termina prima di qualsiasi altra chiamata fatta alla
servlet
13
Ciclo di vita: esecuzione
Metodi:
□
service ()
□
doPost ()
□
doGet ()
Dopo l'inizializzazione, la servlet attende una richiesta
da parte del client che può essere indistintamente una
Post o una Get HTTP
L'interfaccia Servlet mette a disposizione il metodo
public void service(HttpServletRequest Req,
HttpServletResponse Res) throws ServletException,
IOException
14
Ciclo di vita: esecuzione(2)
Metodo service():
E' eseguito dal server in modalità multithread (uno per ogni
richiesta)
Viene invocato indifferentemente sia nel caso di
un'invocazione di tipo Get che di tipo Post
Viene utilizzato al posto di doGet e doPost
Realizza la comunicazione bidirezionale con i client per
mezzo dei suoi due parametri:
□
□
L'oggetto HttpServletRequest che contentente i dati
inviati dal client.
L'oggetto HttpServletResponse che rappresenta la
risposta della servlet al client.
15
HTTP: Concetti Base
16
HTTP Request
La servlet può comunicare con il client in modo
bidirezionale tramite le interfacce:
{ HTTPServletRequest che rappresenta la richiesta
e contiene i dati provenienti dal client. Questi dati sono
un insieme di parametri nome/valore ed un flusso di
dati di input
{
HTTPServletResponse che rappresenta la
risposta della servlet e consente di incapsulare tutte le
informazioni da inviare indietro al client
17
HTTP Request (2)
Una richiesta HTTP è composta da:
{
Un metodo di richiesta
{
Una URL di richiesta
{
Degli HEADER Fields (da cui dipende la codifica dei pacchetti
http scambiati)
{
Il Body della richiesta cioè i dati di input inviati dal
client che possono essere:
Dati di input non strutturati (espressi in forma testuale)
inviati tramite il metodo getReader() che restituisce un
oggetto di tipo BufferedReader
Dati di input in formato binario inviati tramite il metodo
getInputStream() che restituisce un oggetto di tipo
ServletInputStream
18
HTTP Request Methods
I metodi di richiesta più importanti sono:
{
{
□
{
{
GET: recupera la risorsa identificata dalla URL
richiesta
POST: invia al container dati di lunghezza illimitata
HEAD: ritorna l'header identificato dalla URL
(e.g.Content-Type, Content-Length)
PUT: memorizza una risorsa contenuta nella URL
di richiesta
DELETE: rimuove la risorsa contenuta nella URL
19
HTTP Request: metodo GET
GET IP-address/
resourseName?param1=val1&...&paramN=valN
Usato per richiedere dati (pagine HTML,...)
{
e.g. GET http://www.esempio.com accedo alla pagina
index.html del server www.esempio.com
Specifica parametri: parameterName=value;
{
{
e.g. GET http://www.esempio.com?nome=ruggero
Web server destinatario può usare il valore del
parametro per inviare contenuti specifici
20
HTTP Request: metodo POST
POST IP-address/
resourseName?param1=val1&...&paramN=valN
Usato per accedere a risorse dinamiche
{
e.g. Dati utente raccolti mediante FORM HTML
Differenze tra GET e POST
{
{
GET trasmette parametri appendendoli a URL
POST trasmette parametri inclusi in body della
richiesta
21
HTTP Response
Una HTTP response contiene:
{ Un result code cioè codici d'errore e.g.:
400: risorsa non disponibile
401: risorsa richiede un'autenticazione
500: errore occorso all'interno del server
503: Web Server momentaneamente
sovraccarico e non può soddisfare la richiesta
{
Degli HEADERS field
22
HTTP Response (2)
□
Un Body contentente i dati di output che
posso essere:
Dati di output non strutturati (espressi in forma
testuale) inviati tramite il metodo getWriter()
che restituisce un oggetto di tipo
java.io.Writer
Dati di output in formato binario inviati tramite
getOutputStream()che restituisce un oggetto
di tipo ServletOutputStream
23
Ciclo di vita: distruzione
Metodo destroy():
Viene chiamato per consentire alla servlet
di eseguire il rilascio di tutte le risorse (e.g.,
file aperti, connessioni a Data Base, ecc.)
prima che la servlet venga distrutta
□ La distruzione di una servlet ed il relativo
scaricamento (unloading) dalla memoria
avviene solo quando tutte le chiamate a
service() da parte dei client sono state
eseguite, o allo scadere di un timeout
specificato
□
24
Esempi
25
JBOSS AS
ƒ
ƒ
ƒ
ƒ
ƒ
E’ un application server openSource
Utilizza esclusivamente standard basati su J2EE
Ha costi di licenza nulli
Vasta comunità di sviluppatori
Ampio supporto tecnico
Per eseguire il deploy di una Servlet utilizza
il container Tomcat sviluppato da Apache
Software Foundation
26
Installation how to
passo1: installazione di jdk-1_5_0_06-windowsi586-p
passo2: installazione di JBOSS-4.0.3SP1
# java –jar jboss-4.0.3SP1.jar
richiesta di scelta della versione della jdk
richiesta di realizzare una installazione completa
Nota: di default JBoss utilizza la porta 8080 per esporre i
servizi web. E’ possibile modificare la porta (in generale le
configurazioni base) modificando il file server.xml di tomcat
27
Installazione (2)
28
Esempio Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
//import java.util.*;
public class PrimaProva extends HttpServlet
{
public void service(HttpServletRequest req, HttpServletResponse res) throws
IOException,ServletException
{
String param1=req.getParameter("da");
String param2=req.getParameter("a");
int da=Integer.parseInt(param1);
int a=Integer.parseInt(param2);
OutputStream os=res.getOutputStream();
PrintWriter out=new PrintWriter(os);
out.println("<HTML><HEAD><TITLE>Prima Prova</TITLE></HEAD>");
out.println("<BODY><TABLE BORDER=\"1\">");
for(int i=da;i<=a;i++)
{
out.println("<TR><TD>");
out.println(i);
out.println("</TD></TR>");
}
out.println("</TABLE></BODY></HTML>");
out.close();
}
}
29
Esempio Servlet
Compilazione di PrimaProva.java
30
Esempio Servlet (2)
Creare la cartella prova.war
In prova.war creare la cartella WEB-INF
In WEB-INF creare la cartella classes
In classes inserire I file *.class ottenuti a seguito
della compilazione del file .java
In WEB-INF creare il file web.xml
31
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>PrimaProva</servlet-name>
<servlet-class>PrimaProva</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PrimaProva</servlet-name>
<url-pattern>/PrimaProvaServlet</url-pattern>
</servlet-mapping>
</web-app>
32
Deploy
Copiare la cartella prova.war nella cartella deploy
di Jboss
Nota: ogni volta che viene apportata una modifica
al file .java devo cancellare la cartella e rieseguire
l’operazione di deploy
33
Scarica