¿Cuáles son las diferencias entre Servlet 2.5 y 3?

92

Estoy lanzando un código J2EE que se adhiere a Servlet 2.5 y me pregunto cuáles son las principales diferencias entre 2.5 y 3. Se agradecen las sugerencias a los documentos oficiales de Sun y las experiencias personales.

Si no debería preocuparme por 3 por el momento, dígalo. ¡Gracias!

Max A.
fuente
2
+1 Solo esperando respuestas :)
ATorras

Respuestas:

149

ACTUALIZAR

Solo como una actualización y para ser más explícito, estas son las principales diferencias entre los servlets 2.5 y 3 (no estoy tratando de ser exhaustivo, solo menciono las partes más interesantes):

Anotaciones para declarar servlets, filtros y oyentes (facilidad de desarrollo)

En servlets 2.5, para declarar un servlet con un parámetro de inicio, debe agregar esto 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>

En los servlets 3, web.xml es opcional y puede utilizar anotaciones en lugar de XML. El mismo ejemplo:

@WebServlet(name="myServlet",
    urlPatterns={"/path/to/my/servlet"},
    initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }

Para los filtros, debe agregar esto en web.xml en servlets 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 usando anotaciones en servlets 3:

@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }

Para un oyente (en este caso un ServletContextListener), en servlets 2.5:

<listener>
    <listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>

Lo mismo usando anotaciones:

@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }

Modularización de web.xml (conectabilidad)

  • En los servlets 2.5 solo hay un archivo web.xml monolítico .
  • En los servlets 3, cada jar "cargable" puede tener un web-fragment.xml en su directorio META-INF especificando servlets, filtros, etc. Esto es para permitir que bibliotecas y frameworks especifiquen sus propios servlets u otros objetos.

Registro dinámico de servlets, filtros y oyentes en el momento de la inicialización del contexto (conectabilidad)

En servlets 3, una ServletContextListenerpuede añadir dinámicamente servlets, filtros y oyentes utilizando los siguientes métodos añadido a SevletContext: addServlet(), addFilter()yaddListener()

Soporte asincrónico

Ejemplo: digamos que algún contenedor de servlets tiene cinco subprocesos en su grupo de subprocesos, y hay un proceso que requiere mucho tiempo para ejecutarse por solicitud (como una consulta SQL compleja).

  • Los servlets 2.5 Este contenedor de servlets se quedaría sin hilos disponibles si recibe cinco solicitudes al mismo tiempo y los cinco hilos disponibles empezar a hacer el proceso, debido a que los hilos no volverían hasta service()(o doGet(), doPost(), etc.) se ejecuta desde el principio para finalizar y devuelve una respuesta.

  • Con los servlets 3.0, este proceso de larga duración se puede delegar a otro hilo y finalizar service()antes de enviar la respuesta (la respuesta ahora será enviada por el último hilo). De esta forma, el hilo es libre de recibir nuevas respuestas.

Un ejemplo de soporte asincrónico:

Servlets 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

        // ...
    }

}

Servlets 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.

        // ...

    }

}

La interfaz AsyncContexttambién tiene métodos para obtener el objeto de solicitud, el objeto de respuesta y agregar oyentes para notificarles cuando un proceso ha finalizado.

Inicio y cierre de sesión mediante programación (mejoras de seguridad)

En los servlets 3, HttpServletRequestse han agregado dos nuevos métodos a la interfaz : login(username, password)y logout().

Para obtener más detalles, eche un vistazo a la API de Java EE 6 .

morgano
fuente
3
Vale la pena mencionar que Servlet 3.0 fue lanzado en diciembre de 2009. La pregunta y la respuesta aceptada actual son anteriores a esas.
EIS
1
@ServletFilter@WebFiltery @WebServletContextListener@WebListeneren especificaciones oficiales AFAICT.
lapo
21

Servlet 3.0 aún no se ha lanzado, pero parece que está muy cerca. Los cambios más importantes en 3.0 son: Conectabilidad, Facilidad de desarrollo, Async Servlet, Seguridad. Me es imposible decir si estos son importantes para usted o no.

El más significativo de ellos es probablemente el soporte para servlets asincrónicos. Aquí hay un artículo que describe esto en detalle. La especificación completa se puede descargar aquí .

Dónal
fuente
Santa mierda, eso es genial. Las cosas asincrónicas se ven increíbles, gracias por la información. Acabo de terminar de codificar algo muy similar a esto.
Max A.
@adi fue lanzado en diciembre de 2009 ( jcp.org/aboutJava/communityprocess/final/jsr315 )
mauhiz
4
ACTUALIZAR La especificación de Servlet 3.1 publicada en 2013-05. Vea las novedades .
Basil Bourque
13

Como mencionó Don, las principales áreas de mejoras y adiciones son:

  • Conectabilidad (modularización de web.xml)
  • Facilidad de desarrollo (anotaciones, genéricos, convención sobre configuración)
  • Soporte de servlet asíncrono (para programación estilo cometa, proxy web asíncrono, servicios web asíncronos)
  • Mejoras de seguridad (inicio / cierre de sesión programático)
  • Otros (HttpOnly Cookie, Seguimiento de sesiones, EJB en archivo WAR)

Consulte la presentación de Javaone 2008 " API Java Servlet 3.0: Novedades y novedades " para obtener más detalles.

Pascal Thivent
fuente