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.
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.
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>
...