ATUALIZAR
Apenas como uma atualização e para ser mais explícito, essas são as principais diferenças entre os servlets 2.5 e 3 (não estou tentando ser exaustivo, estou apenas mencionando as partes mais interessantes):
Anotações para declarar servlets, filtros e ouvintes (facilidade de desenvolvimento)
Em servlets 2.5, para declarar um servlet com um parâmetro init, você precisa adicioná-lo ao 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>
Nos servlets 3, web.xml é opcional e você pode usar anotações em vez de XML. O mesmo exemplo:
@WebServlet(name="myServlet",
urlPatterns={"/path/to/my/servlet"},
initParams={@InitParam(name="configFile", value="config.xml")})
public class MyAwesomeServlet extends HttpServlet { ... }
Para filtros, você precisa adicionar isso em web.xml em 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 anotações em servlets 3:
@ServletFilter(name="myFilter", urlPatterns={"/path/to/my/filter"})
public class MyAwesomeFilter implements Filter { ... }
Para um ouvinte (neste caso, um ServletContextListener), nos servlets 2.5:
<listener>
<listener-class>my.server.side.stuff.MyAwesomeListener</listener-class>
</listener>
O mesmo usando anotações:
@WebServletContextListener
public class MyAwesomeListener implements ServletContextListener { ... }
Modularização de web.xml (plugabilidade)
- Nos servlets 2.5, há apenas um arquivo web.xml monolítico .
- Nos servlets 3, cada jar "carregável" pode ter um web-fragment.xml em seu diretório META-INF especificando servlets, filtros, etc. Isso permite que bibliotecas e estruturas especifiquem seus próprios servlets ou outros objetos.
Registro dinâmico de servlets, filtros e ouvintes no momento da inicialização do contexto (plugabilidade)
Em servlets 3, um ServletContextListener
pode adicionar dinamicamente servlets, filtros e ouvintes usando os seguintes métodos adicionais para SevletContext
: addServlet()
, addFilter()
eaddListener()
Suporte assíncrono
Exemplo: digamos que algum contêiner de servlet tenha cinco threads em seu pool de threads e haja um processo demorado a ser executado por solicitação (como uma consulta SQL complexa).
Com servlets 2,5 este servlet container iria ficar sem threads disponíveis se ele recebe cinco pedidos ao mesmo tempo e os cinco tópicos disponíveis começar a fazer o processo, pois os fios não retornaria até service()
(ou doGet()
, doPost()
etc.) é executado do início para terminar e retorna uma resposta.
Com os servlets 3.0, esse processo longo pode ser delegado a outro encadeamento e terminar service()
antes de enviar a resposta (a resposta agora será enviada pelo encadeamento mais recente). Desta forma, o tópico fica livre para receber novas respostas.
Um exemplo de suporte assíncrono:
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.
// ...
}
}
A interface AsyncContext
também possui métodos para obter o objeto de solicitação, objeto de resposta e adicionar ouvintes para notificá-los quando um processo foi concluído.
Login e logout programáticos (melhorias de segurança)
Nos servlets 3, a interface HttpServletRequest
foi adicionada a dois novos métodos: login(username, password)
e logout()
.
Para obter mais detalhes, dê uma olhada na API Java EE 6 .