A versão final da JSR-315 (Java Servlet Specification) está trazendo algumas novidades de sua versão anterior, nesse artigo será visto as recém chegadas anotações(Aleluia?) e uma visão da plugabilidade dessa nova versão da API.

Anotações em Servlet 3

Observação manjada porém importante:  Em uma aplicação web,  as classes usando anotações devem estar localizadas no diretório WEB-INF/classes ou em um JAR no diretório WEB-INF/lib.

<metadata-complete>


O Deployment Descriptor(WEB.xml) conterá um novo atributo no elemento <web-app>,
o <metadata-complete>  que definirá se é necessário uma busca nas classes/jar’s por anotações.
metadata-complete = true – O deploy irá ignorar as anotações nas classes e jar’s.
metadata-complete = false – O deploy irá buscar anotações e web fragments(já iremos falar nele).

Anotações


@WebServlet

Define um Servlet, os atributos urlPatterns e value serão obrigatórios.
O nome anotado do Servlet deve ter ao menos um urlPattern.
As classes anotadas com @WebServlet obrigatóriamente devem estender javax.servlet.http.HttpServlet.

@WebServlet(”/exemplo1”)
public class Exemplo1Servlet extends HttpServlet{
//…
}

Usando outros urlPatterns…
@WebServlet(name=”MyServlet”, urlPatterns={“/foo”, “/bar”})
public class Exemplo2Servlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse
res) {
}
}

@WebFilter
Essa anotação será usada para criar filtros a sua aplicação web
@WebFilter(“/foo”)
public class MyFilter implements Filter {
public void doFilter(HttpServletRequest req, HttpServletResponse
res)
{
}
}
@WebInitParam
Essa anotação pode ser usuda em conjunto com as anotações @WebServlet e @WebFilter para passar valores iniciais ao Servlet.
@WebFilter (value=”/hello”,
initParams=({
@WebInitParam(name=”message”, value=”Servlet says: “)
}))
public TestFilter implements Filter {
private FilterConfig _filterConfig;
public void init(FilterConfig filterConfig)
throws ServletException
{
_filterConfig = filterConfig;
}
public void doFilter(ServletRequest req,
ServletResponse res,
FilterChain chain)
throws ServletException, IOException
{
PrintWriter out = res.getWriter();
out.print(_filterConfig.getInitParameter(“message”));
}
public void destroy() {
// destroy
}
}

O Metadado especificado no WebFilter estará disponível no objeto FilterConfig, logo o resultado de http://localhost:8080/${app-name}/hello irá renderizar o texto
Servlet says: Hello World!
@WebListener

A anotação par WebListener é usada quando se quer para capturar eventos de várias operções do contexto web.
As classes anotadas com @WebListener devem implementar pelo menos uma das classes a seguir:
javax.servlet.ServletContextListener
javax.servlet.ServletContextAttributeListener
javax.servlet.ServletRequestListener
javax.servlet.ServletRequestAttributeListener
javax.servlet.http.HttpSessionListener
javax.servlet.http.HttpSessionAttributeListener

@WebListener
public class MyListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
sc.addServlet(“myServlet”, “Sample servlet”,
“foo.bar.MyServlet”, null, -1);
sc.addServletMapping(“myServlet”, new String[] {
“/urlpattern/*” });
}
}

@ MultipartConfig
Essa anotação, quando utilizada indica que o resquest espera um mime/multipart,
O objeto HttpServletRequest do servlet deverá disponibilizar mime attachments com os métodos getPart() e getParts() para fazer a iteração sobre os mime attachments.
O nome default para o nome do seu Servlet, Filter, Listener será o nome da sua classe completa.

Plugabilidade – Para um web.xml mais modular

Para aumentar essa plugabilidade e para diminuir o trabalho de configuração dos desenvolvedores a versão 3 da especificação de Servlet incluirá os Web Module Deployment Descriptor Fragments(web fragment).
O web fragment, descrito no arquivo web-fragment.xml, é parte ou todo o web.xml que será lido diretamente de lib’s(jar’s) ou diretamente do META-INF sua aplicação.
Podendo assim ser incluido dentro dos jars, o que irá fazer com que não seja mais necessário configurar o servlet do seu framework MVC favorito em seu WEB.xml caso o web-fragment.xml dele esteja descrito.