Java EE6: Começando com as Servlets 3.0

Se você nunca escreveu uma servlet antes por causa do medo de tantas configurações, agora é o momento para iniciar nessa tecnologia. Repare, com esse artigo, como ficou mais simples desenvolver para a web com Java.

Grande parte das aplicações atualmente desenvolvidas em Java são para a Web e geralmente são desenvolvidas através de frameworks como Struts, VRaptor e JSF. No entanto, é muito importante que antes de aprendermos alguma dessas ferramentas, entendamos os conceitos que elas nos abstraem.

Servlets

O principal pilar do desenvolvimento Web em Java é a API de Servlets. Com ela é possível executarmos código de uma determinada classe Java a partir de requisições HTTP para uma URL. Esse acesso é feito através de configurações não triviais de um servidor e arquivos específicos, de maneira diferente às antigas linguagens de script, como Perl, o que pode tornar o aprendizado de Servlets complicado.

Até a versão 2 da API de Servlets, precisamos fazer a declaração dessas classes através de XML (o web.xml). Portanto, além de nos preocuparmos em escrever o código Java com o processamento e lógica que desejamos fazer, ainda temos que nos preocupar com as configurações em XML, numa estrutura de diretórios especifica (o famoso diretório WEB-INF/classes), além de ter de manusear um servlet container.

Pronto pra escrever sua primeira servlet? Use a versão 3.0!

No mês passado foi aprovada oficialmente a versão nova do JavaEE 6, trazendo entre várias especificações novas, uma versão para Servlets, contendo diversas atualizações, a JSR 315, também conhecida como Servlet 3.0.

Nessa nova versão criamos as Servlets da mesma forma que fazíamos antes, ou seja, através de uma classe que estenda HttpServlet. Dessa forma, podemos criar uma Servlet que recebe um parâmetro pela requisição e imprime o mesmo no console da seguinte forma:

public class OiMundo extends HttpServlet {
    protected void service(HttpServletRequest request, 
        HttpServetResponse response) 
        throws ServletException, IOException {
        
        String nome = request.getParameter("nome");

        PrintWriter out = response.getWriter();
        out.println("Ola: " + nome);
    }
}

A primeira grande diferença que pode ser percebida na Servlet 3.0 é o uso de anotações para a configuração das Servlets em vez de grandes declarações em XML. Na versão 3, existe a anotação @WebServlet, que indica que aquela classe é uma Servlet. Essa anotação recebe no seu parâmetro value em qual URL a Servlet estará disponível.

@WebServlet(value="/oiMundo")
public class OiMundo extends HttpServlet {
        PrintWriter out = response.getWriter();

Você já poderia acessar nossa Servlet através de uma URL semelhante a http://localhost:8080/projeto/OiMundo?nome=Caelum, porém é mais interessante termos um formulário HTML que enviará a requisição e o parâmetro para a Servlet. Podemos criar um oiMundo.html com o seguinte conteúdo:

<html>
  <body>
    <form action="oiMundo">Informe o nome:
      <input name="nome" type="text" />
      <input type="submit" value="Enviar" />
    </form>
  </body>
</html>

Desenvolvedores que já trabalharam com a versão 2 de Servlets podem perceber que não declaramos nenhum nome para nossa Servlet em sua configuração. Isso anteriormente era feito através da Tag <servlet-name> no XML. Porém, por padrão, na versão 3.0 é utilizado o nome completo da classe que está anotada. Podemos sobrescrever essa padrão através do parâmetro name da anotação @WebServlet:

@WebServlet(value="/oiMundo", name="ServletOiMundo")

Mais novidades da especificação

Além de não precisarmos mais fazer a declaração das nossas Servlets em XML, agora também podemos declarar Filtros via anotações com o uso de @WebFilter.

Outro ponto que também acaba sendo muito comum quando utilizamos frameworks e bibliotecas de terceiros é que se exige uma configuração mínima no web.xml dos nossos projetos. Mas agora nem mesmo precisamos fazer essa configuração. As bibliotecas podem disponibilizar no diretório META-INF de seus jars um arquivo chamado web-fragment.xml contendo as configurações mínimas necessárias para o funcionamento da biblioteca, dessa forma, nós que utilizamos as bibliotecas não precisaremos nem fazer as configurações mínimas.

O que preciso para usar a nova versão?

Para que possamos utilizar Servlet 3.0 em nossas aplicações precisamos de um servidor que implemente essa nova versão. Até o momento, o único servidor que possui um release compatível é o Glassfish v3. Outros servidores famosos como Jetty (disponível em versão experimental na versão 8 ) e Tomcat (planejado para a versão 7) também suportarão.

Agora bastaria disponibilizar um projeto no servidor contendo no seu diretório WEB-INF/classes o .class da nossa nova Servlet.

Servlet 3.0 e a Caelum

Nosso conhecido curso de java para web, que vai desde servlets e JSP até Struts 2 e um pouco de Hibernate e VRaptor, já incorpora essas novidades do Java EE 6, e agora possui um capítulo totalmente dedicado à API Servlet 3.0.

Além disso, a versão 3.1 do VRaptor possui suporte também através do uso dos web fragments, dessa forma, você utiliza o framework sem escrever absolutamente nenhuma linha de XML, nem mesmo a declaração do filtro do framework.

19 Comentários

