Atenção: esse artigo tem um vídeo complementar. Clique e assista!

De que se trata o artigo:

Apresentação das novidades mais significativas introduzidas na nova versão da especificação de servlets, a 3.0. Cada uma das funcionalidades é explicada em detalhes, fazendo um comparativo com o que existia na versão anterior da especificação.


Para que serve:

Este artigo serve para desenvolvedores que têm interesse em conhecer as novidades na nova especificação de Servlets, que visam melhorar a experiência no desenvolvimento de aplicações.


Em que situação o tema é útil:

Os desenvolvedores que desejam conhecer a nova especificação de servlets encontrarão neste artigo uma descrição detalhada com exemplos acerca das novas funcionalidades disponíveis.

Servlets 3.0: O que há de novo?:

O lançamento do Java EE 6 trouxe consigo a nova especificação de Servlets 3.0. Diversas mudanças ocorreram, desde a possibilidade de configurar servlets via annotations até o suporte de chamadas assíncronas. Este artigo aborda estas mudanças em detalhes.

Em novembro de 2009 a Sun lançou a nova versão do Java EE (Enterprise Edition). Batizada de Java EE 6, esta versão trouxe um grande número de mudanças significativas nas mais diversas especificações que compõem a plataforma. Uma destas especificações é a JSR 315, que define a versão 3.0 dos servlets.

Os servlets estão presentes no Java EE há bastante tempo. Quem começou a trabalhar com eles há alguns anos certamente não notou grandes mudanças neste período. Na prática, pouca coisa foi modificada até a versão 2.5, que era a versão que vigorava até o ano passado. Agora, com a introdução da versão 3.0, a Sun procurou adicionar alterações que mudaram a forma de trabalhar com os servlets, facilitando a sua configuração e aumentando a produtividade do desenvolvedor.

Mesmo depois do aparecimento destas novidades, vale ressaltar que ainda é possível usar os servlets da forma como você já está habituado. A nova versão da especificação abre novas possibilidades, mas, ao mesmo tempo, mantém a compatibilidade com versões anteriores.

Este artigo abordará as principais mudanças na especificação, que são o suporte à configuração usando annotations, carregamento em tempo de execução e chamadas assíncronas a servlets.

Até o momento, apenas o servidor de aplicações GlassFish 3.0, que é a implementação de referência da Sun, suporta o Java EE 6 na sua totalidade.

Configurando servlets através do uso de annotations

Até a especificação 2.5, a criação de um servlet obrigava o desenvolvedor a criar a sua classe (que estende de HttpServlet) e configurá-lo corretamente no arquivo web.xml. A Listagem 1 mostra um exemplo de classe de um servlet, enquanto a Listagem 2 mostra como configurar, no web.xml, o servlet criado. De acordo com a configuração, ProcessarServlet é mapeado para /Processar.

Na nova versão da especificação, é possível utilizar annotations em substituição às configurações anteriormente feitas no arquivo web.xml. Isto simplifica o processo, uma vez que todas as informações necessárias podem ficar restritas à classe do servlet. A Listagem 3 mostra o mesmo ProcessarServlet, mas agora usando annotations.

No Java EE 6, o web.xml é um arquivo de uso opcional ao desenvolver aplicações web.

A annotation @WebServlet deve ser utilizada para configurar o servlet. No exemplo apresentado, o atributo urlPatterns foi utilizado para indicar o padrão de URL que deverá ser mapeado para o servlet. Ele permite também a definição de mais de um pattern, o que representa, na prática, que você pode delegar a um servlet o atendimento de requisições que usam diversos padrões de URL. A vantagem desta abordagem é que você centraliza suas operações em apenas um objeto e, dependendo da requisição feita, pode tratá-la de forma adequada.

A annotation @WebServlet também possui outros atributos, como name (para definir um nome para o servlet), description (para definir uma descrição), asyncSupported (para suporte a servlets assíncronos, que serão abordados mais adiante) e initParams.

O atributo initParams merece um destaque especial, pois possibilita que sejam fornecidos parâmetros ao servlet, os quais podem ser recuperados posteriormente através da chamada getServletConfig().getInitParameter(). Utilizar a passagem de parâmetros é interessante para tirar do código-fonte determinada informação que pode sofrer alteração com o passar do tempo. A definição de cada um dos parâmetros é feita através da annotation @WebInitParam. A Listagem 4 mostra como definir um parâmetro chamado msg e acessá-lo a partir do código do servlet.

Sempre que uma mesma configuração for feita através de annotations e no arquivo web.xml, o que está definido no arquivo possui precedência.

Listagem 1. Implementando o servlet.


  package servlet;
   
  public class ProcessarServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
      PrintWriter out = response.getWriter();
      out.print("<HTML><H1>Servlet de processamento</H1></HTML>");
      out.close();
    }
  }

Listagem 2. Configurando o servlet no arquivo web.xml.


  <web-app>
    <servlet>
      <servlet-name>ProcessarServlet</servlet-name>
      <servlet-class>servlet.ProcessarServlet</servlet-class>
    </servlet>
    <servlet-mapping>
      <servlet-name>ProcessarServlet</servlet-name>
      <url-pattern>/Processar</url-pattern>
    </servlet-mapping>
  </web-app>

Listagem 3. Implementando e configurando o servlet usando annotations.


  package servlet;
   
  @WebServlet(urlPatterns = "/Processar")
  public class ProcessarServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
    {
      PrintWriter out = response.getWriter();
      out.print("<HTML><H1>Servlet de processamento</H1></HTML>");
      out.close();
    }
  } ... 

Quer ler esse conteúdo completo? Tenha acesso completo