De que se trata o artigo:

Neste artigo, estudaremos Seam Servlet, o quarto módulo a ser mantido pelos desenvolvedores de JBoss Seam. Veremos como Seam Servlet permite utilizar a Servlet API de maneira mais simples e poderosa, através de CDI.


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

Seam Servlet facilita grandemente o desenvolvimento de aplicações web Java EE 6 que utilizem servlets. O módulo provê métodos produtores para parâmetros e objetos do ambiente das servlets, criar métodos observadores do ciclo de vida de servlets e utilizar Seam Catch para tratar erros não capturados.

Resumo DevMan:

Dos vários módulos de Seam 3.0, apenas quatro estão presentes em Seam 3.1. Neste artigo, veremos o quarto módulo, Seam Servlet, que permite utilizar CDI com servlets de maneira prática, provendo métodos produtores, eventos de CDI e tratamento de exceções úteis para a Servlet API. Ademais, faremos uma breve exposição sobre o futuro, ainda pouco claro, da família de frameworks Seam.

Conforme vimos nos artigos anteriores, a recepção ambígua de Seam 3 pela comunidade levou a pesadas reestruturações no framework. Módulos mais relacionados a outras tecnologias foram transferidos para diversos projetos. Por exemplo, Seam Faces passou a fazer parte do RichFaces; Seam Persistence se tornou responsabilidade do Hibernate; Seam REST ao projeto RESTEasy; e assim por diante. Apenas quatro módulos ficaram sob a égide do projeto Seam: Solder, Catch, Config e Servlet. Já estudamos os três primeiros nos artigos anteriores. Agora, conheceremos Seam Servlet.

Seam Servlet permite utilizar CDI com servlets de maneira mais poderosa e simples que o padrão das especificações. Com ele, é possível obter valores definidos pela Servlet API através de injeção de dependências, por exemplo. Também é possível executar ações durante as fases do ciclo de vida de servlets através de eventos de CDI, e delegar exceções não tratadas para Seam Catch.

Assim como Solder, Catch e Config, Seam Servlet é um subcomponente de Solder em Seam 3.1. Entretanto, este novo e maior Seam Solder será mesclado com outros projetos (notadamente, Apache CODI e CDISource), formando um novo projeto focado em estender CDI. Este novo projeto põe em dúvida o futuro da família de frameworks Seam, conforme veremos mais à frente.

Seam Servlet

O último dos módulos de Seam 3 a ser fundido ao Solder é o Seam Servlet, que adiciona facilidades que integram Servlet API e CDI de maneira mais poderosa. Para o desenvolvedor de aplicações, existem três tipos de aprimoramentos: métodos produtores para diversos objetos da Servlet API, lançamento de eventos de CDI a partir de eventos de servlet e integração com Seam Catch.

Instalação

Em containers que suportem a versão 3 da Servlet API, instalar Seam Servlet em uma aplicação é tão simples quanto adicionar os JARs da API e da implementação do módulo no classpath da aplicação. É possível baixar os arquivos necessários no link apresentado ao final do artigo.

Uma solução mais gerenciável seria utilizar Maven para adicionar Seam Servlet às dependências do projeto. Para adicionar todo o Seam Servlet ao projeto, basta adicionar a configuração abaixo ao pom.xml:


  <dependency>
     <groupId>org.jboss.seam.servlet</groupId>
     <artifactId>seam-servlet</artifactId>
     <version>3.0.0.Final</version>
  </dependency> 

Esta forma tem a desvantagem de tornar a implementação de Seam Servlet conhecida em tempo de compilação. Neste caso, um desenvolvedor pode, por desatenção, utilizar diretamente classes de Seam Servlet no lugar das interfaces do módulo, o que geraria acoplamento entre a aplicação e o módulo. Isto pode ser evitado acrescentando a interface e a implementação do módulo como dependências diferentes, em escopos diferentes. Para fazer isto, basta utilizar as configurações apresentadas na Listagem 1 no pom.xml.

Se o container em questão não suportar Servlet API na versão 3, é necessário acrescentar mais algumas configurações no web.xml do projeto. Por exemplo, é preciso habilitar explicitamente o tratamento de eventos de servlets como eventos de CDI. Para isto, adicionamos um listener, um filtro e um servlet nativos de Seam Servlet. O código a ser inserido no web.xml pode ser visto na Listagem 2.

Seam Servlet permite que vários beans úteis sejam injetados. Os métodos produtores destes beans, porém, dependem da captura de eventos configurada acima. Em outras palavras, mesmo que o desenvolvedor não pretenda usar eventos de CDI para processar as fases do ciclo de vida de servlets, é necessário adicionar as configurações apresentadas.

A integração com Seam Catch também exige uma configuração específica no web.xml. Esta, porém, é mais simples. Caso o desenvolvedor deseje utilizar Catch para gerenciar as exceções não tratadas oriundas de servlets, basta adicionar um filtro à aplicação. O filtro pode ser visto na Listagem 3.

Note que a classe do filtro do Catch é org.jboss.seam.servlet.exception.CatchExceptionFilter. A documentação oficial de Seam Servlet afirma que é org.jboss.seam.servlet.CatchExceptionFilter (sem exception), mas está errada.

Listagem 1. Dependências necessárias para utilizar Seam Servlet.


  <dependency>
     <groupId>org.jboss.seam.servlet</groupId>
     <artifactId>seam-servlet-api</artifactId>
     <version>3.0.0.Final</version>
     <scope>compile</scope>
  </dependency>
   
  <dependency>
     <groupId>org.jboss.seam.servlet</groupId>
     <artifactId>seam-servlet-impl</artifactId>
     <version>3.0.0.Final</version>
     <scope>runtime</scope>
  </dependency>
   
  <dependency>
     <groupId>org.jboss.logging</groupId>
     <artifactId>jboss-logging</artifactId>
     <version>3.0.0.Beta4</version>
     <scope>compile</scope>
  </dependency>  ... 

Quer ler esse conteúdo completo? Tenha acesso completo