AGGIORNARE
Proprio come aggiornamento e per essere più espliciti, queste sono le principali differenze tra i servlet 2.5 e 3 (non sto cercando di essere esaustivo, sto solo citando le parti più interessanti):
Annotazioni per dichiarare servlet, filtri e listener (facilità di sviluppo)
In servlet 2.5, per dichiarare un servlet con un parametro init è necessario aggiungerlo a web.xml :
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>my.server.side.stuff.MyAwesomeServlet</servlet-class>
<init-param>
<param-name>configFile</param-name>
<param-value>config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/my/servlet</url-pattern>
</servlet-mapping>
In servlet 3, web.xml è facoltativo ed è possibile utilizzare annotazioni invece di XML. Lo stesso esempio:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
Per i filtri, è necessario aggiungerlo in web.xml in servlet 2.5:
<filter>
<filter-name>myFilter</filter-name>
<filter-class>my.server.side.stuff.MyAwesomeServlet</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/path/to/my/filter</url-pattern>
</filter-mapping>
Equivalente all'uso delle annotazioni nei servlet 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Per un listener (in questo caso un ServletContextListener), in servlet 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
Lo stesso usando le annotazioni:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Modularizzazione di web.xml (Pluggability)
- In servlet 2.5 c'è un solo file web.xml monolitico .
- In servlet 3, ogni jar "caricabile" può avere un web-fragment.xml nella sua directory META-INF che specifica servlet, filtri, ecc. Questo per consentire alle librerie e ai framework di specificare i propri servlet o altri oggetti.
Registrazione dinamica di servlet, filtri e listener al momento dell'inizializzazione del contesto (Pluggability)
In servlet 3, una ServletContextListener
può aggiungere dinamicamente servlet, i filtri e gli ascoltatori utilizzando i metodi seguenti aggiunti SevletContext
: addServlet()
, addFilter()
eaddListener()
Supporto asincrono
Esempio: si supponga che un contenitore servlet abbia cinque thread nel pool di thread e che sia necessario eseguire un processo che richiede tempo per richiesta (come una query SQL complessa).
Con servlet 2,5 questo contenitore servlet sarebbe esaurire thread disponibili se riceve cinque richieste contemporaneamente e cinque thread disponibili iniziare a fare il processo, perché i fili non sarebbero tornati fino service()
(o doGet()
, doPost()
ecc) viene eseguito dall'inizio per terminare e restituisce una risposta.
Con i servlet 3.0, questo processo a lungo termine può essere delegato a un altro thread e terminare service()
prima di inviare la risposta (la risposta ora verrà inviata dall'ultimo thread). In questo modo il thread è libero di ricevere nuove risposte.
Un esempio di supporto asincrono:
Servlet 2.5:
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// ...
runSlowProcess();
// no async support, thread will be free when runSlowProcess() and
// doGet finish
// ...
}
}
Servlet 3:
@WebServlet(name="myServlet",
urlPatterns={"/mySlowProcess"},
asyncSupported=true) // asyncSupported MUST be specified for
// servlets that support asynchronous
// processing
public class MyAwesomeServlet extends HttpSerlvet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// an AsyncContext is created, now the response will be completed
// not when doGet finalizes its execution, but when
// myAsyncContext.complete() is called.
AsyncContext myAsyncContext = request.startAsync(request, response);
// ...
// myAsyncContext is passed to another thread
delegateExecutionToProcessingThread(myAsyncContext);
// done, now this thread is free to serve another request
}
}
// ... and somewhere in another part of the code:
public class MyProcessingObject {
public void doSlowProcess() {
// ...
runSlowProcess();
myAsyncContext.complete(); // request is now completed.
// ...
}
}
L'interfaccia AsyncContext
dispone anche di metodi per ottenere l'oggetto richiesta, l'oggetto risposta e aggiungere listener per notificare loro quando un processo è terminato.
Accesso e disconnessione programmatici (miglioramenti della sicurezza)
In servlet 3, l'interfaccia HttpServletRequest
è stata aggiunta due nuovi metodi: login(username, password)
e logout()
.
Per maggiori dettagli, dai un'occhiata all'API Java EE 6 .