  1. Alex Rios 09/01/2010 at 23:11 #

    Muito bom artigo!
    Na semana passada fiz um overview da API Servlet 3 no meu blog com alguns exemplos das novas anotações e também a plugabilidade de funcionalidades.
    Abs

  2. Odair Silva 12/01/2010 at 12:00 #

    Rapaz, muito boa essa novidade. As vezes um xml vem a calhar, mas creio que a grande maioria dos desenvolvedores são aversos a ele. O uso de anotações vem se tornando uma tendência já faz algum tempo, ainda bem. Isso torna o desenvolvimento muito mais rápido e prático, evitando até mesmo aqueles erros infantis (que todo mundo comete) de digitação.
    Adriano, só fiquei com uma dúvida sobre essa especificação: se eu tiver minha classe Servlet anotada com @WebServlet, e ainda assim existir um web.xml em WEB-INF, o xml tem prioridade sobre a anotação, correto?
    Muito bom o artigo, parabéns.

  3. Adriano Almeida 12/01/2010 at 13:53 #

    Oi Odair, tudo bom?

    Voce esta certo, se eu tiver a Servlet configurada no xml a anotacao vai ser ignorada e vai valer o que estiver no XML.

    []‘s

  4. wryel 14/01/2010 at 14:18 #

    Prevejo uma onda de mudanças positivas em frameworks web, cada ano que passa da-se mais gosto de trabalharcom java.

  5. Wilson 17/01/2010 at 20:45 #

    Muito bacana o artigo.

    Eu participei de uma palestra que o Sang Shin apresentou os novos recursos da especificação do JEE.
    É impressionante a simplicidade para o desenvolvimento que essa especificação irá proporcionar. Acabando com grande parte dos arquivos de configuração em XML.

    Abraço.

  6. Wagner 08/02/2010 at 11:56 #

    Fala Adriano, blz? Parabéns pelo artigo, muito bom. Só uma coisa, existe alguma diferença entre eu mapear uma URL utlizando o atributo urlPatterns e o atributo value?

  7. Lucas Pereira Caixeta 28/04/2011 at 11:44 #

    Ahh =)
    eu estudei os cursos e vi isso!!, realmente essa nova versão quebra o galho…xml ta sendo deixado de lado aos poucos.

    Parabéns pelo artigo!

    No mais, estamos ai.

  8. Tiago 20/01/2012 at 13:08 #

    Ola pessoal,

    Se não temos mais o web.xml no projeto como iremos “mapear” as paginas de exceptions, isto é, sem uma tag e tal.
    Ja estou usando um @WebServlet para as url, e quanto as excpetion? Como fazer?

  9. Tiago 20/01/2012 at 13:11 #

    Como lançar um erro.html se nao temos um web.xml configurando a servlet?

    Obrigado a todos!!

  10. Paulo Silveira 20/01/2012 at 13:26 #

    Tiago, o web.xml ainda existe sim. Ele não é necessário para grande parte das configurações, mas você pode sim ainda utilizá-lo. Basta colocá-lo no lugar de sempre.

  11. Tiago 20/01/2012 at 13:38 #

    Paulo,

    Então na verdade o servlet 3.0 nos ajuda muito com annotation mas ainda precisamos do web.xml para “tratar” as paginas de exceptions? Não existe nenhuma annotation para error page?

  12. Tiago 20/01/2012 at 13:39 #

    Se criar um web-fragment.xml também servirá? Pois quando gerei o projeto (Web dynamic) o web.xml não foi criado

  13. Paulo Silveira 20/01/2012 at 14:20 #

    acho que nao. sao poucas as anotacoes existentes: http://docs.oracle.com/javaee/6/api/javax/servlet/annotation/package-summary.html

  14. Tiago 20/01/2012 at 14:28 #

    Pelo que vi tem poucas mesmos, entao o jeito é voltar ao web.xml ¬¬ quem sabe em outra versão futura tenha rsrs

Deixe uma resposta