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 ServletContextListener
puede 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 AsyncContext
tambié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, HttpServletRequest
se 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 .