Laboratorio di Servizi We b - servlet - Ardissono 1 Java Servlet API • package javax.servlet: include classi e interfacce di gestione di servlet indipendenti da protocollo di comunicazione • package javax.servlet.http: include classi e interfacce specifiche per uso di servlet con protocollo HTTP • alcune classi e interfacce di javax.servlet.http estendono le rispettive di javax.servlet
Java Servlet API. package javax.servlet : include classi e interfacce di gestione di servlet indipendenti da protocollo di comunicazione package javax.servlet.http : include classi e interfacce specifiche per uso di servlet con protocollo HTTP - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Laboratorio di Servizi Web - servlet - Ardissono
1
Java Servlet API
• package javax.servlet: include classi e interfacce di gestione di servlet indipendenti da protocollo di comunicazione
• package javax.servlet.http: include classi e interfacce specifiche per uso di servlet con protocollo HTTP
• alcune classi e interfacce di javax.servlet.http estendono le rispettive di javax.servlet
Laboratorio di Servizi Web - servlet - Ardissono
2
Porzione di gerarchia delle classi - servletinterface javax.servlet.Servlet
•init(ServletConfig c)•service(ServletRequest req, ServleResponse res)•destroy(), … altri metodi ...
abstract class javax.servlet.GenericServlet implements Servlet, ServletConfig, Serializableoffre implementazione di interfaccia Servlet indipendenteda protocollo di comunicazione (HTTP, …)
abstract class javax.servlet.http.HttpServlet extends GenericServlet implements Serializableoffre implementazione di interfaccia Servlet specifica per HTTP
interface javax.servlet.ServletConfig
mantiene dati di configurazione di servlet
Laboratorio di Servizi Web - servlet - Ardissono
3
javax.Servlet - Interface ServletConfig
specifica metodi per accedere a parametri di configurazione di Servlet (es. database driver, costanti
globali della Servlet, …)
– public String getInitParameter(String name)• restituisce valore di parametro di inizializzazione “name”,
se esiste. Null altrimenti
– public Enumeration getInitParameterNames()• restituisce enumerazione di nomi dei parametri di
inizializzazione della Servlet
– public String getServletName()– ...
Laboratorio di Servizi Web - servlet - Ardissono
4
javax.Servlet - Interface Servlet - Ispecifica metodi di gestione della Servlet
– public void init(ServletConfig c) throws ServletException
• invocato da Web Container dopo aver istanziato Servlet
• inizializza variabili di servlet (prima di accettare HTTP requests). Es: leggere dati di configurazione, registrare database driver, …
– public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
• invocato da Web Container ad ogni HTTP request (oggetto req contiene dati di richiesta, res contiene risposta)
– public void destroy()• invocato da Web Container prima di rimuovere istanza di Servlet (es:
prima di shut down di web server, o se serve spazio di memoria, …)
Laboratorio di Servizi Web - servlet - Ardissono
5
javax.Servlet - Interface Servlet - II
Offre anche metodi per accedere a informazioni generiche su Servlet e a oggetto ServletConfig
(questi metodi sono usati nel codice delle classi da noi implementate che estendono le Servlet)
– ServletConfig getServletConfig()• restituisce oggetto ServletConfig di una Servlet
– String getServletInfo()• restituisce informazioni generali su Servlet (autore, data di
creazione, ...)
Laboratorio di Servizi Web - servlet - Ardissono
6
javax.Servlet.http - abstract class HttpServlet - I
– public void service(ServletRequest req, ServleResponse res)
• implementa metodo service di GenericServlet. Fa cast di ServletRequest/ServletResponse ad HttpServiceRequest/HttpServiceResponse e invoca metodo service protected.
» other: altre classi di utilità (application.other.InterrogaDB.java, …)
• web.xml: non specificato
– src (albero dei sorgenti)
Applicazione di prova cheavete usato è in package
“application”. Servlets separate da altre
classi per comodità ...
NB: se non si descrive servletin deployment descriptor si
rinuncia a usare configurationparameters etc.
Laboratorio di Servizi Web - servlet - Ardissono
15
Deployment descriptor - web.xml
• Un descrittore per ogni applicazione web• file web.xml (associato a contesto di applicazione
- swebi)• usato da Web Container per
– inizializzare applicazione web
– identificare applicazione invocata da HTTP request
• specifica– parametri di inizializzazione di Servlet e applicazione
(es: URL di database usato da applicazione, …)
– definizione di servlets e JSPs di applicazione
– ….
Laboratorio di Servizi Web - servlet - Ardissono
16
Altro esempio
Estendiamo applicazione swebi, che inizialmente faceva solo il saluto,
aggiungendo un altro tipo di servizio: richiesta informazioni personali
Implementiamo una nuova servlet (Informazioni.java), in aggiunta ad Hello.java, che invocheremo da una
pagina HTML
Laboratorio di Servizi Web - servlet - Ardissono
17
Nota bene
• NB: anche se le due servlet sono parte della stessa applicazione, non comunicano tra loro
• In generale, le servlet di un’applicazione dovrebbero cooperare e bisognerebbe definire applicazioni diverse, se si offrono servizi indipendenti
• Tuttavia, ciascun gruppo di laboratorio corrisponde, per questioni di configurazione del web server, ad una diversa applicazione usiamo applicazione per sviluppare tutte le
servlet che vogliamo (indipendentemente dal fatto che c’entrino l’una con l’altra …)
<!-- Context parameters definiscono costanti di tipo String condivise tra più servlet e JSP dell’applicazione. Questi parametri possono essere definiti dal system administrator che istalla l’applicazione.
Da una servlet (o JSP) si accede ai valori assegnati ai parametri invocando il seguente metodo:
String value = getServletContext().getInitParameter("name"); dove “name” corrisponde al nome dato al parametro usando <param-name> --> <context-param> <param-name>contextPar</param-name> <param-value>Questo parametro e’ generale
di applicazione </param-value> <description> ... </description> </context-param>
Parametri di inizializzazione usati in tutta l’applicazione web sono memorizzati
nel contesto di applicazione
Laboratorio di Servizi Web - servlet - Ardissono
21
swebi - web.xml - descrizione servlet
<servlet>
<servlet-name>info</servlet-name>
<description> Servlet che fornisce informazioni personali </description>
out.println("<BODY><CENTER><H1>" + cheers + " Ecco le informazioni che desideri, "+loginName+“</H1></CENTER> <BR>“);
out.println(contextP);
Chiedo a riferimento a oggettoPrintWriter (da usare per
produrre output da inviare a web server - HTTP response)Inizio costruzione risposta
(pagina HTML generata dinamicamente)
NB: In generale, i parametri di applicazione sono par diconfigurazione (qui lo uso
solo per fare una stampa…)
Laboratorio di Servizi Web - servlet - Ardissono
30
Servlet Informazioni.java - V … se tipoInfo è “no” stampo su out “no info” altrimenti, se tipoInfo è “nomi” { try { apro connessione a database; eseguo query SQL e salvo risultati in Hashtable valori; chiudo connessione; } catch (SQLException e) { System.err.println(e); throw new ServletException(e);}
if (valori==null) out.println("****** RISULTATO NULL");else {
scorro ResultSer con cursore per estrarre informazioni; stampo informazioni su oggetto PrintWriter (out);
}}else out.println("Tipo di informazione non accessibile");out.println(“</BODY></HTML>");
out.close(); }
ForzoServletException
Chiudo PrintWriter
Laboratorio di Servizi Web - servlet - Ardissono
31
Ciclo di vita di una servlet
Servletinesistente
Servletistanziata
Servletinizializzata e/o
pronta per richieste
ServiceDestroyed
Unavailable
Istanziazione a startupdel container o inseguito a HTTP request
inizializzazione
HTTP request(s)da client(s) Fine
threadservice
shut-down di web container
Garbagecollection
Inizializzfallita
Fallimentotemporaneoo permanente
Laboratorio di Servizi Web - servlet - Ardissono
32
Esecuzione metodo service
• Ad ogni HTTP request Web Container crea thread per esecuzione richiesta
richieste di client diversi gestite in parallelo nell’ambito del processo principale, con poco spreco di risorse computazionali
• MA: attenti agli accessi alle risorse in mutua esclusione. Es:– variabili globali di servlet, da non modificare in
parallelo– accessi a DB che non garantiscono modifiche in
mutual esclusione (es: Microsoft Access)
Laboratorio di Servizi Web - servlet - Ardissono
33
Deployment di applicazione - ant• Usiamo tool ANT, che permette di effettuare molte
operazioni– eliminazione e ricostruzione di directory
dell’applicazione sotto l’area di deployment (WEB-INF/classes), per accertarsi che le classi compilate vecchie vengano rimosse e ad ogni ricompilazione l’applicazione sia completamente rinnovata
– compilazione classi java in directory di deployment (WEB-INF/classes)
– installazione applicazione in web container (tomcat) (ant install)
– eliminazione di installazione da web container (ant remove)
– ….
Laboratorio di Servizi Web - servlet - Ardissono
34
Deployment di applicazione – build - I
• ANT usa file di build passato come parametro, che specifica operazioni di deployment (task eseguibili)
• vd alias definito in catEnv.sh– alias ant '$JWSDP_HOME/jakarta-ant-1.5.1/bin/ant -
buildfile build.xml’
• ant install: task di installazione di applicazione (rinnova directory, compila, installa)
• ant remove: rimuove installazione di applicazione da web container
Laboratorio di Servizi Web - servlet - Ardissono
35
Deployment di applicazione – build - II
• File di build da usare per deployment delle vostre applicazioni in ambiente unix
• Versione da voi scaricata è la base• Consideriamo versione estesa per vedere come
utilizzare anche classi generate da JAXB in deployment di applicazione
• Vediamo alcune parti del file di build esteso: definizione di properties (variabili), di task, esecuzione task, ... Le parti relative a JAXB sono in viola
<!-- Configure the custom Ant tasks for the Manager application --> <path id="classpath"> <fileset dir="${jwsdp.path}/common/lib"> <include name="*.jar"/> </fileset> </path>