Quali sono le differenze tra Servlet 2.5 e 3?


92

Sto introducendo codice J2EE che aderisce a Servlet 2.5 e mi chiedo quali siano le principali differenze tra 2.5 e 3. I puntatori ai documenti Sun ufficiali e alle esperienze personali sono più apprezzati.

Se non dovrei preoccuparmi di 3 per il momento, dillo e basta. Grazie!


2
+1
Aspetto

Risposte:


149

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 ServletContextListenerpuò 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 AsyncContextdispone 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 .


3
Vale la pena ricordare che Servlet 3.0 è stato rilasciato nel dicembre 2009. La domanda e la risposta attualmente accettata sono anteriori a quelle.
eis

1
@ServletFilter@WebFiltere @WebServletContextListener@WebListenernelle specifiche ufficiali AFAICT.
lapo

21

Servlet 3.0 non è ancora stato rilasciato, ma sembra che sia molto vicino. I cambiamenti più importanti nella 3.0 sono: Pluggability, Facilità di sviluppo, Async Servlet, Security. Per me è impossibile dire se questi siano importanti o meno.

Il più significativo di questi è probabilmente il supporto per servlet asincroni. Ecco un articolo che lo descrive in dettaglio. La specifica completa può essere scaricata qui .


Santo cielo, è fantastico. La roba asincrona sembra fantastica, grazie per le informazioni. Ho appena finito di scrivere qualcosa di molto simile a questo.
Max A.

@adi è stato rilasciato nel dicembre 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz

4
UPDATE Specifiche Servlet 3.1 rilasciate 2013-05. Guarda cosa c'è di nuovo .
Basil Bourque

13

Come ha detto Don, le principali aree di miglioramenti e aggiunte sono:

  • Pluggability (modularizzazione di web.xml)
  • Facilità di sviluppo (annotazioni, generici, convenzione sulla configurazione)
  • Supporto servlet asincrono (per programmazione in stile cometa, proxy web asincrono, servizi web asincroni)
  • Miglioramenti della sicurezza (login / logout programmatico)
  • Altri (HttpOnly Cookie, Session tracking, EJB in WAR file)

Dai un'occhiata alla presentazione di Javaone 2008 " Java Servlet 3.0 API: Novità ed eccitanti " per i dettagli.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.