Vous êtes sur la page 1sur 76

Java, Tutorial

06 Maven, JSF 2, Spring e Hibernate


Integrando tecnologias para facilitar o desenvolvimento web
[ Edwins Leonardi ]
Sumrio
20 Seam 3: Servlet e o futuro
Java, Tutorial Utilizando CDI para facilitar o desenvolvimento de servlets
[ Adam Victor Nazareth Brandizzi ]

28 Explorando os componentes do Dojo Toolkit


Java

Tutorial Usabilidade e simplicidade com os componentes do Dojo Toolkit


[ Luis Antonio Tavares ]

38 JavaOne Latin America 2011


Java O evento Java mais importante da Amrica Latina
[ Loiane Groner ]

44 Transaes com EJB


Java, Tutorial Manipule transaes com as facilidades do Java EE
[ Eduardo Correia da Silva ]

52 Aplicaes Java EE lightweight Ol, eu sou o DevMan! Desta p-


Boas Prticas

Java, Boas Prticas Reavaliando o uso de boas prticas e padres Java EE gina em diante, eu estarei lhe aju-
[ Oscar Costa ] dando a compreender com ainda
mais facilidade o contedo desta
60 Maven 3, Sonar e Hudson edio. Ser um prazer contar com
Java, Boas Prticas Descobrindo uma maneira mais gil de desenvolver software
sua companhia! Confira abaixo o
[ Rodrigo Branas ]
que teremos nesta revista:
Eng. de Software

Engenharia 70 Processo de Teste de Software


de Software
Garantindo mais qualidade com a implantao de um novo processo
[ Renata Eliza e Vivian Lagares ]

Brinde na web desta edio

Vdeos
3 3 vdeo-aulas sobre JPA e JSF.

Para visualizar acesse o link:


http://www.devmedia.com.br/articles/listcomp.asp?keyword=jm101&codigobanca=deltaspike

Gostou das vdeo aulas? O portal www.devmedia.com.br possui mais de 2 mil vdeo aulas e dezenas de cursos online sobre desenvolvimento de software!
Agora voc pode comprar as vdeo aulas que preferir e fazer sua prpria combinao de vdeos! Saiba mais em www.devmedia.com.br/creditos

Feedback D seu feedback sobre esta edio!


eu
s

A Java Magazine tem que ser feita ao seu gosto. Para isso, precisamos saber o que voc, leitor, acha da revista!
D

sobre e

D seu voto sobre esta edio, artigo por artigo, atravs do link:
www.devmedia.com.br/javamagazine/feedback
s

ta
edio
Para votar, voc vai precisar do cdigo de banca desta edio, que : deltaspike
Carta ao Leitor
Ano IX Edio 101 2012 ISSN 1676-8361

Edio

A
Editor
Eduardo Spnola (eduspinola@gmail.com) o iniciar o desenvolvimento de uma aplicao, quando no temos uma arquitetura padro,
sempre passamos pelo mesmo dilema: quais frameworks utilizar para implementar o
Produo sistema? Apesar de cada opo oferecer diferenciais para cada tipo de soluo, ter uma
Jornalista Responsvel Kaline Dolabella - JP24185 estrutura padro pode facilitar e muito nesta etapa. baseado neste contexto que destacamos a

Distribuio matria de capa da Java Magazine 101.


Dessa forma, Maven, JSF 2, Spring e Hibernate mostra a integrao dos frameworks JSF 2,
FC Comercial e Distribuidora S.A
Spring e Hibernate na arquitetura de projetos web e a utilizao da ferramenta Maven como
Rua Teodoro da Silva, 907, Graja - RJ
agente facilitador desta integrao. Tambm so discutidas as vantagens e caractersticas de cada
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362
componente utilizado.
Atendimento ao leitor No artigo Seam 3: Servlet e o futuro, estudaremos Seam Servlet, o quarto mdulo a ser mantido
A DevMedia possui uma Central de Atendimento on-line, onde voc pode pelos desenvolvedores de JBoss Seam. Veremos como Seam Servlet permite utilizar a Servlet API
tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um de de maneira mais simples e poderosa, atravs de CDI.
nossos atendentes. Atravs da nossa central tambm possvel alterar dados
Explorando os componentes do Dojo Toolkit expe vrios componentes do Dojo, mostrando na
cadastrais, consultar o status de assinaturas e conferir a data de envio de suas
revistas. Acesse www.devmedia.com.br/central, ou se preferir entre em prtica como utiliz-los em uma aplicao. Para isso, so abordados desde menus at componentes
contato conosco atravs do telefone 21 3382-5038. para funes especficas, como calendrios e campos para horas. Alm disso, foram discutidos
alguns conceitos relacionados usabilidade em ambientes web.
Edies anteriores Em JavaOne Latin America 2011 comentamos sobre o evento mais importante da comunidade
Adquira as edies anteriores da revista Java Magazine ou de qualquer outra
Java. durante este evento que grandes anncios e novidades so apresentados. Saber o que ocorreu
publicao do Grupo DevMedia de forma prtica e segura, em
durante o evento permite uma melhor compreenso sobre os rumos da plataforma Java.
www.devmedia.com.br/anteriores.
Transaes com EJB discursa sobre formas de se trabalhar com transaes em conjunto com
Publicidade o Java EE, as caractersticas bsicas de uma transao, a JPA e os modos de gerenciamento de
publicidade@devmedia.com.br 21 3382-5038 transaes CMT e BMT.
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, voc No artigo Aplicaes Java EE lightweight veremos como construir aplicaes Java EE leves
divulga sua marca ou produto para mais de 100 mil desenvolvedores de todo o e enxutas, utilizando Padres J2EE revisitados para a nova verso da plataforma. Para isso,
Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com detalhes sobre mostraremos trs alternativas de implementao de casos de uso do tipo CRUD utilizando os
preos e formatos de anncios.
padres Java EE.
Reprints Editoriais Se foi publicado na Java Magazine um artigo que Na matria Maven 3, Sonar e Hudson abordaremos a integrao das ferramentas Maven 3,
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a
Sonar e Hudson com a inteno de criar um ambiente de desenvolvimento mais gil por meio do
reimpresso da matria junto com a capa da edio em que saiu, e distribua
esse reprint personalizado entre seus clientes. estmulo eliminao de atividades repetitivas, reduo na incidncia de defeitos e aumento da

Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD qualidade do cdigo produzido.
com uma amostra de seus produtos na Java Magazine e atinja um pblico Por fim, focando em Engenharia de Software, Processo de Teste de Software explica como a
segmentado e formador de opinio. utilizao de um Processo de Teste pode melhorar a efetividade dos testes, controlando as atividades
e garantindo mais credibilidade e valor ao produto.
Java, o logotipo da xcara de caf Java e todas as marcas e logotipos baseados
em/ ou referentes a Java so marcas comerciais ou marcas registradas da Sun
Microsystems, Inc. nos Estados Unidos e em outros pases.

Fale com o Editor!

muito importante para a equipe saber o artigo na revista ou no site Java Magazine,
que voc est achando da revista: que tipo entre em contato com o editor, informando
de artigo voc gostaria de ler, que artigo voc o ttulo e mini-resumo do tema que voc
mais gostou e qual artigo voc menos gostou. gostaria de publicar: Eduardo Oliveira Spnola
Fique a vontade para entrar em contato com eduspinola@gmail.com
os editores e dar a sua sugesto! Eduardo Spnola - Editor da Revista
Se voc estiver interessado em publicar um eduspinola@gmail.com @eduspinola / @Java_Magazine

Assine agora e tenha acesso a


todo o contedo da DevMedia:
www.devmedia.com.br/mvp
Seo Java: Nesta seo voc encontra artigos intermedirios e avanados sobre Java

Maven, JSF 2, Spring e Hib


Integrando tecnologias para facilitar o de

Resumo DevMan
De que se trata o artigo:
O artigo mostra a integrao dos frameworks JSF 2, Spring e Hibernate na arquitetura de projetos web e a
utilizao da ferramenta Maven como agente facilitador desta integrao. Tambm so discutidas as vantagens
e caractersticas de cada componente utilizado.

Em que situao o tema til:


O conjunto de ferramentas e frameworks apresentados mostra uma dentre as tantas possveis combinaes
de tecnologias do mundo Java. A soluo apresentada pode servir como arquitetura de um projeto de sistema
web ou servir como um comparativo com outras tecnologias disponveis.

Maven, JSF 2, Spring e Hibernate:


Apresentaremos neste artigo a construo de uma aplicao web que faz uso de poderosos frameworks e
ferramentas Java: Maven, JSF 2, Spring e Hibernate. Sero abordados os fundamentos por trs de cada uma
destas tecnologias e ser apresentado o motivo de suas escolhas. Sero discutidos tambm os passos para
integrao das mesmas e a demonstrao de suas capacidades de forma bastante prtica. O exemplo cons-
trudo, apesar de simples, aborda tpicos avanados no desenvolvimento de sistemas Java, como injeo de
dependncia, controle transacional, Ajax e mapeamento objeto relacional. Alm disso, embora o exemplo
use especificamente as tecnologias citadas, o artigo emprega boas prticas de arquitetura de software para
fornecer baixo acoplamento entre os seus componentes, possibilitando uma fcil expanso ou mudana
das tecnologias.

N
este artigo construiremos um sentada e discutida mais frente no artigo
exemplo que mostrar de forma e a razo principal da escolha desta fer-
objetiva a arquitetura de uma ramenta no desenvolvimento da aplicao
aplicao Web que envolve a integrao exemplo que iremos construir.
das seguintes tecnologias do mundo Java: JSF o framework Java padro para a
Maven, JSF 2, Spring e Hibernate. construo de aplicaes web a partir da
Maven uma ferramenta pertencente verso Java EE 5. uma especificao para
ao grupo Apache que tem como finali- o desenvolvimento de interfaces web utili-
dade o gerenciamento e a automao de zando uma arquitetura voltada a compo-
projetos Java. De acordo com o prprio nentes. Assim, na definio de uma pgina
site do Maven, a ferramenta tem os se- web utilizamos componentes JSF dentro
guintes objetivos: prover um padro para desta pgina sem a necessidade de escre-
desenvolvimento de aplicaes; criar vermos cdigo HTML. O desenvolvimento
mecanismos para uma clara definio do de pginas pode ser simplesmente baseado
contedo do projeto; facilitar a publicao na ao de pegar e arrastar componentes
de informaes do projeto; e possibilitar na tela. Este framework faz uso do bom e
o compartilhamento de bibliotecas entre velho padro ModeloVisoControlador
vrios projetos. Um dos principais servios (MVC) na sua arquitetura, o que ajuda na
providos pelo Maven o gerenciamento de manuteno do cdigo. E pelo fato do JSF
dependncias. Esta facilidade ser apre- ser apenas uma especificao, voc pode

6 Java Magazine Edio 101


O artigo visa demonstrar a

bernate possvel combinao Maven +


JSF 2 + Spring + Hibernate na
arquitetura de projetos web

senvolvimento web
Edwins Leonardi

escolher a implementao que mais lhe agradar. Neste artigo dos dados do nosso projeto se deve ao fato de ele ser o framework
utilizaremos a implementao de referncia do JSF 2, o Mojarra. ORM Java mais consolidado do mercado e implementar a especi-
O JSF 2 a mais nova especificao do framework e traz enormes ficao padro Java EE para persistncia, o JPA.
melhorias em comparao com as verses anteriores. Algumas At o momento realizamos apenas breves introdues do
destas melhorias sero abordadas ao longo do artigo. potencial das tecnologias que sero utilizadas neste artigo.
Spring um framework de desenvolvimento Java que emer- Quando integradas, Maven, JSF, Spring e Hibernate tornam-
giu em 2003 como uma alternativa ao ento conturbado EJB se um poderoso conjunto na arquitetura de aplicaes Web,
(Enterprise JavaBeans). Este framework tem como paradigma o possibilitando um desenvolvimento rpido e robusto de apli-
desenvolvimento gil e leve, baseado em POJO (Plain Old Java caes. Agora estamos prontos para iniciarmos a construo
Objects). Ele prov um ecossistema completo de desenvolvi- da aplicao exemplo!
mento, possibilitando o seu uso em diversos tipos de aplicati-
vos. O Spring possibilita uma simples integrao com outros Especificao do exemplo e Ambiente de Desenvolvimento
frameworks Java, como por exemplo, Struts, JSF e Hibernate. Utilizaremos como exemplo de integrao das ferramentas e
Tambm permite o uso de servios do padro Java EE, como por frameworks citados a criao de uma aplicao Web bastante
exemplo, JPA, JMS, JTA, entre outros. Alm disso, implementa simples. Esta aplicao mantm o cadastro de clubes e atletas de
e possibilita o uso de boas prticas de programao, como futebol, e daremos a ela o nome de Onze Vencedor uma aluso
inverso de controle e programao orientada a aspectos. A ao clssico jogo de futebol Winning Eleven.
essncia do Spring est no seu container de IoC (Inversion of Teremos apenas duas telas na nossa aplicao: uma para a manu-
Control), que um ambiente responsvel por criar, gerenciar e teno de clubes e outra para a manuteno de atletas. Estas telas
injetar os objetos de uma aplicao. Em suma, o Spring um oferecem as operaes CRUD para insero, leitura, alterao e
framework completo que agiliza bastante o desenvolvimento excluso de registros. Alm disso, as telas possuem dois modos
de uma aplicao. A escolha do mesmo em nossa arquitetura distintos: um de edio, usado na incluso e alterao; e outro
se justifica pelo uso do seu poderoso IoC container, da sua in- para pesquisa de registros.
tegrao com JPA (Hibernate) e do fcil e transparente controle O diagrama de classes da nossa aplicao pode ser visto na
transacional provido pelo framework. Figura 1. Note que existe uma agregao entre as classes Clube e
O JPA (Java Persistence API) a especificao padro do Java para Atleta, onde definimos que um clube tem vrios atletas e um atle-
persistncia. Ela define como deve ser feito o mapeamento de um ta pertence a apenas um clube. A classe Atleta tambm tem uma
modelo orientado a objetos para um banco de dados relacional. associao com um tipo enumerado chamado Posicao, que mantm
Como JPA apenas uma especificao, assim como JSF, existem as possveis posies que um atleta de futebol pode ter.
vrios frameworks que o implementam, dentre eles, destacamos Por fim, a nossa aplicao ter um banco de dados relacional
Hibernate, TopLink e JDO. Frameworks deste tipo so chamados para o armazenamento dos dados, e para tal, utilizaremos o banco
de ORM (Object-Relational Mapping). Para a construo do nosso de dados MySQL.
exemplo, usaremos a implementao JPA do Hibernate. O servio O nosso ambiente de desenvolvimento contar com a IDE Eclipse
prestado pelo JPA uma camada de abstrao para o acesso e Indigo 3.7 e com o servidor Web Apache Tomcat 7. As instalaes
manipulao dos dados relacionais do banco de dados de uma do MySQL, Eclipse e Tomcat 7 esto fora do escopo deste artigo,
maneira orientada a objetos. Esta camada de abstrao prov um por isso, para detalhes sobre a instalao destes programas, con-
caminho bidirecional no qual os dados relacionais (colunas das sulte a seo Links.
tabelas) so transformados em objetos do nosso modelo e vice- Utilizaremos o Maven na fase de desenvolvimento para o ge-
versa. Um objeto JPA mapeado para uma tabela do banco de dados renciamento de dependncias e para a distribuio do projeto em
chamado de entidade. O JPA tambm oferece o Entity Manager ou um arquivo WAR. Para uma melhor produtividade recomenda-se
gerenciador de entidades, que responsvel por abstrair as opera- a integrao do mesmo IDE utilizada. No entanto, o Eclipse
es relacionais do banco de dados de insero, leitura, alterao no oferece suporte nativo ao desenvolvimento com Maven,
e excluso, comumente chamadas de operaes CRUD (Create, portanto, adicionaremos IDE um plugin chamado M2Eclipse.
Read, Update e Delete). A escolha do Hibernate na persistncia Este plugin acrescenta ao Eclipse a capacidade de criar, impor-

Edio 101 Java Magazine 7


Maven, JSF 2, Spring e Hibernate

tar e gerenciar projetos Maven. Os detalhes de como instalar o das no banco de dados. A utilizao do mesmo um bom padro
plugin M2Eclipse podem ser encontrados na Edio 93 da Java de desenvolvimento, pois separa as regras de negcio da aplicao
Magazine, no artigo Alm da IDE Parte 2, e tambm no site do das operaes de manipulao do banco de dados.
plugin (veja a seo Links). Os nossos objetos DAO fazem uso de um objeto do tipo EntityMa-
nager, que criado pelo Hibernate e injetado pelo Spring no DAO.
Falaremos sobre o EntityManager mais adiante no artigo.
O fluxo da aplicao inicia-se na camada de viso por algum
evento disparado pelo usurio na pgina JSF. O managed bean que
atua como controlador, recebe tal evento, validando a entrada de
dados e chamando a camada de servio para efetuar a operao
desejada. A camada de servio, assim, pode vir a chamar a camada
DAO se a operao envolver acesso a banco de dados. Por fim, o
modelo atualizado na camada de servios que devolve o modelo
atualizado para a camada de viso aps o final da operao.
Os componentes da arquitetura que montaremos e suas intera-
es podem ser visualizados na Figura 2.

Figura 1. Diagrama de classes da aplicao de exemplo

Arquitetura do projeto
Embora a especificao da aplicao de exemplo do nosso artigo
seja simples por conter apenas operaes CRUD, faremos uso de
uma boa arquitetura de sistemas utilizando padres que possi-
bilitem uma fcil expanso do cdigo futuramente.
O cdigo ter uma diviso lgica utilizando o padro arqui-
tetural MVC (Modelo-Viso-Controle). Na camada de viso da
aplicao teremos as pginas JSF que iro conter os componentes
visuais da aplicao, como o caso de formulrios, botes, texto,
entre outros.
JSF faz uso de beans Java para possibilitar a separao do cdigo
de apresentao do cdigo de negcio. Por sua vez, uma pgina Figura 2. Componentes da arquitetura do projeto
JSF referencia um ou mais beans, que so classes Java que arma-
zenam o cdigo de negcio que deve ser invocado pelas pginas Criao do projeto Maven
da aplicao. Estes beans tm seu ciclo de vida gerenciado pelo Agora que foi apresentado o exemplo e a arquitetura que iremos
JSF, sendo assim chamados de Managed Beans. utilizar, vamos criao do projeto Maven. Utilizaremos para
Os managed beans do JSF fazem o papel de controladores da este passo o Eclipse, que j deve estar com o plugin M2Eclipse
nossa aplicao. Eles recebem um estmulo da camada de viso devidamente configurado.
para a execuo de alguma operao e em seguida delegam esta Deste modo, abra o Eclipse e clique em File > New > Other, sele-
execuo classe de negcio responsvel. Aps a execuo da cione a opo Maven Project, que se encontra dentro da categoria
regra de negcio o controlador repassa o resultado da operao Maven, e clique no boto Next. Na prxima tela mostrada nenhuma
camada de viso. configurao precisa ser feita, ento podemos prosseguir clicando
J a camada de modelo do nosso exemplo representada pelas no boto Next.
classes de entidades JPA que so mostradas na Figura 1. Agora chegamos etapa mais importante da criao do projeto
Alm destas, teremos uma camada de servio (Facade) que im- Maven: a definio do arqutipo (archetype). Arqutipos Maven
plementa as regras de negcio da aplicao. A camada de servio so templates de projetos. O Maven utiliza o arqutipo escolhido
visa encapsular, isolar o cdigo de negcio da aplicao, sendo e cria um projeto com uma estrutura bsica.
considerada uma boa prtica por facilitar o reuso o cdigo. Para o nosso exemplo utilizaremos um arqutipo de projeto Web.
Por ltimo temos a camada de persistncia DAO (Data Access Na tela apresentada, digite no campo filter o nome maven-archetype-
Object). Os objetos DAO so responsveis pelas operaes realiza- webapp, selecione este arqutipo e clique em Next. Na tela seguinte,

8 Java Magazine Edio 101


defina o Group Id = br.com.javamagazine, Artifact Id = OnzeVencedor, Version = podem existir problemas de incompatibilidade entre as verses
1.0-SNAPSHOT e package = br.com.javamagazine.onzevencedor. Pronto, nosso das bibliotecas utilizadas.
projeto Web est criado. O gerenciamento de dependncias do Maven se mostra muito
Feito isso o Maven criou um projeto no Eclipse com convenes til na resoluo dos problemas citados. As dependncias do
de diretrios e arquivos que so definidos no arqutipo maven- projeto so criadas declarativamente no arquivo pom.xml como
archetype-webapp. Atravs do uso de plugins o Maven possibilita mostrado na Listagem 1 dentro da tag <dependency>. As depen-
que voc crie seus prprios arqutipos com as convenes que dncias declaradas no arquivo POM so resolvidas pelo Maven
desejar. Note que alm de diretrios padres em aplicaes Web de forma transparente ao desenvolvedor. O Maven se conecta a
Java, como por exemplo, o diretrio WEB-INF, o Maven tambm um repositrio remoto, faz o download das dependncias e as
criou o arquivo de configurao web.xml e uma pgina inicial adiciona automaticamente ao classpath do projeto. Note que para
chamada index.jsp. A estrutura do projeto criada pelo Maven pode declarar uma dependncia no arquivo pom.xml necessrio infor-
ser vista na Figura 3. mar um valor s propriedades: groupId, que seria a identificao
de um grupo de artefatos; artifactId, que seria a identificao de
um artefato; e version, que indica a verso do artefato.
Alm de fazer o download das bibliotecas especificadas no ar-
quivo pom.xml, o Maven tambm baixa as dependncias que estas
bibliotecas possuem. Por exemplo, considere a Listagem 1. Ns
declaramos a dependncia da biblioteca hibernate-core e o Maven
automaticamente trouxe as dependncias que esta biblioteca
possui (antlr, commons-collections, dom4j, jta e slf4j-api).

- possvel no Eclipse verificar a hierarquia das dependncias do projeto abrindo


o arquivo pom.xml na aba Dependency Hierarchy. bom salientar que o Maven
em nosso projeto resolve todas as dependncias existentes e no apenas as do
Hibernate e Spring.

Figura 3. Estrutura do projeto criado usando o Maven

A adoo do Maven no desenvolvimento do projeto foi escolhi-


da para facilitar o gerenciamento de dependncias existente em
nossa aplicao. As dependncias de um projeto so as bibliotecas
essenciais ao seu correto funcionamento.
Como iremos utilizar em nossa arquitetura o Spring e o Hiber-
nate, e estes dois tm um grande nmero de dependncias com
bibliotecas externas, muitas vezes o uso destes frameworks em
um projeto no tarefa fcil.
Primeiramente para fazer uso destes frameworks ns deve-
ramos adicionar todos os arquivos JAR necessrios na pasta
WEB-INF/lib do projeto, o que representa, em nosso exemplo,
mais de 30 arquivos JAR. Outro ponto de dificuldade que
antes de adicionar estes arquivos ao projeto preciso baix-los
da internet. Nas verses mais recentes do Spring e do Hibernate
no so empacotados junto com suas distribuies as dependn-
cias externas existentes, o que significa que quem for utilizar o
framework dever procurar pelas dependncias e baix-las por
conta prpria. Esta tarefa no nada divertida e muitas vezes o
desenvolvedor s descobre a falta de uma dependncia em tempo
de execuo quando a aplicao estiver rodando. Ainda assim

Edio 101 Java Magazine 9


Maven, JSF 2, Spring e Hibernate

Listagem 1. Contedo do arquivo pom.xml


<project xmlns=http://maven.apache.org/POM/4.0.0 <version>${org.springframework.version}</version>
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance </dependency>
xsi:schemaLocation=http://maven.apache.org/POM/4.0.0 <dependency>
http://maven.apache.org/maven-v4_0_0.xsd> <groupId>org.springframework</groupId>
<modelVersion>4.0.0</modelVersion> <artifactId>spring-jdbc</artifactId>
<groupId>br.com.javamagazine</groupId> <version>${org.springframework.version}</version>
<artifactId>OnzeVencedor</artifactId> </dependency>
<packaging>war</packaging> <dependency>
<version>1.0-SNAPSHOT</version> <groupId>org.springframework</groupId>
<name>OnzeVencedor Maven Webapp</name> <artifactId>spring-orm</artifactId>
<url>http://maven.apache.org</url> <version>${org.springframework.version}</version>
<properties> </dependency>
<org.springframework.version>3.0.6.RELEASE</org.springframework.version> <dependency>
</properties> <groupId>org.springframework</groupId>
<dependencies> <artifactId>spring-web</artifactId>
<dependency> <version>${org.springframework.version}</version>
<groupId>com.sun.faces</groupId> </dependency>
<artifactId>jsf-api</artifactId> <dependency>
<version>2.1.6</version> <groupId>org.hibernate</groupId>
</dependency> <artifactId>hibernate-entitymanager</artifactId>
<dependency> <version>3.4.0.GA</version>
<groupId>com.sun.faces</groupId> </dependency>
<artifactId>jsf-impl</artifactId> <dependency>
<version>2.1.6</version> <groupId>org.hibernate</groupId>
</dependency> <artifactId>hibernate-validator</artifactId>
<dependency> <version>4.0.2.GA</version>
<groupId>javax.servlet</groupId> </dependency>
<artifactId>jstl</artifactId> <dependency>
<version>1.2</version> <groupId>mysql</groupId>
</dependency> <artifactId>mysql-connector-java</artifactId>
<dependency> <version>5.1.15</version>
<groupId>javax.persistence</groupId> </dependency>
<artifactId>persistence-api</artifactId> <dependency>
<version>1.0</version> <groupId>cglib</groupId>
</dependency> <artifactId>cglib-nodep</artifactId>
<dependency> <version>2.2.2</version>
<groupId>org.springframework</groupId> </dependency>
<artifactId>spring-core</artifactId> <dependency>
<version>${org.springframework.version}</version> <groupId>org.slf4j</groupId>
</dependency> <artifactId>slf4j-api</artifactId>
<dependency> <version>1.6.1</version>
<groupId>org.springframework</groupId> </dependency>
<artifactId>spring-expression</artifactId> <dependency>
<version>${org.springframework.version}</version> <groupId>org.slf4j</groupId>
</dependency> <artifactId>slf4j-simple</artifactId>
<dependency> <version>1.6.1</version>
<groupId>org.springframework</groupId> </dependency>
<artifactId>spring-beans</artifactId> <dependency>
<version>${org.springframework.version}</version> <groupId>asm</groupId>
</dependency> <artifactId>asm-commons</artifactId>
<dependency> <version>3.1</version>
<groupId>org.springframework</groupId> </dependency>
<artifactId>spring-aop</artifactId> </dependencies>
<version>${org.springframework.version}</version> <build>
</dependency> <finalName>OnzeVencedor</finalName>
<dependency> <plugins>
<groupId>org.springframework</groupId> <plugin>
<artifactId>spring-context</artifactId> <groupId>org.apache.maven.plugins</groupId>
<version>${org.springframework.version}</version> <artifactId>maven-pmd-plugin</artifactId>
</dependency> <version>2.5</version>
<dependency> <configuration>
<groupId>org.springframework</groupId> <targetJdk>1.6</targetJdk>
<artifactId>spring-context-support</artifactId> </configuration>
<version>${org.springframework.version}</version> </plugin>
</dependency> </plugins>
<dependency> </build>
<groupId>org.springframework</groupId> </project>
<artifactId>spring-tx</artifactId>

10 Java Magazine Edio 101


Esta caracterstica do Maven excelente para um trabalho co- A configurao da aplicao est presente no arquivo web.xml,
laborativo de uma equipe que atua no desenvolvimento de um que no nosso caso est localizado na pasta src/main/webapp/WEB-
mesmo projeto. As dependncias do projeto so criadas uma INF. A Listagem 3 traz o contedo do mesmo. Este arquivo o
vez no arquivo pom.xml e posteriormente apenas este arquivo deployment descriptor da nossa aplicao. Ele orienta o servidor
compartilhado entre a equipe. No existe a necessidade de com- web a como configurar a aplicao.
partilhar toda a biblioteca de dependncias. Inclusive o cdigo
do exemplo deste artigo, disponvel no site da Java Magazine, no Listagem 2. Roteiro com os comandos para a criao do banco de dados da aplicao.
contm as bibliotecas, mas apenas a definio das dependncias
no arquivo pom.xml. create database OnzeVencedorDB;

Agora que entendemos um pouco sobre o servio de gerencia- connect OnzeVencedorDB;


mento de dependncias provido pelo Maven, vamos adicionar ao
nosso projeto bibliotecas do JSF 2, Spring, Hibernate e MySQL. create table Clube(
IDF_CLUBE INTEGER auto_increment NOT NULL
A Listagem 1 contm a definio que deve ser includa em nos-
,NOME VARCHAR(40) NOT NULL
so arquivo pom.xml, que est presente na raiz do projeto. Aps ,CONSTRAINT PRIMARY KEY(IDF_CLUBE)
salvar o arquivo, verifique a presena das bibliotecas no Project );
Explorer, dentro de Maven Dependencies. Estas dependncias foram
create table Atleta(
baixadas automaticamente pelo Maven e j esto disponveis ao IDF_ATLETA INTEGER auto_increment NOT NULL
nosso projeto. ,NOME VARCHAR(40) NOT NULL
Agora iremos adicionar ao projeto um source folder, que ir con- ,DTA_NASCIMENTO DATE NOT NULL
,IDF_CLUBE INTEGER NOT NULL
ter as classes Java. Deste modo, selecione a pasta src/main/resources
,IDF_POSICAO INTEGER NOT NULL
e com o boto direito clique em New > Source Folder. O valor da ,CONSTRAINT PRIMARY KEY(IDF_ATLETA)
propriedade Project name deve ser igual a OnzeVencedor e o );
valor da propriedade Folder name deve ser igual a src/main/java.
ALTER TABLE Atleta ADD CONSTRAINT FK_CLUBE_ATLETA
Pronto, nosso projeto est criado e pronto para ser codificado. FOREIGN KEY (IDF_CLUBE) REFERENCES Clube(IDF_CLUBE);

- O projeto recm-criado no Eclipse oferece suporte da IDE ao Maven, mas algumas Listagem 3. Arquivo de configurao do Servlet container, web.xml.

facilidades como as funes de auto completar na criao de pginas JSF no esto


<?xml version=1.0 encoding=UTF-8?>
habilitadas. Para oferecer tais facilidades ao projeto execute os seguintes passos: <web-app version=3.0 xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
clique com o boto direito sobre o projeto, depois em Properties > Project Facets. xmlns=http://java.sun.com/xml/ns/javaee
Acesse o link Convert to faceted form..., em seguida selecione a opo Dynamic xmlns:web=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee
Web Module e clique no link Further configuration available... Mude a propriedade
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd
Content Directory para src/main/webapp, clique no boto Ok e depois no boto id=WebApp_ID>
Apply. Agora cheque a opo JavaServer Faces e acesse o link Further configuration <display-name>OnzeVencedor</display-name>
available... Na seo chamada JSF Implementation Library, deixe a lista Type com <!-- Configuracao do Spring -->
<context-param>
o valor igual a Disable Library Configuration. Para encerrar, clique no boto Ok,
<param-name>contextConfigLocation</param-name>
depois no boto Apply e finalmente no boto Ok novamente. <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
Criao do Banco de Dados <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
Para a persistncia dos dados do nosso projeto devemos criar um
</listener-class>
banco de dados relacional. Assim, aps a instalao do MySQL </listener>
(veja Links), abra o programa utilitrio MySQL Command Line <!-- Configuracao DO JSF -->
Client. Uma tela de prompt ser mostrada e a senha do banco <servlet>
<servlet-name>Faces Servlet</servlet-name>
dever ser fornecida. Em seguida digite sequencialmente os
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
comandos mostrados na Listagem 2. Dessa forma criamos um <load-on-startup>1</load-on-startup>
banco de dados chamado OnzeVencedorDB que possui duas </servlet>
tabelas: Clube e Atleta. <servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
Integrao JSF2, Spring e Hibernate <url-pattern>/faces/*</url-pattern>
Chegamos parte que o tema principal deste artigo, a inte- </servlet-mapping>
grao dos frameworks supracitados. Este tpico ir se resumir <welcome-file-list>
<welcome-file>index.jsf</welcome-file>
edio dos arquivos XML de configurao da aplicao web, do
</welcome-file-list>
JSF, do Spring e do Hibernate, sendo, respectivamente, web.xml, </web-app>
faces-config.xml, applicationContext.xml e persistence.xml.

Edio 101 Java Magazine 11


Maven, JSF 2, Spring e Hibernate

Configurao do JSF senha definidos no banco de dados devem ser informados cor-
No arquivo web.xml tambm feita uma configurao para retamente nas propriedades username e password, respectivamente.
habilitar o JSF a atuar como front controller da nossa aplicao, Observe que a classe Spring que implementa a interface DataSource
ou seja, o JSF quem vai receber as requisies direcionadas ao DriverManagerDataSource. Esta classe muito simples e cria uma
nosso site. Esta configurao realizada na definio da servlet nova conexo a cada vez que uma solicitada. Para ilustrao do
Faces Servlet. Note que o JSF ser usado em requisies a pginas nosso exemplo ela suficiente, mas em ambientes de produo
com os seguintes padres de URL: *.jsf e /faces/*. Dessa forma, uma alternativa deve ser utilizada, como por exemplo, um pool de
devemos ter este padro em mente quando formos referenciar conexes. Um pool de conexes um agrupamento de conexes com
uma pgina da nossa aplicao atravs de hyperlinks. o banco de dados que ficam aguardando at serem requisitadas
pela aplicao. Quando uma conexo requisitada uma das cone-
Configurao do Spring xes disponveis no pool movida e utilizada pela aplicao para
Ns utilizaremos o Spring para gerenciar os nossos objetos de executar alguma tarefa no banco de dados. Ao final da operao
negcio, para gerenciar os objetos de acesso a dados e para a rea- a conexo volta ao pool e pode servir a outras requisies. O uso
lizao do controle transacional da aplicao. Para isso, devemos do pool de conexes otimiza a performance da aplicao pois
inicializar o contexto do Spring juntamente com a inicializao da conexes no so criadas a todo o momento. Solues abertas
aplicao. Fazemos isto tambm no arquivo web.xml, acrescentando que provm o servio de pool de conexes so o Apache Commons
um ouvinte para inicializao do contexto do Spring. O ouvinte DBCP e C3PO;
responsvel por isso chama-se ContextLoaderListener. Note tambm <bean id=entityManagerFactory>: cria um bean do tipo javax.persistence.
que existe um parmetro dentro do nosso arquivo web.xml chamado EntityManagerFactory utilizando o Hibernate como provedor. Este bean
contextConfigLocation, com o valor igual a /WEB-INF/applicationContext. criado pelo Spring pode ser injetado em outros beans ou ser integra-
xml. Este parmetro relativo ao nome do arquivo de configurao do a outros componentes Spring. Note a definio da propriedade
do Spring. Poderamos ter dado um nome qualquer para ele. persistenceUnitName. O valor desta dever ser informado no arquivo de
Em seguida iremos criar o arquivo de configurao do Spring. configurao do Hibernate, que criaremos a seguir;
Como definido no web.xml, este arquivo deve se chamar applica- Por ltimo, no arquivo de configurao do Spring, temos a tag
tionContext.xml e ser criado no folder src/main/webapp/WEB-INF. <bean id=transactionManager>, que cria um bean do Spring respon-
Este arquivo contm a configurao necessria para instanciar o svel pelo gerenciamento das transaes da aplicao.
Spring IoC container, que ser responsvel por criar e gerenciar
nossos beans e tambm por injet-los em outros beans. Configurao do Hibernate
Beans so como so chamados os objetos gerenciados pelo Agora vamos criar o arquivo de configurao do Hibernate (JPA).
Spring. Os beans no contexto do Spring so simples POJOs (Plain Primeiramente ser necessria a criao de uma pasta META-INF
Old Java Objects), ou seja, so objetos simples que no precisam na raiz do source folder Java. Assim, no Project Explorer do Eclip-
implementar uma interface ou estender uma classe base especfica se, selecione a pasta src/main/java. Com o boto direito clique em
para que funcionem. New > Other, escolha a opo Folder que est dentro da categoria
O contedo do arquivo applicationContext.xml mostrado na General, defina o nome do novo folder como META-INF e den-
Listagem 4. Vamos analisar as principais tags deste arquivo: tro deste folder crie o arquivo persistence.xml com o contedo da
<context:annotation-config />: informa que iremos usar anotaes Listagem 5. Este bem pequeno e contm apenas a definio do
para definir os objetos (beans) que sero gerenciados pelo Spring. nome da unidade persistente. Uma unidade persistente contm
Podemos configurar os nossos beans do Spring em arquivos XML, um conjunto de classes persistentes e as regras de como elas
arquivos properties ou usando anotaes; devem ser persistidas. Note que o nome utilizado neste arquivo
< context:component-scan>: define em sua propriedade base-package referenciado no arquivo de configurao do Spring dentro da
um pacote da aplicao como ponto de partida para que o Spring configurao da fonte de dados da aplicao.
faa uma busca por objetos anotados como beans Spring. A pro-
cura ocorrer a partir do pacote indicado incluindo sub pacotes; Integrao JSF e Spring
<tx:annotation-driven />: indica que usaremos anotaes para fazer o At aqui j temos criado as integraes para o Banco de Dados,
gerenciamento transacional declarativo nos mtodos que precisam Hibernate e Spring. Finalmente vamos realizar a ltima integrao
de controle de transaes. Mtodos anotados com @Transactional que falta para que nossa aplicao tire proveito de todos estes
tm controle transacional efetuado pelo Spring; frameworks, a integrao entre JSF e Spring.
<bean id=dataSource>: cria um bean que implementa javax.sql.Data- Cada pgina JSF referencia propriedades armazenadas em ob-
Source. Um objeto DataSource responsvel por criar conexes com jetos chamados managed beans (beans gerenciados). Estes beans
o banco de dados. Este bean criado pelo Spring pode ser injetado contm, alm das propriedades das pginas, chamadas para a
em outros beans ou ser integrado a outros componentes Spring. lgica de negcio da aplicao. No contexto do JSF, os managed
Um ponto importante que dentro desta tag existem os parme- beans armazenam o estado das pginas web. A criao e a ma-
tros de conexo com o banco de dados. Desta forma, o usurio e nipulao dos beans gerenciados so tarefas realizadas pelo JSF.

12 Java Magazine Edio 101


Listagem 4. Arquivo de configurao do Spring, applicationContext.xml. Como citado acima, os managed beans so responsveis por fazer a
chamada dos mtodos de negcio da aplicao. No entanto, os objetos
<?xml version=1.0 encoding=UTF-8?>
que armazenaro nossa lgica de negcios sero beans do Spring. En-
<beans xmlns=http://www.springframework.org/schema/beans
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance to precisamos de algum mecanismo para poder usar os nossos beans
xmlns:context=http://www.springframework.org/schema/context gerenciados pelo Spring nos managed beans gerenciados pelo JSF.
xmlns:tx=http://www.springframework.org/schema/tx Isto pode ser feito definindo uma expression language dentro
xsi:schemaLocation=http://www.springframework.org/schema/beans
do arquivo de configurao do JSF, faces-config.xml, como mostra
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
a Listagem 6. Este arquivo precisa ser criado na pasta src/main/
http://www.springframework.org/schema/context/spring-context-3.0.xsd webapp/WEB-INF. A expression language determinada capaz de
http://www.springframework.org/schema/tx resolver os beans do Spring dentro do contexto do JSF, ou seja,
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd>
poderemos usar os nossos objetos gerenciados pelo Spring dentro
<!-- Seta anotaoes para serem usadas pelo Spring -->
<context:annotation-config />
dos managed beans gerenciados pelo JSF.
<!-- Define o pacote onde o Spring vai procurar por beans anotados -->
<context:component-scan base-package=br.com.javamagazine.onzevencedor.
service,br.com.javamagazine.onzevencedor.dao /> Listagem 6. Arquivo de configurao JSF, faces-config.xml.
<!-- define que as transaoes irao ser anotadas -->
<?xml version=1.0 encoding=UTF-8?>
<tx:annotation-driven />
<faces-config
<!-- Configuracao do Banco de Dados -->
xmlns=http://java.sun.com/xml/ns/javaee
<bean id=dataSource
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
class=org.springframework.jdbc.datasource.DriverManagerDataSource>
xsi:schemaLocation=http://java.sun.com/xml/ns/javaee
<property name=driverClassName value=com.mysql.jdbc.Driver />
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd
<property name=url value=jdbc:mysql://localhost:3306/OnzeVencedorDB />
version=2.0>
<property name=username value=USUARIO />
<application>
<property name=password value=SENHA />
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver
</bean>
</el-resolver>
<!-- Configuracao do Hibernate -->
</application>
<bean id=entityManagerFactory
</faces-config>
class=org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean>
<property name=persistenceUnitName value=onzeVencedorPu />
<property name=dataSource ref=dataSource />
<property name=jpaVendorAdapter>
<bean class=org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
Desenvolvendo a aplicao
<property name=databasePlatform Depois de muita configurao de ambiente e dos frameworks
value=org.hibernate.dialect.MySQLDialect /> utilizados em nossa arquitetura, chega a hora de gastar tempo
<property name=showSql value=true /> com o que realmente interessa: a codificao da nossa aplicao.
</bean>
Como apresentado anteriormente, o nosso exemplo ser um
</property>
</bean> sistema Web com operaes de CRUD. Embora simples, o exemplo
<!-- Configuracao do gerente de transacoes do Spring --> abordar tpicos importantes no desenvolvimento de sistemas,
<bean id=transactionManager class=org.springframework.orm.jpa. como controle transacional, Ajax, inverso de controle, arquitetura
JpaTransactionManager>
de sistemas, entre outros.
<property name=entityManagerFactory ref=entityManagerFactory />
</bean> Na aplicao, o nosso modelo ter apenas duas entidades: Clube
</beans> e Atleta. Entretanto, por questes de espao, ser mostrado nas
listagens apenas o cdigo de implementao do CRUD de clubes.
Listagem 5. Arquivo de configurao Hibernate(JPA), persistence.xml.
O leitor, baseado neste cdigo, desafiado a criar o cdigo de
<?xml version=1.0 encoding=UTF-8?> implementao do CRUD de atletas.
<persistence:persistence version=2.0
xmlns:persistence=http://java.sun.com/xml/ns/persistence - Vale ressaltar que o cdigo completo da aplicao pode ser baixado no site da
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
Java Magazine.
xsi:schemaLocation=http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd >
<persistence:persistence-unit name=onzeVencedorPu/> Entidades JPA (Model)
</persistence:persistence> Comearemos a implementao do cdigo pela criao das en-
tidades JPA. Para facilitar o desenvolvimento do CRUD de atletas
por parte do leitor, alm do cdigo da entidade Clube, tambm ser
Vale ressaltar neste ponto a importncia da distino dos beans fornecido o cdigo da entidade Atleta. As Listagens 7 e 8 mostram
do Spring e dos managed beans do JSF no artigo. O termo managed a definio destas entidades, respectivamente. Adicionalmente,
bean faz referncia aos beans do JSF, enquanto o termo bean diz temos uma enum chamada Posicao que armazena as posies em
respeito aos beans do Spring. que um jogador de futebol pode atuar (veja a Listagem 9).

Edio 101 Java Magazine 13


Maven, JSF 2, Spring e Hibernate

- Ateno, os imports e os mtodos getters e setters foram omitidos, mas devem A anotao @Id define a propriedade que ser o identificador
ser criados! nico da classe e da tabela. Esta anotao obrigatria. Note que
o nome da propriedade na classe Clube que est anotada com @Id
Repare na anotao @Entity. Ela declara a classe como persis- idf. uma boa prtica definir uma propriedade id com um valor
tente e gerenciada pelo Hibernate. Alm dela, poderamos ter gerado automaticamente, pois ela no deve ser alterada nunca.
tambm a definio da anotao @Table, que define qual o nome A anotao @Column faz o mapeamento entre a propriedade na
da tabela no banco de dados ao qual a classe ser mapeada. classe persistente e a coluna no banco de dados. Novamente na
Omitimos esta anotao porque por padro o JPA tenta mapear classe Clube, ainda na propriedade idf, repare que o nome da coluna
a classe a uma tabela de mesmo nome, como acontece no nosso mapeada propriedade igual a IDF_CLUBE, conforme o cdi-
caso, onde os nomes das tabelas clube e atleta so iguais aos go: @Column(name=IDF_CLUBE). Se o nome da coluna na tabela fosse
nomes das entidades. Se tivssemos uma tabela com o nome igual ao nome da propriedade na classe persistente, a anotao
TB_CLUBE, por exemplo, usaramos a seguinte anotao: @Column poderia ser omitida.
@Table(name=TB_CLUBE). A anotao @GeneratedValue(strategy=GenerationType.IDENTITY) informa
ao JPA que o valor da propriedade idf no dever ser fornecido, pois
ser gerado automaticamente pelo banco. Esta anotao possui
Listagem 7. Cdigo da entidade Clube. uma propriedade chamada strategy, que indica a estratgia para
a gerao automtica do valor. As seguintes estratgias podem
package br.com.javamagazine.onzevencedor.entity;
ser utilizadas:
//imports omitidos
@Entity I DENTITY = Coluna identidade que gerada pelo banco de dados;
public class Clube implements Serializable{ SEQUENCE = Nome de uma sequence utilizada pelo banco de dados;
@Id TABLE = Nome de uma tabela no banco de dados que armazena
@Column(name=IDF_CLUBE)
o valor a ser utilizado;
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer idf; AUTO = O JPA automaticamente tenta escolher a melhor dentre
@Column(name=NOME) as opes disponveis.
private String nome;
@OneToMany(fetch=FetchType.LAZY, mappedBy=clube)
A anotao @Enumerated usada para o mapeamento de tipos
private List<Atleta> atletas;
//Getters and Setter omitidos enumerados. Na classe Atleta temos a definio do tipo enumerado
} para a propriedade posicao da seguinte forma: @Enumerated(EnumType.
ORDINAL). O EnumType.ORDINAL o valor padro. Ele indica que o valor
Listagem 8. Cdigo da entidade Atleta.
a ser gravado no banco de dados um valor numrico corres-
package br.com.javamagazine.onzevencedor.entity; pondente posio do valor na Enum. J EnumType.STRING indica
//imports omitidos que o valor a ser gravado no banco um texto correspondente
@Entity
ao valor da Enum.
public class Atleta implements Serializable{
@Id
Destacam-se tambm as anotaes @OneToMany na classe Clube
@GeneratedValue(strategy=GenerationType.IDENTITY) e @ManyToOne na classe Atleta. Estas anotaes denotam o tipo de
@Column(name=IDF_ATLETA) associao existente no nosso modelo, na qual um clube tem vrios
private Integer idf; atletas e vrios atletas pertencem a um clube. Nesta associao a
@Column(name=NOME)
private String nome;
classe Clube est ligada tabela clube, a qual tem uma chave es-
@Column(name=DTA_NASCIMENTO) trangeira que referencia a tabela atleta. Por isso, alm da anotao
@Temporal(TemporalType.DATE) @ManyToOne, a associao na classe Clube deve definir a anotao
private Date dtaNascimento; @JoinColumn. A anotao @JoinColumn define como o Hibernate far
@Column(name=IDF_POSICAO)
@Enumerated(EnumType.ORDINAL)
o relacionamento entre as duas tabelas no banco de dados, alm
private Posicao posicao; de definir o nome da coluna do relacionamento.
@ManyToOne
@JoinColumn(name=IDF_CLUBE) - importante salientar que toda entidade JPA obrigatoriamente deve ter um
private Clube clube;
construtor sem argumentos pblico ou protegido. Este construtor sem argumentos
//Getters and Setter omitidos
} utilizado pelo EntityManager para criao das entidades.

Listagem 9. Cdigo do Enum Posicao.


Spring Beans (Camada de Servio e DAO)
package br.com.javamagazine.onzevencedor.entity; Agora vamos criar os beans do Spring. Ns teremos duas cama-
public enum Posicao { das da nossa aplicao que sero gerenciadas pelo Spring, a cama-
Goleiro, Zagueiro, Lateral, Volante, Ponta, Meio_Campo, Atacante; da de servios e a camada DAO, representadas, respectivamente,
}
pelas classes ClubeService (Listagem 10) e ClubeDAO (Listagem 11).

14 Java Magazine Edio 101


Listagem 10. Cdigo do DAO gerenciado pelo Spring, ClubeDAO. Comeando pela classe ClubeDAO, observe a anotao @Repository.
Esta anotao um esteretipo do Spring que utilizado na
package br.com.javamagazine.onzevencedor.dao;
//import omitidos
camada de persistncia (DAOs). Quando um DAO anotado com
@Repository(clubeDao) @Repository as excees do JPA sero traduzidas em excees do tipo
public class ClubeDAO { DataAccessException do Spring, o que significa que no precisaremos
@PersistenceContext
protected EntityManager entityManager;
tratar a mensagens de erro do banco de dados.
@Transactional(readOnly=true) Para o Spring IoC container gerenciar seus componentes voc
public List<Clube> findAll(){ dever anot-los com um dos quatro esteretipos disponveis:
String jpql = SELECT c from Clube c order by c.nome;
Query query = entityManager.createQuery(jpql); @Component = esteretipo bsico de componente gerenciado pelo
List<Clube> clubes = (List<Clube>) query.getResultList(); Spring;
return clubes; @Service = esteretipo usado para componentes na camada de
}
@Transactional(readOnly=true) servios;
public List<Clube> findByName(String nomeClube){ @ Controller = esteretipo usado para componentes na camada de
String jpql = SELECT c from Clube c where nome like :nome order by c.nome;
apresentao;
Query query = entityManager.createQuery(jpql);
query.setParameter(nome, nomeClube + %); @Repository = esteretipo usado para componentes na camada de
List<Clube> clubes = (List<Clube>) query.getResultList(); persistncia.
return clubes;
}
@Transactional Outra anotao importante na nossa classe DAO @Persistence
public Clube create(Clube clube){ Context. Esta a anotao padro do JPA para a injeo do entity ma-
entityManager.persist(clube);
return clube;
nager, que o responsvel pelas operaes de insero, atualizao,
} deleo e consulta no banco de dados. O Spring automaticamente fa-
@Transactional brica um entity manager para a nossa classe atravs desta anotao
public void update(Clube clube){
entityManager.merge(clube); usando a configurao que foi definida no arquivo de configurao
} applicationContext.xml, na tag <bean id=entityManagerFactory>. Atravs
@Transactional desta tag definida a criao de uma fbrica de entity managers
public void delete(Clube clube){
clube = entityManager.find(Clube.class, clube.getIdf()); que sero criados pelo Spring utilizando a biblioteca do Hibernate
entityManager.remove(clube); chamada Hibernate EntityManager.
}
A anotao @Transactional informa que a execuo de um mtodo
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager; ter controle transacional, ou seja, ao entrar na execuo de um
} mtodo o Spring se encarrega de criar uma nova transao. Se a
}
execuo do mtodo chegar at o fim sem erros, o Spring ento
Listagem 11. Cdigo do bean gerenciado pelo Spring, ClubeService. faz um commit da transao. Na ocorrncia de algum erro durante
a execuo do mtodo, o Spring faz um rollback.
package br.com.javamagazine.onzevencedor.service;
Se um mtodo transacional, digamos o mtodo A(), dentro da
//imports omitidos
@Service(clubeService)
sua execuo chama algum outro mtodo transacional, digamos
public class ClubeService { o mtodo B(), a mesma transao utilizada na execuo dos dois.
@Autowired Em caso de algum erro ocorrer na execuo do mtodo B(), todas as
private ClubeDAO dao; operaes realizadas no mtodo A() sero invalidadas pelo rollback
public List<Clube> getAllClubes(){
return dao.findAll();
causado pelo erro do mtodo B().
} Analisaremos agora a classe ClubeService. Esta classe tem a ano-
public List<Clube> getClubesByName(String nomeClube){ tao @Service(clubeService), que indica que um componente de
return dao.findByName(nomeClube); servio com o nome de clubeService ser criado e gerenciado pelo
}
public Clube createClube(Clube clube){
Spring. Um componente de servio uma especializao dos
return dao.create(clube); componentes do Spring que alerta o framework que se trata de
} um componente na camada de servio. Atualmente o Spring no
public void updateClube(Clube clube){ oferece nenhum servio adicional a um componente especfico
dao.update(clube);
}
de servio, mas isso pode acontecer em verses futuras, por isso
public void deleteClube(Clube clube){ uma boa prtica anotar as classes desta camada com a anotao
dao.delete(clube); @Service.
} Outra anotao muito importante utilizada na classe ClubeService
public void setDao(ClubeDAO dao) {
@Autowired. Esta injeta na propriedade anotada um bean do
this.dao = dao;
} Spring que seja do mesmo tipo da propriedade. Em nosso caso, a
} propriedade do tipo ClubeDAO. Se o Spring no encontrar nenhum

Edio 101 Java Magazine 15


Maven, JSF 2, Spring e Hibernate

bean com o tipo pedido, uma exceo em tempo de execuo ir Um item importante a ser destacado aqui a injeo dos nossos
ocorrer. Na nossa aplicao, como definimos a classe ClubeDAO servios Spring nos managed beans do JSF. Na classe ClubeBean
com a anotao @Repository, esta classe ser um bean gerenciado isto feito atravs da anotao @ManagedProperty(#{clubeService}).
pelo Spring e uma instncia dela ser automaticamente injetada Repare que o nome clubeService foi o nome definido para o nosso
na nossa classe de servio. servio na classe ClubeService.
Um ponto que merece ateno a configurao dos pacotes nos
quais o Spring ir procurar por classes anotadas com @Component, Listagem 12. Cdigo da pgina clube.xhtml.
@Controller, @Service e @Repository. Esta configurao feita no arqui-
<?xml version=1.0 encoding=ISO-8859-1 ?>
vo applicationContext.xml, na tag context:component-scan, dentro da <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//
propriedade base-package. Para a nossa aplicao passamos dois ENhttp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml
pacotes nos quais o Spring deve procurar a definio dos nossos
xmlns:f=http://java.sun.com/jsf/core
beans: br.com.javamagazine.onzevencedor.service e br.com.javamagazine. xmlns:h=http://java.sun.com/jsf/html>
onzevencedor.dao. <h:head>
<meta http-equiv=Content-Type content=text/html; charset=UTF-8 />
<title>Clube</title>
JSF (View e Controller) </h:head>
Nosso back-end est pronto para realizar as operaes da nossa <h:body>
<h:messages globalOnly=true />
aplicao, ento vamos criao do nosso front-end, comeando <h:form id=formPesquisa rendered=#{!clubeBean.editMode}>
pelas pginas JSF. Para isso, iremos empregar facelets, que a partir <h:commandLink value=Adicionar Clube actionListener=#{clubeBean.create}/>
da verso 2 do JavaServer Faces passou a ser tecnologia padro para <h:panelGrid columns=2>
<h:panelGroup>
as pginas, substituindo o JSP. Facelets possui vrias vantagens sobre <h:outputText value=Filtro: />
o JSP, dentre as quais destacamos o suporte ao uso de templates. <h:inputText maxlength=30 size=30 value=#{clubeBean.nomeClube}>
Teremos trs pginas na nossa aplicao: clube.xhtml, atleta. <f:ajax event=keyup render=resultados
listener=#{clubeBean.filtrarClube} />
xhtml e index.xhtml, mostradas nas Listagens 12, 13 e 14, respec- </h:inputText>
tivamente. Os arquivos XHTML devem ser criados na pasta src/ </h:panelGroup>
</h:panelGrid>
main/webapp.
<h:dataTable value=#{clubeBean.clubes} var=clube id=resultados border=1>
As pginas clube.xhtml e atleta.xhtml possuem dois formulrios: <h:column>
um formulrio de pesquisa e outro de edio (usado na incluso e <f:facet name=header>ID</f:facet>
<h:outputText value=#{clube.idf} />
alterao). A tela de pesquisa de clubes possui uma caixa de texto
</h:column>
que filtra a grid de resultados pelo nome do clube. Esta caixa de <h:column>
texto dispara uma requisio Ajax no seu evento onkeyup. Igual- <f:facet name=header>Nome do Clube</f:facet>
<h:outputText value=#{clube.nome} />
mente, a tela de pesquisa de atletas possui uma lista de clubes que </h:column>
funciona como filtro dos resultados. Cada vez que o valor da lista <h:column>
muda, uma requisio Ajax enviada ao servidor para alterar os <f:facet name=header>#</f:facet>
<h:commandLink value=Alterar action=#{clubeBean.update}>
resultados da pesquisa. Estes exemplos demonstram o suporte a <f:setPropertyActionListener target=#{clubeBean.clube}
Ajax adicionado ao JSF2. Por fim, index.xhtml faz o papel de pgina value=#{clube} />
inicial e principal da aplicao, e por isso auxilia na navegao </h:commandLink>
</h:column>
contendo links para as outras pginas existentes. <h:column>
Aps a criao das pginas vamos criar os managed beans <f:facet name=header>#</f:facet>
do JSF. So estas classes que recebero as requisies do JSF e <h:commandLink id=lnkDelete value=Excluir
onclick=if (!confirm(Tem certeza que deseja excluir este dado?))
devero invocar os objetos de negcio, receber uma resposta return false
da camada de negcios e disponibiliz-la para a renderizao action=#{clubeBean.delete}>
<f:setPropertyActionListener target=#{clubeBean.clube}
na camada de viso. As classes dos managed beans podem ser
value=#{clube} />
vistas nas Listagens 15 e 16. O managed bean do CRUD atleta </h:commandLink>
no apresentado e fica como desafio ao leitor. A classe BaseBean </h:column>
</h:dataTable>
usada como classe ancestral dos nossos outros beans. Dentro </h:form>
dela podemos colocar mtodos utilitrios comuns a todos os <h:form id=formEdicao rendered=#{clubeBean.editMode}>
managed beans da aplicao e, desta forma, fazer um bom uso <h:panelGrid columns=2>
<h:outputText value=Nome do clube:/>
da herana de objetos. Definimos nesta classe mtodos para <h:inputText maxlength=30 size=30 value=#{clubeBean.clube.nome}/>
a criao de mensagens de erro e mensagens informativas no </h:panelGrid>
FacesContext. FacesContext um objeto que contm informaes de <h:commandButton value=Salvar actionListener=#{clubeBean.salvar}/>
<h:commandButton value=Cancelar action=clube/>
uma requisio JSF e da sua respectiva resposta. muito til </h:form>
para a mudana programtica do contedo de componentes das </h:body>
pginas, como por exemplo, insero de mensagens de erro. </html>

16 Java Magazine Edio 101


Listagem 13. Cdigo da pgina atleta.xhtml.

<?xml version=1.0 encoding=ISO-8859-1 ?> <f:facet name=header>#</f:facet>


<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN <h:commandLink id=lnkDelete value=Excluir
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> onclick=if (!confirm(Tem certeza que deseja excluir este dado?)) return false
<html xmlns=http://www.w3.org/1999/xhtml action=#{atletaBean.delete}>
xmlns:f=http://java.sun.com/jsf/core <f:setPropertyActionListener target=#{atletaBean.atleta}value=#{at} />
xmlns:h=http://java.sun.com/jsf/html> </h:commandLink>
<h:head> </h:column>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1 /> </h:dataTable>
<title>Atleta</title> </h:form>
</h:head> <h:form id=formEdicao rendered=#{atletaBean.editMode}>
<h:body> <h:panelGrid columns=2>
<h:messages globalOnly=true /> <h:outputLabel value=Nome do Atleta: for=txtNomeAtleta />
<h:form id=formPesquisa rendered=#{!atletaBean.editMode}> <h:panelGroup>
<h:commandLink value=Adicionar Atleta actionListener=#{atletaBean.create}/> <h:inputText size=40 maxlength=40 required=true label=Nome do Atleta
<h:panelGrid columns=2> value=#{atletaBean.atleta.nome} id=txtNomeAtleta />
<h:outputLabel value=Filtrar jogadores por clube: for=cbFiltroClube /> <h:message for=txtNomeAtleta/>
<h:selectOneMenu id=cbFiltroClube value=#{atletaBean.filtroIdfClube}> </h:panelGroup>
<f:selectItem itemLabel=--Nenhum-- itemValue=/> <h:outputLabel value=Data de Nascimento: for=txtDataNascimento/>
<f:selectItems value=#{atletaBean.clubes} var=club <h:panelGroup>
itemLabel=#{club.nome} itemValue=#{club.idf}/> <h:inputText size=12 maxlength=12 required=true label=Data de Nascimento
<f:ajax event=change listener=#{atletaBean.filtrarAtletaPorClube} value=#{atletaBean.atleta.dtaNascimento} id=txtDataNascimento>
render=resultados/> <f:convertDateTime pattern=dd/MM/yyyy />
</h:selectOneMenu> </h:inputText>
</h:panelGrid> <h:message for=txtDataNascimento/>
<h:dataTable value=#{atletaBean.atletas} var=at id=resultados border=1> </h:panelGroup>
<h:column> <h:outputLabel value=Clube: for=cbClube />
<f:facet name=header>ID</f:facet> <h:panelGroup>
<h:outputText value=#{at.idf} /> <h:selectOneMenu id=cbClube value=#{atletaBean.idfClube}
</h:column> required=true label=Clube>
<h:column> <f:selectItem itemLabel=--Selecione-- itemValue=/>
<f:facet name=header>Nome do Atleta</f:facet> <f:selectItems value=#{atletaBean.clubes} var=club
<h:outputText value=#{at.nome} /> itemLabel=#{club.nome} itemValue=#{club.idf}/>
</h:column> </h:selectOneMenu>
<h:column> <h:message for=cbClube/>
<f:facet name=header>Data de Nascimento</f:facet> </h:panelGroup>
<h:outputText value=#{at.dtaNascimento} /> <h:outputLabel value=Posio: for=cbPosicao />
</h:column> <h:panelGroup>
<h:column> <h:selectOneRadio id=cbPosicao value=#{atletaBean.atleta.posicao}
<f:facet name=header>Posio</f:facet> required=true label=Posio>
<h:outputText value=#{at.posicao} /> <f:selectItems value=#{atletaBean.posicoes} var=posicao />
</h:column> </h:selectOneRadio>
<h:column> <h:message for=cbPosicao/>
<f:facet name=header>Clube</f:facet> </h:panelGroup>
<h:outputText value=#{at.clube.nome} /> </h:panelGrid>
</h:column> <h:panelGrid columns=2>
<h:column> <h:commandButton value=Salvar actionListener=#{atletaBean.salvar}/>
<f:facet name=header>#</f:facet> <h:commandButton value=Cancelar action=#{atletaBean.cancel}
<h:commandLink value=Alterar action=#{atletaBean.update}> immediate=true/>
<f:setPropertyActionListener target=#{atletaBean.atleta}value=#{at} /> </h:panelGrid>
</h:commandLink> </h:form>
</h:column> </h:body>
<h:column> </html>

Listagem 14. Cdigo da pgina index.xhtml. Listagem 15. Cdigo da classe base dos nossos managed beans, BaseBean.

<?xml version=1.0 encoding=ISO-8859-1 ?> package br.com.javamagazine.onzevencedor.controller;


<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional// //imports omitidos
EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> public class BaseBean implements Serializable{
<html xmlns=http://www.w3.org/1999/xhtml protected void addErrorMessage(String componentId, String errorMessage){
xmlns:f=http://java.sun.com/jsf/core addMessage(componentId, errorMessage, FacesMessage.SEVERITY_ERROR);
xmlns:h=http://java.sun.com/jsf/html> } protected void addErrorMessage(String errorMessage){
<h:head> addErrorMessage(null, errorMessage);
<meta http-equiv=Content-Type content=text/html; charset=UTF-8 /> } protected void addInfoMessage(String componentId, String infoMessage){
</h:head> addMessage(componentId, infoMessage, FacesMessage.SEVERITY_INFO);
<h:body> } protected void addInfoMessage(String infoMessage){
<h2>Bem vindo ao JSF2.</h2> addInfoMessage(null, infoMessage);
<ul> } private void addMessage(String componentId, String errorMessage, Severity severity){
<li><h:link value=Clube outcome=clube/></li> FacesMessage message = new FacesMessage(errorMessage);
<li><h:link value=Atleta outcome=atleta/></li> message.setSeverity(severity);
</ul> FacesContext.getCurrentInstance().addMessage(componentId, message);
</h:body> }
</html> }

Edio 101 Java Magazine 17


Maven, JSF 2, Spring e Hibernate

Listagem 16. Cdigo do managed bean, ClubeBean. este arquivo para o diretrio <TOMCAT>/webapps, no qual <TOM-
CAT> o diretrio onde o Tomcat est instalado em sua mquina.
package br.com.javamagazine.onzevencedor.controller;
//imports omitidos Agora preciso iniciar o Tomcat executando o arquivo startup.bat
@ManagedBean(name = clubeBean) (ou startup.sh em ambientes Unix).
@ViewScoped
public class ClubeBean extends BaseBean{ Aps a inicializao do mesmo, acesse a aplicao no endereo
@ManagedProperty(#{clubeService}) http://localhost:8080/OnzeVencedor. Feito isso a pgina index.
private ClubeService model;
private Clube clube; xhtml ser apresentada. Ela contm links para as pginas clube.
private List<Clube> clubes; xhtml e atleta.xhtml, que podem ser visualizadas nas Figuras 4 e 5.
private String nomeClube;
private boolean editMode;
public Clube getClube() {
if(clube == null){
clube = new Clube();
}
return clube;
}
public void salvar(){
System.out.println(idf clube +clube.getIdf());
if(clube.getIdf() == null || clube.getIdf().intValue() == 0){
clube = model.createClube(clube);
clube = new Clube();
addInfoMessage(Clube criado com sucesso.);
}else{
model.updateClube(clube);
addInfoMessage(Clube alterado com sucesso.);
}
}
public void delete(){
model.deleteClube(clube);
if(nomeClube != null && !nomeClube.isEmpty())
clubes = model.getClubesByName(nomeClube);
else
clubes = model.getAllClubes();
} Figura 4. Pgina clube.xhtml sendo exibida no browser
public void create(){
this.clube = new Clube();
this.editMode = true;
}
public void update(){
this.editMode = true;
}
public void cancel(){
this.editMode = false;
}
public void filtrarClube(AjaxBehaviorEvent event){
if(nomeClube != null && !nomeClube.isEmpty()){
clubes = model.getClubesByName(nomeClube);
}else{
clubes = model.getAllClubes();
}
}
public List<Clube> getClubes() {
if(clubes == null){
clubes = model.getAllClubes();
}
return clubes; Figura 5. Pagina atleta.xhtml sendo exibida no browser
}
//getters and setters omitidos
} Concluses
O artigo mostrou de forma prtica a configurao necessria
para a integrao dos frameworks JSF 2, Spring e Hibernate na
Build da Aplicao com Maven arquitetura de projetos Web. Tambm mostrou como tirar proveito
Pronto, finalmente estamos prontos para executar a nossa aplica- da IDE Eclipse e da ferramenta Maven para facilitar o trabalho
o. Deixaremos o Maven tomar conta do build do nosso projeto. de build e principalmente de gerenciamento de dependncias. O
Para isto, selecione o projeto OnzeVencedor no Project Explorer e, exemplo construdo apresenta uma eficiente soluo de arquitetura
com o boto direito, clique em Run As > Maven Install. O Maven de software com frameworks e ferramentas gratuitas e bastante di-
ir gerar um monte de mensagens no console. A mensagem que fundidas no mercado. Tal arquitetura possibilita o desenvolvimento
queremos a de Build Success no final do console, indicando de uma aplicao robusta e leve de forma gil. A aplicao permite
sucesso no build. uma fcil extenso ou mudana das tecnologias utilizadas por seus
Note que uma pasta target foi criada na raiz do projeto. Dentro componentes apresentarem um baixo grau de acoplamento. Assim,
desta existe um arquivo WAR chamado OnzeVencedor.war. Copie poderamos reutilizar o projeto substituindo o Spring por EJB nas

18 Java Magazine Edio 101


camadas de persistncia e servios sem grandes impactos em nosso http://maven.apache.org/download.html
cdigo, ou poderamos fazer uso das vrias bibliotecas existentes Download do Maven, verso 3.0.3.
para JSF 2, como PrimeFaces, IceFaces ou MyFaces, estendendo desta
forma o nmero de componentes JSF da nossa aplicao.
http://www.eclipse.org/downloads/
A partir deste artigo temos um exemplo funcional do uso destas
Download do Eclipse.
tecnologias na arquitetura de um projeto web. A arquitetura apre- http://tomcat.apache.org/index.html
sentada pode ser utilizada pelo leitor como base para o desenvolvi- Download do Tomcat.
mento de novas aplicaes ao mesmo tempo em que deixa pontos
http://eclipse.org/m2e/
em seu projeto que podem ser melhorados, como por exemplo,
Instrues para instalao do plugin M2Eclipse na IDE Eclipse.
o uso do pool de conexes, substituio dos managed beans ge-
renciados pelo JSF por beans gerenciados pela especificao CDI http://sourceforge.net/projects/c3p0/
(Contexts and Dependency Injection), uso de templates de pginas e Download e instrues do C3PO
o uso de uma biblioteca de expanso dos componentes JSF. Para
http://commons.apache.org/dbcp/
uma melhor eficcia no uso destas ferramentas interessante um
Pgina de referncia do Apache DBCP
aprofundamento maior nas respectivas documentaes.

Edwins Leonardi D seu feedback sobre esta edio! Feedback


eu
edwins.leonardi@gmail.com

s
A Java Magazine tem que ser feita ao

D
formado em sistemas de informao pela Universidade Positivo seu gosto. Para isso, precisamos saber

sobre e
(Curitiba-PR) e ps-graduando do curso de Tecnologias Web da o que voc, leitor, acha da revista!

s
ta
edio
PUC-PR. Atualmente trabalha na IBM como IT Specialist. Atua h mais de
D seu voto sobre este artigo, atravs do link:
sete anos com desenvolvimento de sistemas Java. Possui as certificaes
SCJP, SCWCD e SCBCD. www.devmedia.com.br/javamagazine/feedback

Edio 101 Java Magazine 19


Seo Java: Nesta seo voc encontra artigos intermedirios e avanados sobre Java

Seam 3: Servlet e o futuro


Utilizando CDI para facilitar o desenvolvi

Resumo DevMan
De que se trata o artigo:
Neste artigo, estudaremos Seam Servlet, o quarto mdulo a ser mantido pelos desenvolvedores de JBoss
Seam. Veremos como Seam Servlet permite utilizar a Servlet API de maneira mais simples e poderosa,
atravs de CDI.

Em que situao o tema til:


Seam Servlet facilita grandemente o desenvolvimento de aplicaes web Java EE 6 que utilizem servlets.
O mdulo prov mtodos produtores para parmetros e objetos do ambiente das servlets, criar mtodos
observadores do ciclo de vida de servlets e utilizar Seam Catch para tratar erros no capturados.

Seam 3: Servlet e o futuro:


Dos vrios mdulos de Seam 3.0, apenas quatro esto presentes em Seam 3.1. Neste artigo, veremos o
quarto mdulo, Seam Servlet, que permite utilizar CDI com servlets de maneira prtica, provendo mtodos
produtores, eventos de CDI e tratamento de excees teis para a Servlet API. Ademais, faremos uma breve
exposio sobre o futuro, ainda pouco claro, da famlia de frameworks Seam.

C
onforme vimos nos artigos anterio- Assim como Solder, Catch e Config, Seam
res, a recepo ambgua de Seam 3 Servlet um subcomponente de Solder em
pela comunidade levou a pesadas Seam 3.1. Entretanto, este novo e maior Seam
reestruturaes no framework. Mdulos Solder ser mesclado com outros projetos
mais relacionados a outras tecnologias (notadamente, Apache CODI e CDISource),
foram transferidos para diversos projetos. formando um novo projeto focado em esten-
Por exemplo, Seam Faces passou a fazer der CDI. Este novo projeto pe em dvida
parte do RichFaces; Seam Persistence se o futuro da famlia de frameworks Seam,
tornou responsabilidade do Hibernate; conforme veremos mais frente.
Seam REST ao projeto RESTEasy; e assim
por diante. Apenas quatro mdulos fica- Seam Servlet
ram sob a gide do projeto Seam: Solder, O ltimo dos mdulos de Seam 3 a ser fun-
Catch, Config e Servlet. J estudamos dido ao Solder o Seam Servlet, que adiciona
os trs primeiros nos artigos anteriores. facilidades que integram Servlet API e CDI
Agora, conheceremos Seam Servlet. de maneira mais poderosa. Para o desenvol-
Seam Servlet permite utilizar CDI com vedor de aplicaes, existem trs tipos de
servlets de maneira mais poderosa e sim- aprimoramentos: mtodos produtores para
ples que o padro das especificaes. Com diversos objetos da Servlet API, lanamento
ele, possvel obter valores definidos pela de eventos de CDI a partir de eventos de
Servlet API atravs de injeo de depen- servlet e integrao com Seam Catch.
dncias, por exemplo. Tambm possvel
executar aes durante as fases do ciclo Instalao
de vida de servlets atravs de eventos de Em containers que suportem a verso 3
CDI, e delegar excees no tratadas para da Servlet API, instalar Seam Servlet
Seam Catch. em uma aplicao to simples quanto

20 Java Magazine Edio 101


Neste artigo, estudaremos
mais um mdulo de Seam 3,
o Seam Servlet, que integra
melhor a Servlet API com CDI

mento de servlets
Adam Victor Nazareth Brandizzi

adicionar os JARs da API e da implementao do mdulo no


Listagem 1. Dependncias necessrias para utilizar Seam Servlet.
classpath da aplicao. possvel baixar os arquivos necessrios
no link apresentado ao final do artigo. <dependency>
<groupId>org.jboss.seam.servlet</groupId>
Uma soluo mais gerencivel seria utilizar Maven para adi- <artifactId>seam-servlet-api</artifactId>
cionar Seam Servlet s dependncias do projeto. Para adicionar <version>3.0.0.Final</version>
<scope>compile</scope>
todo o Seam Servlet ao projeto, basta adicionar a configurao </dependency>
abaixo ao pom.xml: <dependency>
<groupId>org.jboss.seam.servlet</groupId>
<dependency> <artifactId>seam-servlet-impl</artifactId>
<groupId>org.jboss.seam.servlet</groupId> <version>3.0.0.Final</version>
<artifactId>seam-servlet</artifactId> <scope>runtime</scope>
<version>3.0.0.Final</version> </dependency>
</dependency> <dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
Esta forma tem a desvantagem de tornar a implementao de <version>3.0.0.Beta4</version>
Seam Servlet conhecida em tempo de compilao. Neste caso, <scope>compile</scope>
</dependency>
um desenvolvedor pode, por desateno, utilizar diretamente
classes de Seam Servlet no lugar das interfaces do mdulo, o que Listagem 2. Configuraes que devem constar no web.xml de uma aplicao que
geraria acoplamento entre a aplicao e o mdulo. Isto pode ser utilize Seam Servlet para que possa processar eventos via CDI.

evitado acrescentando a interface e a implementao do mdulo <listener>


como dependncias diferentes, em escopos diferentes. Para fazer <listener-class>org.jboss.seam.servlet.event.ServletEventBridgeListener
</listener-class>
isto, basta utilizar as configuraes apresentadas na Listagem 1 </listener>
no pom.xml. <servlet>
Se o container em questo no suportar Servlet API na verso 3, <servlet-name>Servlet Event Bridge Servlet</servlet-name>
<servlet-class>org.jboss.seam.servlet.event.ServletEventBridgeServlet
necessrio acrescentar mais algumas configuraes no web. </servlet-class>
xml do projeto. Por exemplo, preciso habilitar explicitamente </servlet>
<filter>
o tratamento de eventos de servlets como eventos de CDI. Para <filter-name>Servlet Event Bridge Filter</filter-name>
isto, adicionamos um listener, um filtro e um servlet nativos de <filter-class>org.jboss.seam.servlet.event.ServletEventBridgeFilter</filter-class>
</filter>
Seam Servlet. O cdigo a ser inserido no web.xml pode ser visto <filter-mapping>
na Listagem 2. <filter-name>Servlet Event Bridge Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- Seam Servlet permite que vrios beans teis sejam injetados. Os mtodos produ-
tores destes beans, porm, dependem da captura de eventos configurada acima. Listagem 3. Incluso de filtro necessrio para integrar Seam Catch com Seam
Servlet em containers que no suportem Servlet API 3.
Em outras palavras, mesmo que o desenvolvedor no pretenda usar eventos de
CDI para processar as fases do ciclo de vida de servlets, necessrio adicionar as <filter>
<filter-name>Catch Exception Filter</filter-name>
configuraes apresentadas.
<filter-class>org.jboss.seam.servlet.exception.CatchExceptionFilter</filter-class>
</filter>
A integrao com Seam Catch tambm exige uma configurao <filter-mapping>
<filter-name>Catch Exception Filter</filter-name>
especfica no web.xml. Esta, porm, mais simples. Caso o de- <url-pattern>/*</url-pattern>
senvolvedor deseje utilizar Catch para gerenciar as excees no </filter-mapping>
tratadas oriundas de servlets, basta adicionar um filtro aplicao.
O filtro pode ser visto na Listagem 3.
Eventos de servlets em CDI
- Note que a classe do filtro do Catch org.jboss.seam.servlet.exception.CatchException Desde a verso 2.3, a Servlet API oferece a possibilidade de escutar
Filter. A documentao oficial de Seam Servlet afirma que org.jboss.seam.servlet. eventos dos ciclos de vida de vrios objetos. possvel desenvolver
CatchExceptionFilter (sem exception), mas est errada. classes isto , listeners para serem executadas quando uma apli-

Edio 101 Java Magazine 21


Seam 3: Servlet e o futuro

cao web inicia ou termina a execuo; quando uma sesso criada J o mtodo observador que se segue, imprime uma mensagem
e destruda; quando uma requisio recebida ou processada; e em quando uma resposta destruda:
muitas outras situaes. Seam Servlet permite que o desenvolvedor public void responseDestruido(@Observes @Destroyed ServletResponse res) {
possa adicionar sua prpria lgica de negcios a estes eventos sem System.out.println(Uma resposta foi destruda);
precisar implementar interfaces da Servlet API. Ao invs disto, }

podem-se criar mtodos observadores para eventos de CDI. Alm de @Initialized e @Destroyed h tambm o qualificador
H muitos eventos de servlet disponveis. Por exemplo, possvel @Path para este tipo de evento. Esta anotao recebe uma String
tratar eventos relativos a uma aplicao. Para isso, basta criar um m- como parmetro, que o caminho que levou servlet da aplica-
todo observador para o tipo ServletContext. A classe a seguir apresenta o. Se tivermos, por exemplo, uma aplicao rodando em http://
um destes mtodos observadores, que imprime no log uma mensa- localhost:8080/minha-app e acessarmos via navegador a URL http://
gem simples quando um contexto inicializado ou destrudo: localhost:8080/minha-app/teste, o mtodo observador abaixo vai
imprimir uma mensagem na sada-padro:
public class ObservadorContexto {
public void eventoOcorreu(@Observes ServletContext contexto) { public void requestTeste(@Observes @Path(teste) ServletRequest req) {
System.out.println(Um evento ocorreu relacionado ao contexto de servlet + System.out.println(A URL /teste foi solicitada);
contexto.getServletContextName()); }
}
}
Note que o parmetro de @Path deve ser o caminho exato da
Tambm possvel criar observadores para os eventos espec- servlet, e no h suporte a nenhum tipo de caractere-curinga.
ficos de inicializao ou destruio de contextos. Para distinguir Em outras palavras, @Path(teste.*) restringiria o observador a
quais eventos de contexto um observador vai tratar, basta utilizar processar requisies para http://localhost:8080/minha-app/teste.*,
os qualificadores @Initialized e @Destroyed. Um observador cujo mas no para, por exemplo, http://localhost:8080/minha-app/teste-
parmetro anotado com @Observes seja qualificado com @Initialized longo, ao contrrio do que aconteceria com os padres de URL do
ser invocado apenas quando o contexto for iniciado; j um obser- mapeamento de servlets.
vador com o parmetro qualificado com @Destroyed executado na possvel escutar eventos relativos a HttpServletRequest e HttpServlet
destruio do contexto. Por exemplo, suponha que nossa aplicao Response tambm. Se for preciso invocar mtodos destas interfaces,
precise criar um diretrio para salvar arquivos a serem baixados mais interessante utilizar estas classes no mtodo observador,
no momento em que for iniciada. Podemos definir o caminho ao invs de ServletRequest e ServletResponse. O mtodo observador
como um parmetro de contexto no web.xml: abaixo, por exemplo, escuta eventos relativos a HttpServletRequest
porque utiliza o mtodo getServletPath(), que especfico desta
<context-param>
<param-name>diretorio-downloads</param-name> interface e no est disponvel em ServletRequest:
<param-value>/var/minha-app/meus-downloads</param-value>
</context-param> public void requestTeste(@Observes @Path(teste) HttpServletRequest req) {
System.out.println(A URL + req.getServletPath() + foi solicitada);
}
Definido o parmetro, podemos criar um observador que recu-
pere o valor e crie o diretrio: Ademais, caso o desenvolvedor queira capturar um evento e ter
acesso tanto requisio quanto resposta, basta utilizar o objeto
public class ObservadorContextoCriado {
public void criaDiretorioDownloads(@Observes @Initialized ServletContext contexto) { RequestContext definido por Seam Servlet como tipo observado.
File file = new File(downloads); Por exemplo, o mtodo ObservadorRequestContext.requestOuResponse-
if (!file.exists()) {
CriadoEmURL() da Listagem 4 observa se uma requisio ou uma
file.mkdir();
} resposta foram criados. Quando for executado, o observador
} vai imprimir informaes obtidas tanto da requisio quanto
}
da resposta, e tambm do contexto da servlet.
Outros eventos observveis atravs de Seam Servlet so as fases
do ciclo de vida de requisies e respostas HTTP. Para tanto, basta - Caso queira escutar apenas eventos relativos a HTTP, o desenvolvedor pode utilizar
criar um mtodo observador cujo parmetro observado seja do a classe HttpServletRequestContext no lugar de ServletRequestContext.
tipo ServletRequest ou ServletResponse, respectivamente. Assim como
os eventos do contexto de servlet, possvel observar a criao Por fim, Seam Servlet tambm permite observar eventos rela-
e a destruio de requisies e respostas. O mtodo observador tivos a sesses HTTP. Se precisarmos fazer um observador ser
abaixo, por exemplo, imprime uma mensagem toda vez que uma executado em todos os eventos, basta cri-lo com um parmetro
requisio for criada: do tipo HttpSession:

public void requestCriado(@Observes @Initialized ServletRequest req) { public void observaSessao(@Observes HttpSession sessao) {
System.out.println(Uma requisio foi criada); System.out.println(Um evento ocorreu com a sesso + sessao.getId());
} }

22 Java Magazine Edio 101


Listagem 4. Classe ObservadorRequestContext, cujo mtodo executado quando Por exemplo, um programador que implementasse HttpSession
uma requisio submetida URL "/path". Listener para executar algo quando uma sesso fosse criada, se veria
public class ObservadorRequestContext { forado a implementar um mtodo para processar a destruio
public void requestOuResponseCriadoEmURL( da sesso.
@Observes @Initialized @Path(url)
ServletRequestContext contexto) {
Outra vantagem, esta mais considervel, que eventos de Weld
System.out.println(Uma requisio ou uma resposta foi criada + dispensam alteraes no web.xml. Listeners da Servlet API devem
para o caminho \url\.); ser configurados no arquivo web.xml, o que tedioso e pouco
System.out.println(Servlet: + contexto.getRequest());
System.out.println(Encoding: + contexto.getResponse().getCharacterEncoding()); flexvel. Em CDI, ao contrrio, a mera existncia do mtodo obser-
System.out.println(Path contexto + contexto.getServletContext(). vador suficiente para ativ-lo. Essa e outras vantagens, aliadas
getContextPath());
} grande flexibilidade de Weld, fazem com que Seam Servlet
} permita ao desenvolvedor que nunca mais escreva um listener
para aplicaes Java EE 6.
Entretanto, este um caso pouco usual. No geral, queremos exe-
cutar eventos para fases especficas do ciclo de vida das sesses. Injeo de parmetros
Neste sentido, Seam Servlet permite-nos usar os qualificadores Uma das funcionalidades mais interessantes de Seam Servlet
@Initialized e @Destroyed j conhecidos para restringir a execuo do a capacidade de injetar vrios aspectos do estado do container
mtodo observador s situaes correspondentes: de servlet em beans de CDI. Os objetos injetados so tambm
instncias de beans e podem estar em vrios escopos. preciso,
public void observaSessaoIniciada(@Observes @Initialized HttpSession sessao) {
System.out.println(A sesso + sessao.getId() + foi iniciada); portanto, ter em mente qual o escopo do bean a ser injetado
} quando for utiliz-lo.
Por exemplo, considere o formulrio abaixo, retirado de um facelet:
public void observaSessaoDestruida(@Observes @Destroyed HttpSession sessao) {
System.out.println(A sesso + sessao.getId() + foi destruda);
<h:form>
}
<input type=text name=usuario />
Alm destas fases, eventos tambm so propagados quando <input type=password name=senha />
<h:commandButton id=Autenticar action=#{loginAction.autenticar} />
uma sesso vai ser passivada (isto , persistida em disco ou outra
</h:form>
memria permanente) e, logo aps, ser ativada (isto , recuperada
do disco). Para estes casos, os qualificadores so, respectivamente, - No recomendvel utilizar elementos <input> de HTML em um componente JSF
@WillPassivate e @DidActivate: <h:form>. O formulrio acima serve apenas para propsito de exemplo.

public void observaSessaoPassivada(@Observes @WillPassivate HttpSession sessao) {


System.out.println(A sesso + sessao.getId() + ser passivada); O bean referenciado no <h:commandButton> definido pela classe Login
} Action mostrada na Listagem 5. O ponto mais relevante desta classe
so os atributos usuario e senha, que so declarados como abaixo:
public void observaSessaoA(@Observes @DidActivate HttpSession sessao) {
System.out.println(A sesso + sessao.getId() + foi ativada);
@Inject @RequestParam(usuario) private String usuario;
}
@Inject @RequestParam(senha) private String senha;

Comparativo entre mtodos observadores e listeners O qualificador @RequestParam faz com que Weld recupere os
interessante notar que, ao contrrio dos listeners da Servlet API, parmetros da requisio cujos nomes lhe so passados como
os parmetros dos mtodos observadores no so instncias de argumento, e os atribua ao ponto de injeo. Os valores atribu-
EventObject. Por exemplo, a interface ServletRequestListener, que deve dos so beans no pseudo-escopo dependente, de modo que este
ser implementada por todos os listeners, exige a implementao qualificador s deve ser utilizado diretamente em beans cujo
de dois mtodos, contextInitialized() e contextDestroyed(), e ambos escopo , no mximo, de requisio. Como o esteretipo @Model de
recebem por parmetro uma instncia de ServletRequestEvent (cuja nossa classe garante que LoginAction fica no escopo de requisio,
superclasse EventObject). Oras, o nico dado relevante que se podemos injetar os parmetros sem problemas.
pode recuperar de um ServletRequestEvent a prpria instncia de
ServletRequest. Neste caso, Seam Servlet nos poupa de um wrap- - Caso o bean em que o parmetro ser injetado pertena a um escopo maior que
per desnecessrio. Do mesmo modo, os mtodos observadores o de requisio, pode-se utilizar uma instncia de Instance para recuperar o par-
de eventos de contexto de servlet no esperam por instncias metro. O ponto de injeo seria declarado como @Inject @RequestParam(usuario)
de ServletContextEvent, mas sim de ServletContext, e observadores de private Instance<String> usuarioProxy; e o valor do parmetro seria recuperado pelo
eventos de sesso recebem por parmetro objetos HttpSession no mtodo get(): String usuario = usuarioProxy.get().
lugar de HttpSessionEvent.
Os mtodos observadores tm vantagens sobre os listeners. Alm O argumento de @RequestParam opcional. Caso no seja passado
da simplicidade do parmetro recebido, mtodos observadores nenhum nome para o parmetro, o qualificador utilizar o nome do
dispensam o desenvolvedor de criar mtodos desnecessrios. ponto de injeo para este propsito. Isto significa, por exemplo, que,

Edio 101 Java Magazine 23


Seam 3: Servlet e o futuro

como no nosso exemplo os nomes dos parmetros e dos atributos Para injetar o valor retornado pelo mtodo getServerInfo() do con-
injetados so os mesmos, o argumento de @RequestParam suprfluo texto de servlet, usa-se o qualificador @ServerInfo:
e poderamos ter escrito apenas:
@Inject @ServerInfo private String infoServidor;
@Inject @RequestParam private String usuario;
@Inject @RequestParam private String senha; Estas informaes podem ser teis para depurao e para
recuperar recursos estticos de dentro do contexto. Assim
Caso no haja um parmetro correspondente ao nome na requi- como os demais parmetros, os valores injetados so beans
sio, o valor injetado ser null. No entanto, possvel atribuir um dependentes. Se for necessrio injet-los em beans cujo escopo
valor padro ao ponto com a anotao @DefaultValue. Deste modo, se seja mais abrangente que o de requisio, deve-se usar Instance
o parmetro correspondente no foi submetido, o valor definido como provedor do bean.
por @DefaultValue ser injetado:

@Inject @RequestParam @DefaultValue(guest) private String usuario; Listagem 5. Classe LoginAction, utilizada para autenticao.
@Inject @RequestParam @DefaultValue() private String senha; @Model
public class LoginAction {
Assim como @RequestParam nos permite injetar valores de parmetros @Inject @RequestParam(usuario) private String usuario;
@Inject @RequestParam(senha) private String senha;
de requisio como beans dependentes, o qualificador @HeaderParam
permite recuperar parmetros do cabealho HTTP. Na linha abaixo, public String autenticar() {
FacesMessage mensagem = null;
por exemplo, recuperamos o user agent que enviou a requisio: if (senhaCorreta(usuario, senha)) {
mensagem = new FacesMessage(Autenticao bem sucedida!);
@Inject @HeaderParam(User-Agent) private String userAgent; mensagem.setSeverity(FacesMessage.SEVERITY_INFO);
} else {
O argumento de @HeaderParam opcional, tal como o de @Re- mensagem = new FacesMessage(Usurio ou senha invlidos!);
questParam, e tambm possvel atribuir um valor padro com a mensagem.setSeverity(FacesMessage.SEVERITY_ERROR);
}
anotao @DefaultValue. FacesContext.getCurrentInstance().addMessage(null, mensagem);
Existe tambm o qualificador @CookieParam, que qualifica o ponto return index;
}
de injeo a receber o valor de um cookie HTTP. Poderamos usar // Mais mtodos
este qualificador para, no nosso LoginAction, recuperar um usurio }
que eventualmente tivesse salvado sua sesso via cookies:

@Inject @CookieParam(USUARIO_AUTENTICADO) private String usuarioSalvo;


@Inject @RequestParam @DefaultValue(teste) private String usuario; Injeo de objetos do ambiente de servlet
Alm de permitir injetar valores de parmetros especficos,
@CookieParam pode dispensar o argumento que lhe passado, e Seam Servlet tambm gera beans para vrios objetos importantes
tambm aceita ser inicializado com @DefaultValue. Ademais, o ponto providos pelo container de servlet.
de injeo de um cookie pode ser tambm do tipo Cookie da Servlet Por exemplo, possvel injetar o contexto da aplicao em um
API. Neste caso, naturalmente, o valor a ser injetado ser um objeto bean quando se utiliza Seam Servlet. Para tanto, basta criar um
Cookie. A linha a seguir mostra como injetar este bean: ponto de injeo do tipo ServletContext, que um bean no escopo de
aplicao ser injetado:
@Inject @CookieParam(USUARIO_AUTENTICADO) private Cookie usuarioSalvo;
@Inject private ServletContext contextoAplicacao;
Isto til quando se precisa obter mais informaes sobre o
cookie, como domnio e data de expirao. Naturalmente, tam- Outros objetos injetveis so as requisies e as respostas HTTP.
bm possvel recuperar o valor do cookie, que seria injetado Neste caso, os pontos de injeo devem ser dos tipos ServletRequest
caso o ponto de injeo fosse do tipo String, atravs do mtodo e ServletResponse, respectivamente:
Cookie.getValue().
@Inject private ServletRequest requisicao;
Valores injetados em um ponto qualificado por @HeaderParam @Inject private ServletResponse resposta;
e @CookieParam so, assim como no caso de @RequestParam, beans
do pseudo-escopo dependente. Deste modo, eles s podem ser Alternativamente, podem-se utilizar pontos de injeo dos
injetados com segurana em beans dependentes ou do escopo tipos HttpServletRequest e HttpServletResponse, tambm, caso os
de requisio. Caso deseje injetar algum valor associado a esses mtodos especficos destas interfaces sejam necessrios. To-
qualificadores em escopos mais abrangentes, utilize Instance. dos esses beans esto no escopo de requisio. Como no so
Alm destes valores definidos pela aplicao ou pelo usurio, dependentes, seguro injet-los em qualquer bean de qualquer
possvel injetar informaes sobre o contexto e o servidor em escopo.
que a aplicao roda. Por exemplo, para recuperar o caminho do Outro objeto injetvel atravs de Seam Servlet a sesso do usurio.
contexto de servlet, basta utilizar o qualificador @ContextPath: Para tanto, basta criar um ponto de injeo do tipo HttpSession:
@Inject @ContextPath private String caminhoContexto; @Inject private HttpSession sessao;

24 Java Magazine Edio 101


Neste caso, importante ter em mente que
isto forar a criao da sesso, caso ainda no
exista. Se isto no for interessante, deve-se
injetar um objeto do tipo HttpSessionStatus, que
provido por Seam Servlet. Esta classe possui
um mtodo isActive(), que retorna true caso a
sesso j exista. Se for necessrio criar ou
recuperar a sesso, pode-se utilizar o mtodo
get(). O cdigo abaixo, por exemplo, verifica se
uma sesso existe e, se no existir, a cria:

@Inject private HttpSessionStatus statusSessao;


public String criarSessao() {
if (!statusSessao.isActive()) {
statusSessao.get();
}
return index;
}
Assim como HttpSession, HttpSessionStatus
um bean do escopo de requisio e, portan-
to, pode ser injetado em beans de qualquer
outro escopo. Figura 1. Tela de erro padro do Tomcat
J vimos como injetar um cookie especfico
em um bean. Para injetar uma lista com todos Uma vez que se tenha Catch na aplicao e Listagem 6. Adicionando Seam Catch como
os cookies de uma pgina, basta criar um o web.xml esteja devidamente configurado, dependncia no pom.xml.
ponto de injeo cujo tipo seja uma lista de manipular excees lanadas por servlets
<dependency>
objetos Cookie. A lista gerada uma instncia to simples quanto criar mtodos manipu- <groupId>org.jboss.seam.catch</groupId>
de bean no escopo de requisio: ladores. O artigo anterior desta srie explica <artifactId>seam-catch-api</artifactId>
<version>3.0.0.Final</version>
como fazer isso em detalhes; aqui, vamos
@Inject private List<Cookie> listaCookies; </dependency>
ver um exemplo para ilustrar seu uso. <dependency>
As facilidades de injeo de objetos do Considere a ServletFaltosa da Listagem 7. <groupId>org.jboss.seam.catch</groupId>
<artifactId>seam-catch-impl</artifactId>
ambiente de servlet permitem que o desen- Esta servlet pode lanar uma exceo do <version>3.0.0.Final</version>
volvedor recupere dados importantes de tipo ErroInternoException, do tipo DadoNaoEn- <scope>runtime</scope>
maneira menos acoplada e mais declarativa. contradoException ou simplesmente redire- </dependency>}

Os qualificadores e mtodos produtores de cionar para uma JSP. Quando uma das Listagem 7. Servlet que lana dois tipos de
Seam Servlet evitam a reescrita de compo- excees lanada, a tela padro de erro exceo.
nentes relativamente simples, mas frequen- interno do servidor apresentada, como
public class ServletFaltosa extends HttpServlet {
temente usados. importante notar, porm, na Figura 1. protected void doGet(HttpServletRequest req,
que, em containers que no suportem Servlet Agora, observe o bean declarado na HttpServletResponse resp)
throws ServletException, IOException {
API 3, a injeo destes valores depende da Listagem 8. Ele possui dois mtodos ma-
String erro = req.getParameter(erro);
configurao de Seam Servlet. nipuladores de exceo um para ErroIn- if (nao-encontrado.equals(erro)) {
ternoException e um para DadoNaoEncontradoEx- throw new ServletException
(new DadoNaoEncontradoException());
Integrao com Seam Catch ception. Os manipuladores apenas definem } else if (interno.equals(erro)) {
Seam Servlet tambm permite utilizar cdigos de erro a serem enviados, mas isto throw new ServletException
Seam Catch para gerenciar as excees j faz considervel diferena. Por exemplo, (new ErroInternoException());
}
no tratadas pelas servlets. Este um se acessarmos a mesma URL anterior, uma resp.sendRedirect(sucesso.jsp);
grande avano em relao Servlet API, nova tela de erro ser apresentada. A nova }
cujas ferramentas para gerenciamento de tela pode ser vista na Figura 2. }

excees so bastante limitadas.


Para utilizar esta funcionalidade, neces- - Note como, na classe da Listagem 8, as excees
srio ter Catch na sua aplicao. O artigo lanadas por HttpServletResponse.sendError() so No nosso exemplo, ns apenas mudamos
anterior desta srie explica como fazer isso. delegadas a Catch. Estes erros nunca devem ocorrer, o erro e a mensagem a serem apresenta-
Resumidamente, a melhor maneira de faz- mas boa prtica delegar todas as excees no das, mas poderamos inibir totalmente a
lo , provavelmente, adicionar o contedo efetivamente tratadas a Seam Catch, uma vez que apresentao de uma tela de erro e at re-
da Listagem 6 ao pom.xml do projeto. se tenha comeado a usar este mdulo. direcionar para outra pgina. Se nenhum

Edio 101 Java Magazine 25


Seam 3: Servlet e o futuro

mtodo manipulador tivesse manipulado a exceo (ou qualquer aprovaram as novas mudanas, um bom nmero de programa-
mtodo manipulador executasse CaughtException.rethrow()), a tela de dores j experimentados em Seam 2 considerou as mudanas
erro padro do Tomcat seria apresentada. ruins.
Vrias razes foram citadas. Seam 3 no tem praticamente
relao alguma com Seam 2, tornando a migrao de aplicaes
antigas impossvel apenas a total reescrita uma soluo.
Alis, Seam 3 nem sequer almeja atender as mesmas deman-
das de Seam 2. Tampouco existe uma estratgia de migrao
documentada de Seam 2 para Seam 3. Os componentes de
Seam 3 precisam ser coletados e integrados manualmente,
de maneira pouco prtica. Alm disso, o cdigo atual est
permeado de bugs e mal documentado. Por sua vez, Seam 2,
ainda largamente utilizado, passou a receber menos ateno
dos desenvolvedores, em favor da nova ferramenta. Assim a
Figura 2. Nova mensagem de erro para lanamento da exceo DadoNaoEncontradoException lista de reclamaes foi crescendo.
A equipe de desenvolvimento de Seam 3 tomou ento algu-
Listagem 8. Bean com mtodos manipuladores de Seam Catch. mas decises. A mais drstica foi, certamente, distribuir vrios
@HandlesExceptions
mdulos de Seam a outros projetos:
public class TratadorExcecoes { Seam Persistence foi delegado ao projeto Hibernate e reno-
@Inject private Event<ExceptionToCatch> exceptionEvento; meado como Hibernate CDI;
public void manipulaErroInterno(
@Handles CaughtException<ErroInternoException> ce, S eam Validation tambm foi delegado ao Hibernate, sendo
HttpServletResponse resposta) { integrado ao componente Hibernate Validator;
try { S eam Wicket foi transferido ao projeto Wicket da Apache;
resposta.sendError(500, Um erro interno ocorreu);
} catch (IOException e) { S eam REST foi integrado ao RESTEasy;
// Nunca deve ocorrer Seam Faces passou a ser uma biblioteca do projeto RichFaces,
exceptionEvento.fire(new ExceptionToCatch(e));
chamada Faces CDI.
}
}
public void manipulaDadoNaoEncontrado( Ademais, Catch, Config e Servlet foram unificados em Seam
@Handles CaughtException<DadoNaoEncontradoException> ce,
Solder.
HttpServletResponse resposta) {
try { Este novo passo deixou alguns desenvolvedores ainda mais
resposta.sendError(404, Recurso no encontrado); confusos. Seam 3 tornava-se, assim, ainda menos integrado do
} catch (IOException e) {
// Nunca deve ocorrer
que era e, portanto, mais distante de Seam 2. Membros da comu-
exceptionEvento.fire(new ExceptionToCatch(e)); nidade afirmavam, e desenvolvedores do projeto concordavam,
} que Seam 3 foi um mau nome para este projeto, cuja relao
}
}
com o projeto anterior era praticamente inexistente. Uma vez
que o ncleo de Seam 2 se tornou dispensvel, o projeto Seam
passou por uma crise de identidade.
- Um ponto interessante de se relembrar que o mtodo doGet() de nossa servlet Ento, em 30 de setembro, Shane Bryzak, desenvolvedor do
lana uma ServletException cuja causa uma DadoNaoEncontradoException, mas projeto Seam, postou nos fruns de discusso do projeto um
no uma DadoNaoEncontradoException diretamente. Como vimos no ltimo artigo, tpico pedindo opinies da comunidade sobre como deveria
porm, Catch no s trata todas as causas, como comea pela mais antiga. Esta ser o Seam do futuro, apelidado de Seam.Next. Aps longa dis-
uma das razes para se utilizar Seam Catch. cusso, em 30 de novembro, foi anunciado no portal In Relation
To o futuro de Seam. E as decises foram surpreendentes.
Planeja-se adicionar ainda mais facilidades para integrar Catch Resumidamente, anunciou-se um acordo entre vrios projetos
com servlets, como anotaes para definir cdigos de erro. Entre- para criar um megaprojeto, administrado por uma organi-
tanto, assim como muitos outros aspectos futuros de Seam 3, estas zao no subordinada a corporaes. O novo megaprojeto
possveis funcionalidades de Seam Catch dependem de decises foi proposto na incubadora da Fundao Apache e se chama
importantes que esto sendo tomadas nesse momento sobre o Apache DeltaSpike. A principal funo deste integrar diversas
futuro do projeto. extenses portveis de CDI, como MyFace CODI, CDISource e,
tambm, Seam 3. Notadamente, os mdulos de Seam 3 sero
O futuro do JBoss Seam migrados para o novo projeto.
A recepo do novo framework pela comunidade de usurios Do texto em que se apresenta o novo projeto, difcil concluir
de Seam 2 foi ambivalente. Enquanto alguns desenvolvedores sobre qual vai ser o futuro de Seam. Por exemplo, o final do

26 Java Magazine Edio 101


texto afirma que Seam 3 ser mantido, mas no fala nada sobre de eventos de CDI, muito mais simples e prticos de criar que
a evoluo do framework, nem sobre o futuro de Seam 2. A im- servlet listeners. Servlet tambm permite injetar parmetros e
presso geral que, de fato, o framework Seam chegou ao final objetos do ambiente de servlet em beans CDI, alm de prover
da linha e seu sucessor ser DeltaSpike. uma bridge entre servlets e Seam Catch.
As facilidades que vimos, hoje unificadas no mdulo Solder,
Concluses so realmente bastante teis para o desenvolvimento com CDI
Vrios mdulos foram retirados da proposta original de Seam 3 e Weld. Entretanto, o framework Seam, como conhecido, tem um
e delegados a outros projetos. Dos originais, apenas quatro futuro obscuro. Com a criao de DeltaSpike, bem possvel
mdulos permaneceram sob a gide do projeto Seam e foram que todas as facilidades do ncleo de Seam 3 venham a ser
mesclados em um s, o novo Seam Solder. Nos artigos anterio- disponveis apenas no novo projeto, e Seam simplesmente seja
res, havamos estudado trs dos mdulos antigos: Solder, Catch descontinuado.
e Config. Neste artigo, vimos o ltimo: Seam Servlet.
A principal funo de Seam Servlet integrar a Servlet API
com CDI. Por exemplo, Seam Servlet permite executar aes
em fases do ciclo de vida de servlets atravs de observadores http://seamframework.org/Seam3/DistributionDownloads
Pgina de download de mdulos de Seam, de onde se pode
Adam Victor Nazareth Brandizzi baixar Seam Config e Seam Servlet.
brandizzi@gmail.com http://docs.jboss.org/seam/3/servlet/latest/reference/en-US/html/
desenvolvedor em vrias linguagens. Programa em Java h Documentao de Seam Servlet
quatro anos, trabalhando majoritariamente com Struts 2 e com a
ferramenta de portais Liferay. licenciado em Computao pela Univer- http://in.relation.to/Bloggers/SoWhatsHappeningWithSeam
sidade de Braslia e atualmente trabalha para SEA Tecnologia. Post no blog in.relation.to anunciando, entre outras coisas, a
repartio dos mdulos de Seam 3 entre vrios projetos e a fuso de
D seu feedback sobre esta edio! Catch, Servlet e Config em Solder.
Feedback
eu
http://seamframework.org/Community/SeamNextDiscussion
s

A Java Magazine tem que ser feita ao


D

seu gosto. Para isso, precisamos saber Tpico no frum de seamframework.com em que a comunidade
sobre e

o que voc, leitor, acha da revista! opinou e fez pedidos sobre o futuro de Seam.
s

ta
edio

D seu voto sobre este artigo, atravs do link: http://in.relation.to/Bloggers/SeamNextAnnouncement


www.devmedia.com.br/javamagazine/feedback Post no blog in.relation.to explicando o projeto DeltaSpike.

Edio 101 Java Magazine 27


Seo Java: Nesta seo voc encontra artigos intermedirios e avanados sobre Java

Explorando os component
Usabilidade e simplicidade com os compo

Resumo DevMan
De que se trata o artigo:
O artigo explora vrios componentes do Dojo, mostrando na prtica como utiliz-los em uma aplicao.
Para isso, so abordados desde menus at componentes para funes especficas, como calendrios e
campos para horas. Alm disso, foram discutidos alguns conceitos relacionados usabilidade em am-
bientes web.

Em que situao o tema til:


Este tema til para todos os desenvolvedores que desejam conhecer a simplicidade, facilidade e diver-
sidade da biblioteca JavaScript Dojo numa abordagem prtica.

Explorando os componentes do Dojo Toolkit:


Este artigo demonstra o comportamento de vrios componentes da biblioteca JavaScript Dojo Toolkit,
ressaltando o visual claro e intuitivo dos mesmos. Tambm abordada, em um exemplo prtico, toda a
facilidade de integrao dos componentes quando utilizados em uma aplicao Java para web.

A
tualmente a internet conta com nhuma ambiguidade ou dificuldade para
um vasto nmero de usurios. o usurio e mantendo o visual mais limpo.
Nmero este que tende a ultra- Assim, a navegao pelo sistema ser sim-
passar o limite do IPv4 em pouco tempo. ples, removendo possveis obstculos para
Isto se deve ao acesso internet cada usurios com pouca experincia.
vez mais facilitado, atingindo classes e Este assunto tem assumido cada vez
grupos que antes no eram incorporados mais importncia no desenvolvimento
na grande rede e que trazem consigo de software. De maneira que algumas
diferentes perfis. empresas desenvolvem e mantm um
Neste ambiente heterogneo da internet, guia interno para usabilidade. Deste
fundamental dispor as funcionalidades modo, ao implementar um novo sistema,
do sistema de maneira objetiva, atingindo os programadores se orientam pelas prti-
assim esses diferentes perfis. Tambm cas descritas no guia. No meio acadmico
importante considerar que os usurios no no diferente, e algumas universidades
gostam de utilizar um sistema cansativo, tambm tm adotado disciplinas voltadas
que dificulta a localizao de contedo ou para o tema.
a realizao de atividades, impondo bar- Um exemplo simples de problema de
reiras ao seu uso. Preocupados com estes usabilidade seriam os campos de login.
aspectos que devemos comear a pensar Embora este termo seja claro para ns
na usabilidade do nosso sistema. desenvolvedores, pessoas que no esto
A usabilidade a facilidade com que as habituadas ao desenvolvimento de softwa-
pessoas podem empregar uma ferramenta re podem no entender o termo a princpio,
ou objeto a fim de realizar uma tarefa es- e demorar um pouco at descobrirem seu
pecfica. No contexto do desenvolvimento uso. Sendo que neste exemplo, se usarmos
de aplicaes, devemos sempre focar em usurio e senha como nome para os cam-
deixar a interface grfica mais clara e pos de login, a interface se tornar muito
simples possvel, de forma a no existir ne- mais intuitiva para um usurio leigo.

28 Java Magazine Edio 101


Aprenda como

es do Dojo Toolkit
enriquecer o visual de
seus formulrios web
utilizando recursos
desta biblioteca

nentes do Dojo Toolkit


Luis Antonio Tavares

Alguns outros exemplos de prticas de usabilidade para a web


so:
Marcar links j visitados pelo usurio;
E vitar uso indiscriminado de animaes;
No expor muita informao em uma mesma regio da tela;
E vitar abrir links em uma nova janela;
D ar ttulo a um formulrio condizente com sua funo;
Utilizar campos de texto com um tamanho adequado para o
dado que ser informado.

Esses pontos so apenas uma amostra de prticas de usabili-


dade. Partindo destes princpios e visando uma aplicao web
mais intuitiva e clara para o usurio, este artigo tem como foco
abordar a usabilidade e simplicidade dos componentes para
formulrio do Dojo Toolkit, demonstrando na prtica como
aproveitarmos de sua interface simples e amigvel.
Estes aspectos sero apresentados em duas sees: uma seo Figura 1. Tela de preferncias do Eclipse
explicando o uso de alguns componentes separadamente; e
outra demonstrando um formulrio no qual os dados so sub- Criando o projeto para desenvolver o exemplo
metidos para um Servlet Java. Dentro do Eclipse, crie o projeto onde iremos implementar nos-
so exemplo. Para isso, d um clique com o boto direito dentro
Preparando o ambiente de trabalho da viso Project Explorer, acesse a opo New e depois clique em
No decorrer do artigo, alguns programas sero construdos Dynamic Web Project, conforme mostra a Figura 2.
com o objetivo de exemplificar o uso dos componentes do Dojo
em uma aplicao web, e para o desenvolvimento destes, preci-
samos antes montar o ambiente de trabalho. Assim, esta seo
ir relatar os passos para a configurao deste ambiente.
Dentre as ferramentas que vamos utilizar, esto a IDE Eclip-
se Indigo para Java EE, o JRE (Java Runtime Environment), o
Apache Tomcat verso 7, a biblioteca google-gson e, por fim,
a biblioteca JavaScript Dojo Toolkit. Os endereos para baixar
estes softwares podem ser encontrados na seo Links.

Configurando o Tomcat
Para iniciarmos o projeto, devemos primeiramente configurar o
Tomcat para rodar nossos exemplos. Para isso, no Eclipse, selecione
Window > Preferences. Na tela de preferncias ilustrada pela Figura 1,
clique em Server > Runtime Environments, e ento, no boto Add,
localizado no canto direito superior da tela.
Na janela seguinte, selecione a verso 7 do Tomcat e clique Figura 2. Criando um Dynamic Web Project
em Next. Feito isso, na prxima tela clique em Browse para
informar o diretrio onde o Tomcat foi instalado e depois em Voc pode dar qualquer nome a este projeto, mas importante
Finish. Terminados esses passos, o servidor estar configurado que o Target runtime esteja selecionado como Apache Tomcat v7.0,
no Eclipse. Agora podemos criar nosso projeto. como mostra a Figura 3.

Edio 101 Java Magazine 29


Explorando os componentes do Dojo Toolkit

esto corretos, e se voc preferir, poder remover os erros atravs


da viso Markers do Eclipse, ou incluir uma regra nas preferncias
da IDE, para no validar os arquivos do Dojo.
Para remover os erros atravs da viso Markers, deve-se clicar
nos itens que esto circulados na Figura 5 e excluir os subitens
que apresentam erros de validao. Apenas uma ressalva: esses
erros de validao de arquivo no influenciam no funcionamento
da aplicao.

Figura 5. Removendo erros de sintaxe do Dojo

Para esta aplicao tambm ser necessrio baixar a biblioteca


google-gson. No decorrer do desenvolvimento vamos entender
melhor sua utilizao. O endereo para download desta tambm se
encontra na seo Links. Aps baixar a verso 1.7.1, descompacte
o zip e copie o arquivo gson-1.7.1.jar para a pasta WebContent/WEB-
INF/lib. Como resultado, vamos obter a estrutura apresentada na
Figura 6.

Figura 3. Configuraes da criao do projeto

Aps criar o projeto, vamos fazer o download do Dojo Toolkit.


Deste modo, na pgina de download, procure por Dojo Toolkit
Release e baixe o arquivo no formato zip. A verso do Dojo que
utilizaremos ser a 1.6.1.
Terminada esta etapa, descompacte o arquivo dojo-release-1.
6.1.zip e copie as pastas dojo, dijit e dojox, contidas na pasta dojo-
release-1.6.1, para dentro da pasta WebContent do nosso projeto.
Feito isso, teremos a estrutura exibida pela Figura 4.

Figura 6. Estrutura do exemplo usando o Dojo Toolkit

Agora que j montamos o ambiente de trabalho, vamos criar


alguns aplicativos exemplo. Dessa forma estudaremos alguns
componentes e recursos da biblioteca Dojo Toolkit observando
na prtica como utiliz-los.

Figura 4. Criando a estrutura do projeto. Conhecendo alguns componentes


Nesta seo sero apresentados alguns componentes da biblio-
Observe que o Eclipse entende que h erros na pasta dojox du- teca Dojo separadamente. Atravs dessa abordagem, poderemos
rante o processo de validao. Processo esse que valida a sintaxe conhecer um nmero maior de componentes da biblioteca e estu-
dos arquivos criados na IDE. Mas em fato, os arquivos da pasta dar aspectos de cada um deles. Dentre o que ser demonstrado, h

30 Java Magazine Edio 101


componentes que no possuem uma integrao direta com Java, Observe na primeira tag script que o primeiro arquivo a ser im-
mas que podem agregar valor ao visual da nossa aplicao. portado na pgina o dojo.xd.js. Ele contm as funes do core do
Muitos dos componentes que sero analisados podem ser cria- Dojo, como por exemplo, dojo.byId() e dojo.ready() funes bsicas
dos tanto de maneira declarativa (nas prprias tags) como de forma e necessrias aos demais mdulos.
programtica (usando script para montar o componente em uma Entretanto, para o uso da maioria dos recursos do Dojo, ne-
div HTML). Estas opes so alternadas entre os exemplos, mas cessrio usar a funo require(), a qual importa o mdulo passado
importante saber que grande parte dos componentes pode ser como argumento. Atravs desta funo, temos a importao dos
construda das duas maneiras. dois componentes que so usados neste exemplo: o TabContainer
Durante o desenvolvimento dos exemplos ser comum, nas e o ContentPane.
pginas, a importao de arquivos provenientes da URL http:// Logo mais, na funo dojo.addOnLoad(), so definidas algumas
ajax.googleapis.com/ajax. Isso faz nossa aplicao dependente de um aes que sero executadas assim que a pgina for carregada. No
acesso Internet para rodar, porm, caso voc prefira executar incio da funo temos a criao do container das abas (varivel
a aplicao sem essa dependncia, basta baixar esses arquivos, tc), que posiciona este componente na div com id tabs, localizada
coloc-los na estrutura de pastas do WebContent e alterar a URL na tag body da pgina.
de importao para o caminho local. Na sequncia temos a criao de dois painis, sendo que cada um
deles representa uma aba. Aps esta definio, eles so adicionados
Usando abas do Dojo ao container atravs da chamada tc.addChild(). Por fim, o container
O primeiro aplicativo que vamos desenvolver trata-se de um iniciado usando o tc.startup(). Ao rodar o exemplo, podemos ver a
exemplo utilizando os componentes de abas do Dojo. Para isso, aparncia das abas do Dojo como ilustra a Figura 7. Para alternar
crie uma pgina index.html dentro da pasta WebContent e adicione entre elas, basta clicar na opo desejada.
neste arquivo o cdigo apresentado na Listagem 1.

Listagem 1. Cdigo para o exemplo usando abas.

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01


//EN http://www.w3.org/TR/html4/strict.dtd>
<html dir=ltr>
<head>
<style type=text/css>
body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
</style>
Figura 7. Exemplo usando abas
<script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
djConfig=parseOnLoad: true> Uma das prticas de usabilidade no dispor grandes quanti-
</script>
<script type=text/javascript> dades de informao em uma mesma pgina ou regio da tela.
dojo.require(dijit.layout.TabContainer); O componente abas uma alternativa para suprir esta prtica,
dojo.require(dijit.layout.ContentPane);
dojo.addOnLoad(function() { pois atravs dele podemos dividir melhor as informaes que
var tc = new dijit.layout.TabContainer({ queremos expor em nossa aplicao.
style: height: 100%; width: 100%;
},
tabs); Usando componente para hora
var cp1 = new dijit.layout.ContentPane({ O Dojo tambm prov um campo especial para entrada de dados
title: Inicial,
content: Bem vindo ao nosso site! relacionados a horas. A Listagem 2 traz um cdigo de exemplo
}); que mostra o uso deste componente, o TimeTextBox. Ento, digite
tc.addChild(cp1);
var cp2 = new dijit.layout.ContentPane({
este cdigo no arquivo index.html.
title: Contato, Estudando o cdigo, note que para utilizar o componente basta
content: Entre em contato pelo telefone XXXX - XXXX importar o arquivo principal do Dojo (primeira tag script), importar
});
tc.addChild(cp2); o mdulo dijit.form.TimeTextBox (segunda tag script) e definir dentro
tc.startup(); da tag body um input com o atributo dojoType recebendo como valor o
});
</script> nome do mdulo. Feito isso, o TimeTextBox ser montado no input.
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/ A Figura 8 ilustra o componente em funcionamento. Observe que
dojo/1.6/dijit/themes/claro/claro.css />
ao executar o exemplo as horas so dispostas verticalmente, e ao
</head>
<body class= claro > selecionar um horrio, o input ser automaticamente preenchido
<div style=width: 350px; height: 140px> com este valor. Voltando nossa anlise para o aspecto da usabilidade,
<div id=tabs></div>
</div> pode-se perceber que este componente traz mais agilidade para a
</body> pgina, evitando erros de formato para o campo e tambm obrigando
</html>
o usurio a selecionar somente os valores que foram pr-definidos.

Edio 101 Java Magazine 31


Explorando os componentes do Dojo Toolkit

Listagem 2. Cdigo exemplo com campo para horas. Ao rodar o exemplo, vamos obter a tela ilustrada pela Figura 9,
que mostra o visual limpo do menu e tambm a clareza com que
<!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional
//ENhttp://www.w3.org/TR/html4/loose.dtd> voc pode organiz-lo, criando nveis para dispor as opes. Desta
<html> forma, voc poder agrupar melhor as informaes de acordo com
<head>
<meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1/> o contexto do seu sistema. Vantagens como estas, demonstram
<style type=text/css> como os componentes do Dojo Toolkit contribuem para uma
body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
</style>
aplicao mais simples e intuitiva.
<script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
djConfig=parseOnLoad: true>
</script> Listagem 3. Cdigo para o exemplo com menus.
<script type=text/javascript>
dojo.require(dijit.form.TimeTextBox); <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN
</script> http://www.w3.org/TR/html4/strict.dtd>
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/ <html dir=ltr>
dojo/1.6/dijit/themes/claro/claro.css /> <head>
</head> <style type=text/css>
<body class=claro> body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
<label>Horrio:</label> </style>
<input dojoType=dijit.form.TimeTextBox type=text> <script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
</body> djConfig=parseOnLoad: true>
</html> </script>
<script type=text/javascript>
dojo.require(dijit.Menu);
</script>
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
dojo/1.6/dijit/themes/claro/claro.css />
</head>
<body class= claro >
<div dojoType=dijit.Menu id=windowContextMenu contextMenuForWindow=true
style=display: none;>
<div dojoType=dijit.MenuItem iconClass=dijitEditorIcon dijitEditorIconCut
onClick=alert(Voc clicou no boto Recortar!)>
Recortar
</div>
<div dojoType=dijit.MenuItem iconClass=dijitEditorIcon dijitEditorIconCopy
onClick=alert(Voc clicou no boto Copiar!)>
Copiar
</div>
<div dojoType=dijit.MenuItem iconClass=dijitEditorIcon dijitEditorIconPaste
onClick=alert(Voc clicou no boto Colar!)>
Figura 8. Exemplo usando componente para hora Colar
</div>
Usando menus do Dojo <div dojoType=dijit.MenuSeparator></div>
<div dojoType=dijit.PopupMenuItem>
Agora vamos ver, na prtica, um pouco dos componentes de <span>Submenus</span>
menu do Dojo Toolkit. Para isso, digite o cdigo da Listagem 3 <div dojoType=dijit.Menu id=submenu1>
<div dojoType=dijit.MenuItem onClick=alert(Submenu 1!)>
no arquivo index.html. Submenu Um
Veja que para este aplicativo necessrio a incluso do mdulo </div>
<div dojoType=dijit.MenuItem onClick=alert(Submenu 2!)>
dijit.Menu, que est na segunda tag script da pgina. Depois, dentro Submenu Dois
da tag body, temos a criao do menu de forma declarativa, ou seja, </div>
</div>
o menu definido empregando tags e atributos. </div>
Logo no incio da tag body temos a definio do componente prin- </div>
<span>
cipal, o dijit.Menu. Em seguida h a definio de vrios itens para
Clique com o boto direito na pgina.
o mesmo. Em cada item do menu percebe-se o uso de um cone </span>
do pacote dijit atravs do atributo iconClass. O Dojo j traz alguns </body>
</html>
cones prontos, sendo que para utiliz-los basta atribuir o nome
do mesmo em iconClass. E para efeito de demonstrao, tambm
definimos algumas aes por meio do atributo onClick.
Repare tambm a incluso de um separador do Dojo (dijit.Menu
Separator) e, logo depois, a criao de um dijit.PopupMenuItem. este
componente que permite que um novo menu seja exibido ao sobre-
por ou selecionar a opo correspondente a ele. Visualmente trata-se
de um submenu, porm os componentes so os mesmos utilizados
no menu principal. Note que, dentro do PopupMenuItem, um Menu
definido com dois MenuItems representando os submenus.
Figura 9. Exemplo usando menus

32 Java Magazine Edio 101


Usando o slider do Dojo
O componente slider trata-se de um cursor que medida que o
deslocamos, incrementamos ou decrementamos o seu valor. Este
componente til, por exemplo, para uma aplicao que realiza
vrias configuraes de valores numricos, sendo necessrio se
conhecer os valores limites (mnimos e mximos). Dessa forma,
o slider no permite que se extrapolem esses valores, e ainda Figura 10. Exemplo usando o slider
mantm um indicador visual do valor atual e seus limites.
Para vermos na prtica este exemplo, digite o cdigo da Listagem 4 uma largura de 300 pixels para o componente, e em onChange, es-
na pgina index.html e rode o aplicativo. pecificamos que a cada mudana de valor, o input com id sliderValue
ser atualizado.
Por fim, passamos o id slider da div onde o componente ser montado
Listagem 4. Cdigo para o exemplo com slider. como ltimo argumento do construtor. A Figura 10 demonstra a
aplicao em execuo. Ao movimentar o cursor o valor do campo de
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN http://www.w3.org/TR/
html4/strict.dtd> texto ser alterado de acordo com as mudanas realizadas no slider.
<html dir=ltr>
<head>
<style type=text/css>
Usando a barra de progresso do Dojo
body, html { font-family:helvetica,arial,sans-serif; font-size:90%; } O aplicativo apresentado na Listagem 5, tem como objetivo
</style> simular um download usando a barra de progresso do Dojo. Veja
<script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
djConfig=parseOnLoad: true>
na tag body que para o uso deste componente necessrio criar
</script> uma div para o mesmo ser montado.
<script type=text/javascript>
dojo.require(dijit.form.Slider);
Listagem 5. Cdigo para o exemplo da barra de progresso.
dojo.require(dijit.form.TextBox);
dojo.addOnLoad(function() {
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN
var slider = new dijit.form.HorizontalSlider({
http://www.w3.org/TR/html4/strict.dtd>
name: slider,
<html dir=ltr>
value: 5,
<head>
minimum: -10,
<style type=text/css>
maximum: 10,
body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
intermediateChanges: true,
</style>
style: width:300px;,
<script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
onChange: function(value) {
djConfig=parseOnLoad: true>
dojo.byId(sliderValue).value = value;
</script>
}
<script type=text/javascript>
},
dojo.require(dijit.ProgressBar);
slider);
var i = 0;
});
function download() {
</script>
jsProgress.update({
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
maximum: 10,
dojo/1.6/dijit/themes/claro/claro.css />
progress: ++i
</head>
});
<body class= claro >
if (i < 10) {
<div id=slider></div>
setTimeout(download, 1000);
<input type=text id=sliderValue dojoType=dijit.form.TextBox />
}
</body>
}
</html>
</script>
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
dojo/1.6/dijit/themes/claro/claro.css />
Na segunda tag script deste exemplo, temos a importao do m- </head>
<body class= claro >
dulo TextBox e do mdulo Slider. Na sequncia, acontece a chamada <div dojoType=dijit.ProgressBar style=width:300px jsId=jsProgress
a dojo.addOnLoad(), que define uma funo para ser executada no id=downloadProgress maximum=10></div><br />
momento em que a pgina for carregada. <input type=button value=Download onclick=download(); />
</body>
Nesta funo criado o componente slider. Note que ao ser ins- </html>
tanciado, realizada a configurao de vrios parmetros, como
o nome do componente (name), o valor inicial (value) e os valores
mnimo e mximo (minimum e maximum). Tambm podemos perceber na segunda tag script da pgina, o
O atributo intermediateChanges, se estiver definido como true, mdulo ProgressBar sendo carregado, e depois a funo download()
indica que o valor do slider ser alterado mesmo com o cursor do criada para atualizar a barra em determinado intervalo de tempo,
componente em movimento. Depois, no atributo style, setamos simulando assim uma barra de download.

Edio 101 Java Magazine 33


Explorando os componentes do Dojo Toolkit

Quando a funo download() chamada, ela atualiza a barra incre- Listagem 6. Cdigo da pgina principal da aplicao.
mentando o atributo progress em uma unidade, e, caso o progresso
ainda no tenha atingido o valor mximo (que foi definido no <!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.
w3.org/TR/html4/loose.dtd>
atributo maximum como igual a 10), ocorre uma chamada usando <html>
a setTimeout(). Esta instruo volta a executar a funo download() <head>
decorridos os 1000 milissegundos que foram passados como <meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1/>
<style type=text/css>
argumento. Caso a barra tenha atingido o valor mximo, este body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
ciclo se encerra. </style>
A Figura 11 expe a barra de progresso em funcionamento. Este <script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
djConfig=parseOnLoad: true>
componente pode ser til quando usado para informar visual- </script>
mente o quanto de uma determinada tarefa j foi concludo. Uma <script type=text/javascript>
indicao grfica muitas vezes mais agradvel para o usurio dojo.require(dijit.form.Form);
dojo.require(dijit.form.Button);
do que exibir apenas texto. dojo.require(dijit.form.TextBox);
dojo.require(dijit.form.DateTextBox);
dojo.require(dijit.form.CurrencyTextBox);
dojo.require(dijit.form.CheckBox);
</script>
<link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
dojo/1.6/dijit/themes/claro/claro.css />
</head>
<body class=claro>
<h3>Dados para realizao da reserva</h3>
Figura 11. Exemplo usando a barra de progresso <div dojoType=dijit.form.Form id=myForm jsId=myForm
action=MyServlet method=POST>
<table>
Exemplo de formulrio usando o Dojo Toolkit <tr>
Nesta seo vamos explorar um pouco mais dos componentes <td><label>Nome:</label></td>
<td><input dojoType=dijit.form.TextBox type=text name=name
do Dojo atravs de um aplicativo exemplo. O programa trata-se
id=name></td>
de um formulrio web, o qual fornecer informaes referentes </tr>
realizao de uma reserva em um hotel ou pousada. <tr>
<td><label>Data inicial da reserva:</label></td>
Aps submeter essas informaes, um Servlet ir receb-las,
<td><input dojoType=dijit.form.DateTextBox type=text name=date1
trat-las e ento direcion-las para uma pgina que ir simular id=date1 value=2012-01-10 /></td>
uma resposta ao usurio. A ttulo de demonstrao, ao chegar ao </tr>
<tr>
Servlet, as informaes sero apenas repassadas para a pgina de
<td><label>Data final da reserva:</label></td>
resposta. Mas em uma aplicao real, os dados podem depender <td><input dojoType=dijit.form.DateTextBox type=text name=date2
de recursos do servidor para a gerao de algum resultado vlido id=date2 value=2012-01-20 /></td>
</tr>
ao usurio. Neste prprio caso, se fossemos implantar o aplicativo
<tr>
em um hotel, um banco de dados seria necessrio para verificar a <td><label>Nmero de pessoas:</label></td>
disponibilidade dos quartos e registrar as reservas realizadas. <td><input dojoType=dijit.form.TextBox type=text name=num id=num>
</td>
</tr>
Desenvolvendo e entendendo o exemplo <tr>
Para desenvolver as pginas do exemplo, utilizaremos a mesma <td><label>Adiantamento (XXX,XX):</label></td>
estrutura de diretrios criada na seo anterior. Deste modo, <td><input dojoType=dijit.form.CurrencyTextBox type=text name=money
id=money></td>
dentro da pasta WebContent, crie a pgina index.html e adicione o </tr>
cdigo apresentado na Listagem 6. <tr>
Logo na segunda tag script do cdigo, vemos o uso da funo <td><label>Veculo:</label></td>
<td><input dojoType=dijit.form.CheckBox id=car name=car
require para importar os mdulos do Dojo que sero necessrios value=Sim checked ></td>
na pgina inicial. So eles o Form, o Button, o TextBox, o DateText </tr>
Box, o CurrencyTextBox e o CheckBox. <tr>
<td align=center colspan=2>
Para a criao do formulrio, usamos o componente dijit.form. <button dojoType=dijit.form.Button type=submit
Form, que similar tag HTML <form>, mas possui um nmero iconClass=dijitIconSave>Salvar Reserva</button>
maior de recursos, como por exemplo, a validao dos campos, que </td>
</tr>
no nosso exemplo no ser utilizada. Note que o componente Form </table>
foi criado em uma div. Nela definimos que os dados dos campos </div>
sero submetidos atravs do mtodo POST para MySerlvet, que </body>
</html>
foi especificado no atributo action.

34 Java Magazine Edio 101


Ao selecionar o boto Salvar Reserva todos os dados preenchidos
no formulrio sero enviados para MyServlet, que vamos implemen-
tar neste momento. Para isso, devemos criar um pacote dentro da
pasta src. Este pacote receber o nome de example.servlet, e dentro
dele desenvolveremos o Servlet que ser responsvel por simular
um registro de reserva, apenas direcionando os dados recebidos
para uma pgina de resposta.
Para criar o Servlet, d um clique com o boto direito sobre o pa-
cote e depois em New > Servlet. Dessa forma, a janela para criao
do mesmo ser apresentada, como mostra a Figura 14. D o nome
de MyServlet para a classe e ento clique em Finish.

Figura 12. DateTextBox na pgina inicial da aplicao

Dentro desta div possvel observar os campos para entrada de


dados. Dentre eles, um campo para o nome, empregando o com-
ponente TextBox. Ao us-lo o visual das bordas do input e suas
dimenses so alteradas de acordo com o tema adotado. Tambm
definido um campo para a data inicial da reserva e outro para a
data final, utilizando o DateTextBox. A Figura 12 demonstra este
componente ao rodar a pgina inicial da aplicao.
Na sequncia, h um campo para a quantidade de pessoas
(TextBox), e ento, utilizamos um tipo especial de input, denomi-
nado CurrencyTextBox, que se trata de um campo para moeda que
j inclui validao e at completa com ",00" se, por exemplo,
informarmos um valor inteiro.
Abaixo de CurrencyTextBox h a definio de um CheckBox, no qual
o cliente informa se ir de carro e, depois, o boto Salvar Reserva.
Observe no boto que informamos uma classe de cone atravs
do atributo iconClass. A Figura 13 ilustra o formulrio completo
criado na pgina index.html.

Figura 14. Criando um novo Servlet

A Listagem 7 exibe o cdigo de MyServlet. Este ir receber os pa-


rmetros passados pelo formulrio (dados de reversa do cliente) e
enviar um JSON com as mesmas informaes para uma pgina de
confirmao de reserva que simula uma resposta ao usurio.
Ao receber a requisio no Servlet, pelo mtodo doPost(), os parme-
tros so transferidos para variveis e depois o contedo destas vari-
veis inserido em um HashMap. Neste ponto h apenas uma exceo
para o parmetro car. Como ele se refere ao CheckBox, se o componente
no for marcado no formulrio, o parmetro car no ser enviado, ou
seja, a chamada request.getParameter() retornar null para car. Devido a
isso, h uma condio verificando o valor desta varivel.
Dando continuidade a nossa anlise, o HashMap convertido para
a notao JSON utilizando a biblioteca gson do Google. No entanto,
antes de entendermos o que est acontecendo no cdigo, necess-
Figura 13. Pgina inicial da aplicao rio conhecer o conceito de JSON e o que a biblioteca gson faz.
O JSON trata-se de uma maneira leve para a troca de informa-
- Apenas como ressalva: no desenvolvimento da pgina no implementamos es, uma representao de objetos JavaScript no formato de String.
validao nos campos do formulrio. Portanto, erros podem ocorrer no servidor J o google-gson uma biblioteca que possibilita convertermos
caso dados em formatos invlidos sejam informados. objetos Java para essa notao, ou convertermos objetos na notao

Edio 101 Java Magazine 35


Explorando os componentes do Dojo Toolkit

JSON para Java. Para compreender melhor este conceito, vamos Listagem 8. Cdigo da pgina JSP responsvel por criar a grid.
voltar anlise do cdigo da classe MyServlet.
<%@ page language=java contentType=text/html; charset=ISO-8859-1
No nosso Servlet, aps adicionarmos os dados referentes reser-
pageEncoding=ISO-8859-1%>
va no HashMap, usamos a biblioteca gson, atravs do mtodo gson. <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01//EN
toJson(), para converter o HashMap em uma String JSON, armazenando http://www.w3.org/TR/html4/strict.dtd>
<html dir=ltr>
o resultado na varivel json. Note que aps essa converso, existe <head>
uma linha de cdigo responsvel por apresentar a String resultante <meta http-equiv=Content-Type content=text/html; charset=ISO-8859-1/>
<style type=text/css>
no console, como mostra o exemplo seguinte: body, html { font-family:helvetica,arial,sans-serif; font-size:90%; }
</style>
{car:Sim, num:3, name:Luis Tavares, money:100, date2:2012-01-20, <script src=http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js
date1:2012-01-10} djConfig=parseOnLoad: true>
</script>
Veja que a String possui o formato de um objeto JavaScript. Na <script>
dojo.require(dojo.data.ItemFileWriteStore);
sequncia, o JSON com as informaes enviado para a pgina dojo.require(dojox.grid.DataGrid);
de resposta. Voc pode ver na chamada request.setAttribute(), a <%
String result = (String) request.getAttribute(result);
varivel json sendo inserida no request. if (result != null) {
Agora, vamos analisar o que acontece quando essa varivel %>
var json = <%=result %>;
recebida na pgina de confirmao de reserva. <%
}
%>
var userInfo = [{name: Nome, info: json.name},
Listagem 7. Cdigo do Servlet da aplicao. {name: Data inicial, info: json.date1},
{name: Data final, info: json.date2},
package example.servlet; {name: Qtd Pessoas, info: json.num},
import java.io.IOException; {name: Adiantamento, info: json.money},
import java.util.HashMap; {name: Carro?, info: json.car}];
import javax.servlet.RequestDispatcher; var userData = {
import javax.servlet.ServletException; items: userInfo
};
import javax.servlet.annotation.WebServlet;
var gridLayout = [
import javax.servlet.http.HttpServlet;
[{
import javax.servlet.http.HttpServletRequest;
field: name,
import javax.servlet.http.HttpServletResponse; name: Informaes,
import com.google.gson.Gson; width: 10
@WebServlet(/MyServlet) },
public class MyServlet extends HttpServlet { {
private static final long serialVersionUID = 1L; field: info,
protected void doGet(HttpServletRequest request, HttpServletResponse name: ,
response) throws ServletException, IOException { width: 16
} }]];
protected void doPost(HttpServletRequest request, HttpServletResponse </script>
response) throws ServletException, IOException { <link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
String name = request.getParameter(name); dojo/1.6/dijit/themes/claro/claro.css />
String date1 = request.getParameter(date1); <link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
String date2 = request.getParameter(date2); dojo/1.6/dojox/grid/resources/Grid.css />
String num = request.getParameter(num); <link rel=stylesheet type=text/css href=http://ajax.googleapis.com/ajax/libs/
dojo/1.6/dojox/grid/resources/nihiloGrid.css />
String money = request.getParameter(money);
<style type=text/css>
String car = request.getParameter(car);
.dojoxGrid table { margin: 0; }
if (car == null){
</style>
car = No; </head>
} <body class=claro>
HashMap<String, String> map = new HashMap<String, String>(); <div dojoType=dojo.data.ItemFileWriteStore data=userData
map.put(name, name); jsId=dataStore></div>
map.put(date1, date1); <h3>Reserva realizada com sucesso!</h3>
map.put(date2, date2); <div id=grid style=width: 354px; height: 200px; dojoType=dojox.grid.DataGrid
map.put(num, num); store=dataStore structure=gridLayout></div>
map.put(money, money); </body>
map.put(car, car); </html>
Gson gson = new Gson();
String json = gson.toJson(map);
System.out.println(json);
RequestDispatcher dispatcher = null; Analisando a montagem da pgina de resposta da reserva
dispatcher = request.getRequestDispatcher(/grid.jsp);
Neste momento estudaremos a pgina responsvel por simular a
request.setAttribute(result, json);
dispatcher.forward(request, response); confirmao da reserva. Seu cdigo apresentado na Listagem 8 e
} deve ser inserido no arquivo grid.jsp. Este arquivo, por sua vez, deve
}
ser criado dentro da pasta WebContent do projeto.

36 Java Magazine Edio 101


Analisando a segunda tag <script>, temos os dois mdulos para o nosso exemplo, e a Figura 16 mostra a grid j montada na
necessrios criao da grid sendo carregados, so eles: grid e pgina, aps a submisso do formulrio.
store, que estudaremos a seguir. Na sequncia, as informaes
enviadas pelo Servlet so atribudas a uma varivel JavaScript Concluso
chamada json. Este artigo abordou o uso de diversos componentes do Dojo
Feito isso, criamos um array JavaScript (userInfo) para armaze- Toolkit, focando na sua usabilidade e simplicidade. Foram
nar as informaes provenientes do Servlet e tambm criamos a demonstrados no somente os componentes para formulrios,
varivel userData, que armazena os itens que estaro presentes mas tambm componentes como menus e abas que colaboram
na grid, atribuindo como itens cada um dos dados do usurio para uma melhor organizao e disposio das informaes
informados ao realizar a reserva. em uma pgina web. Alguns conceitos de usabilidade tambm
A grid tem seus dados providos por um ItemFileWriteStore, que foram discutidos no decorrer dos exemplos, mostrando as van-
definido na primeira div da tag <body>. Neste componente tam- tagens que o Dojo Toolkit pode propiciar quando utilizamos
bm definimos que os itens que sero providos esto armazenados seus recursos.
na varivel userData. Ento, criamos uma div para a grid, e na div
especificamos o componente store que a grid utilizar. Luis Antonio Tavares
Para finalizar, vamos ver como ficou a estrutura do projeto luis.tavares@msn.com
e rodar o aplicativo para entendermos o seu funcionamento. bacharel em Sistemas de Informao pela Universidade do Vale do Sa-
A Figura 15 apresenta a estrutura final do projeto que construmos puca e tcnico em eletrnica. Atua desde 2008 no desenvolvimento de
software, trabalhando com linguagens como Java, Python, C, C#, Lua, entre
outras. Atualmente trabalha no Inatel em projetos com Linux Embarcado.

http://dojotoolkit.org
Site oficial do Dojo Toolkit.
http://dojotoolkit.org/download
Link para download do Dojo Toolkit.
http://dojotoolkit.org/documentation
Documentao do Dojo Toolkit.
http://www.eclipse.org/downloads
Link para download do Eclipse
http://tomcat.apache.org/download-70.cgi
Figura 15. Estrutura do exemplo Link para download do Apache Tomcat.
http://code.google.com/p/google-gson/downloads/detail?name=google-gson-
1.7.1-release.zip
Link para download da biblioteca google-gson.

D seu feedback sobre esta edio! Feedback


eu
s

A Java Magazine tem que ser feita ao


D

seu gosto. Para isso, precisamos saber


sobre e

o que voc, leitor, acha da revista!


s

ta
edio

D seu voto sobre este artigo, atravs do link:


www.devmedia.com.br/javamagazine/feedback
Figura 16. Grid simulando uma confirmao de reserva

Edio 101 Java Magazine 37


Seo Java: Nesta seo voc encontra artigos intermedirios e avanados sobre Java

JavaOne Latin America 20


O evento Java mais importante da Amrica

Resumo DevMan
De que se trata o artigo:
O JavaOne o evento mais importante da comunidade Java. durante este evento que grandes anncios
e novidades so apresentados. Saber o que ocorreu durante o evento permite uma melhor compreenso
sobre os rumos da plataforma Java.

Em que situao o tema til:


Acompanhar o que ocorre em eventos de grande importncia para manter-se atualizado. O JavaOne
Latin America reuniu palestrantes internacionais e as principais figuras da comunidade brasileira que,
durante os dias do evento, discutiram e apresentaram temas relevantes sobre o ecossistema Java.

JavaOne Latin America 2011:


O JavaOne Latin America 2011 foi realizado em conjunto com os eventos Oracle OpenWorld nos dias 6 a
8 de dezembro na cidade de So Paulo pelo segundo ano seguido. Este evento englobou toda a Amrica
Latina ao invs de apenas o Brasil (como foi na edio passada), tornando-se o maior e mais importante
evento Java dos continentes Amrica da Sul e Amrica Central.

P
elo segundo ano seguido, o JavaOne abrangncia do evento para toda a Amri-
Latin America 2011 (tambm conhe- ca Latina, renomeando o evento para Java-
cido como JavaOne Brasil) foi reali- One Latin America), e tambm ir realizar
zado em So Paulo entre os dias 6 e 8 de o evento nos seguintes pases: Japo (4 e 5
dezembro de 2011 no Transamrica Expo de abril de 2012, sendo a primeira vez que
Center juntamente com o Oracle Open o evento ser realizado neste pas), Rssia e
World. Este evento sem dvida alguma, o ndia (no segundo bimestre de 2012, sendo
maior e mais importante evento realizado a segunda vez que o evento ser realizado
na Amrica Latina sobre a tecnologia Java, nos pases citados).
e consequentemente, o maior evento sobre
Java do Brasil. Pr-Evento: Java Geek Bike Ride
O JavaOne realizado anualmente nos No domingo que antecedeu o evento (4
Estados Unidos, na cidade de San Fran- de dezembro de 2011), Fabiane Nardon, ex-
cisco, desde 1996. Atualmente conta com pert Java e Java Champion, organizou um
aproximadamente 15 mil participantes. passeio de bicicleta pela ciclovia da cidade
O pblico alvo so estudantes de TI e de So Paulo. Toda a comunidade Java foi
profissionais que trabalham com a tecno- convidada para passar um tempo com os
logia Java. experts e evangelistas da Oracle e bater um
Em 2010, a Oracle decidiu organizar edi- papo fora dos tpicos tcnicos.
es regionais do JavaOne pela primeira
vez na histria do evento, e os pases esco- O Evento e a Organizao
lhidos foram Brasil, Rssia, China e ndia. Assim como em 2010, o JavaOne foi rea-
Em 2011, pela segunda vez consecutiva, a lizado paralelamente com o Oracle Open
empresa realizou uma edio do JavaOne World. Apesar de dois eventos totalmente
no Brasil (e desta vez decidiram expandir a distintos o primeiro focado na tecno-

38 Java Magazine Edio 101


Acompanhe em

11
primeira mo como
foi o JavaOne Latin
America 2011 realizado
na cidade de So Paulo

a Latina
Loiane Groner

logia Java, tendo um perfil mais tcnico, e o segundo focado no Durante o evento, a equipe do OTN (Oracle Technology Net
ambiente corporativo (solues e produtos Oracle) funcionam work) gravou vrias entrevistas com experts Java brasileiros
muito bem juntos. e experts Java da Oracle, entre eles: Fabiane Nardon (Java EE),
Em 2010, aproximadamente 800 participantes compareceram ao Loiane Groner (Java e JavaScript), Jim Weaver (JavaFX), Geertjan
evento, e infelizmente, em 2011, esse nmero no foi ultrapassado. Wielenga (NetBeans), Edilmar e Joo (JUG Leaders do JUGMS),
Em 2010 alguns problemas ocorreram durante a conferncia, Juliano Viana (Java EE e GlassFish), Yara Senger e Yvone Masca-
como superlotao das salas, filas longas e problemas com ar renhas veja a Figura 2.
condicionado. Outro ponto que tambm sofreu reclamao dos
participantes foi o fato do Oracle Open World ter sido realizado
no pavimento maior do Transamrica Expo Center e o JavaOne
ter ficado com um espao muito pequeno, localizado no piso
superior do prdio ao lado do pavilho. Graas ao feedback da
comunidade e dos participantes, estes problemas foram endere-
ados organizao e em 2011 a organizao do evento melhorou
muito. A conferncia foi realizada no pavilho de exposio, um
espao muito maior (juntamente com o Oracle Open World), e
os auditrios usados para as palestras tinham um espao bem
maior tambm. Alm disso, a organizao tambm ampliou o
Java Lounge, um espao com puffs para a comunidade passar
um tempo e relaxar durante o evento.

Networking
Um evento desse porte uma tima oportunidade para ne-
tworking. Pensando nisso, a organizao do evento montou um
espao onde os participantes podiam descontrair e bater um papo Figura 2. Loiane entrevista Juliano Viana para o Oracle Technology Network
com os evangelistas e experts da Oracle, alm dos Java Champions
(veja a Figura 1). O episdio 60 do Java Spotlight Podcast (podcast sobre Java
gravado pela Oracle que disponibilizado para comunidade)
tambm foi gravado ao vivo durante o evento. Este podcast contm
uma entrevista com Yara e Vincius Senger, que falaram sobre o
aniversrio de 10 anos da Global Code, e uma entrevista com Mike
Lehmann (diretor snior de gerenciamento de produtos Oracle),
que falou sobre a release do WebLogic 12c.

Palestras e Keynotes
Um ponto muito forte do evento foi a qualidade das palestras e
keynotes apresentados. E essa qualidade muito se deve ao comit
de avaliao local (alm dos palestrantes escolhidos), formado por:
Bruno Souza (Java Man), Fabiane Nardon, Mauricio Leal, Yara
Senger, Vincius Senger, Loiane Groner, Bruno Ghisi, Guilherme
Silveira, Paulo Silveira, Edson Yanaga, Daniel de Oliveira e Fabio
Veloso. Essas pessoas receberam carta branca da organizao
da Oracle para escolher quais palestras seriam apresentadas no
Figura 1. Java Lounge no JavaOne Latin America 2011 evento. Ou seja, no houve nenhuma presso por parte da Oracle

Edio 101 Java Magazine 39


JavaOne Latin America 2011

e as palestras aprovadas pelo processo de and Devices; e Client Side Technologies and OpenJDK se torna a referncia de imple-
call for papers foram devido ao mrito Rich User Experiences. mentao oficial do Java 7;
tcnico de cada uma delas. O JavaOne Latin America 2011 tambm Twitter junta-se ao OpenJDK e JCP;
A Oracle tambm cedeu boa parte do contou com quatro sesses HOL (Hands SouJava e London JUG so eleitos como
nmero de palestras para a comunidade on Lab), onde foram demonstrados como parte do comit executivo do JCP;
brasileira, ou seja, essas palestras foram usar GlassFish, Java EE, Java FX e outras Oracle lana a Oracle Java Magazine, com
apresentadas no evento por brasileiros e tecnologias na prtica. mais de 50 mil inscries gratuitas;
escolhidas pelo comit de avaliao local. O evento tambm contou com dois keyno- Lanamento do NetBeans 7.
Em 2010, 50% das palestras foram apre- tes organizados pela Oracle (mesmo nmero
sentadas por palestrantes da Oracle e 50% de 2010), onde foram apresentados os planos A Oracle tambm apresentou algumas
foram apresentadas por palestrantes da e as novidades do ecossistema Java. estatsticas sobre o Java, dentre elas: exis-
comunidade Java brasileira. Em 2011, essa O primeiro keynote Oracle foi apresen- tem aproximadamente nove milhes de
diviso ficou em 43% das palestras para tado por Nandini Ramani, Georges Saab desenvolvedores Java ao redor do mundo;
palestrantes Oracle e 57% para palestrantes e Sharat Chander, que falaram sobre a Java a linguagem nmero 1 entre os de-
da comunidade brasileira. Esse nmero de- estratgia da Oracle em relao plata- senvolvedores; e tambm a plataforma
monstra que a Oracle quer dar foco ao con- forma Java para os prximos anos (veja mais utilizada para desenvolvimento de
tedo produzido localmente, e apresentado a Figura 3). aplicaes.
para sua comunidade local. No total, foram O segundo keynote Oracle foi apresenta- No keynote foi apresentado o roadmap
56 palestras tcnicas apresentadas durante do por Roger Brinkley, Simon Riter, Arun planejado pela Oracle para os lanamentos
a conferncia, divididas entre as seguintes Gupta e Terrence Bar, que falaram sobre Java at 2014. Entre os milestones previs-
tracks: Java EE Web Profile, Platform Tech- Java SE, JavaFX, Java EE/Cloud e Java ME/ tos, esto a release de alguns updates para
nologies, Web Services and the Cloud; Core Embedded, respectivamente. o JDK 7 e, em meados de 2013, o lanamen-
Java Platform; Java ME, Mobile, Embedded to do Java 8, seguido de uma nova verso
Java SE do NetBeans com suporte para o mesmo
Durante os keynotes, foram relembrados (veja a Figura 4).
alguns pontos importantes que aconte- Durante os keynotes tambm foi apre-
ceram durante o ano de 2011. Entre eles sentado o que se pode esperar do Java
podemos destacar: 8. Entre o contedo previsto, podemos
Lanamento do JDK 7 em 28 de Julho de destacar: o Projeto Jigsaw, que tem como
2011 (lanado inclusive no Brasil, durante objetivo permitir a criao de mdulos de
o TDC 2011); sistemas (colees de classes e interfaces)
R elease do JRockit sob a mesma licena dentro da plataforma Java; o projeto Lam-
do JDK; bda, que introduz closures plataforma
Lanamento da verso preview do JDK Java; o lanamento do JavaFX 3.0 embutido
7 para Mac OS; no JDK; JavaScript na JVM; entre outros
IBM, Apple, SAP e Azul ingressam no tpicos que podem ser visualizados na
Figura 3. Oracle Strategy Keynote: Georges Saab, Nandini
OpenJDK; Figura 5.
Ramani e Sharat Chander
O NetBeans tambm foi citado como
parte dos planos de crescimento da Oracle.
Logo que o Java 7 foi lanado, tambm
foi lanada uma verso do NetBeans com
suporte aos novos recursos do Java 7, alm
das ltimas verses do GlassFish. O supor-
te para CDI, servios Rest e persistncia
Java tambm sofreram melhorias. Com
o lanamento do JavaFX 2.0, o NetBeans
tambm suportar esta nova verso, alm
dos desenvolvedores poderem fazer debug
de aplicaes visuais desenvolvidas com
esta plataforma. Atualmente, j foram fei-
tos aproximadamente mais de 22 milhes
de downloads da IDE, que possui cerca de
Figura 4. JDK Roadmap Fonte: Oracle 1 milho de usurios ativos no mundo.

40 Java Magazine Edio 101


A Oracle tambm divulgou alguns pla-
nos para depois do lanamento do Java 8.
A ideia ter uma JVM que suporte ml-
tiplas e diferentes linguagens, melhorar a
integrao dessas linguagens com o cdigo
Java, ter uma JVM que seja fcil de usar e
fcil para dar manuteno nas linguagens
suportadas, suporte a multi-tenancy/
cloud, alm de melhorar o gerenciamento
de recursos da JVM na nuvem. Tambm
se pode citar o suporte a um sistema de
tipos de variveis unificado, incluindo
otimizaes s estruturas de dados exis-
Figura 5. Planejamento do Java 8 Fonte: Oracle
tentes, suporte a modelos heterogneos de
computadores, entre outros.

Java EE
O Java EE a plataforma de maior su-
cesso do ecossistema Java. Atualmente ela
possui mais de 40 milhes de downloads,
e no mundo enterprise, a plataforma
nmero um nas empresas.
Apesar de todo o sucesso do Java EE,
ainda existem muitas coisas que precisam
ser melhoradas. preciso cada vez mais
eliminar o XML das aplicaes e fazer
com que desenvolvedor foque mais em
Java. Os planos para esse assunto incluem
otimizao de tarefas (tentativa de elimi-
nar a maior quantidade de configuraes
em XML e aumentar o uso de anotaes), Figura 6. Providncia automtica dos servios das dependncias de uma aplicao Fonte: Oracle Fonte: Oracle
elevando a produtividade dos desenvol-
vedores Java EE. fazer o deploy da aplicao primeiro e este API para suporte a JSON, melhorias no
O ponto mais destacado pela Oracle ir configurar todos os recursos e servios suporte de servios REST, entre outros
a questo do cloud computing, ainda necessrios para a aplicao poder ser exe- (veja a Figura 8).
no suportado nativamente pelo Java EE. cutada com sucesso, ou seja, uma espcie
Nos dias de hoje, todas as solues cloud de injeo de dependncia dos recursos JavaFX
disponveis no mercado so proprietrias, essenciais (observe a Figura 6). Tanto se fala que JavaFX uma tecno-
como Amazon, Windows Azure, Google Outro ponto destacado nos keynotes a logia morta, mas este foi um dos tpicos
App Engine, Cloud Fondry e Salesforce. questo da elasticidade de uma aplicao de maior destaque do JavaOne de 2011.
Apesar de servios muito bons, essas Java EE, ou seja, a capacidade de escalar Durante o evento, a Oracle anunciou o
solues no seguem nenhum padro uma aplicao Java EE, juntamente com lanamento do JavaFX 2.0, e quer levar esta
de implementao. A ideia da Oracle outros servios de um data center. Como tecnologia a um prximo nvel, atravs da
criar uma plataforma cloud baseada em se sabe a hora certa de escalar uma apli- distribuio da ferramenta juntamente
padres, assim como as tecnologias Java cao Java EE sem haver desperdcio de com o JDK, e no mais como um produto
EE so implementadas atualmente. recursos? Como obtemos essa informa- parte do ecossistema Java. Dentre os
O plano da Oracle mudar o modo como o? As respostas para essas perguntas novos recursos esto o suporte a vrias
configuramos uma aplicao Java EE nos tambm so o foco para o Java EE 7, onde plataformas, incluindo poder usar JavaFX
dias de hoje, onde precisamos configurar se planeja implementar essa elasticidade em smartphones, modularizao da ar-
os recursos necessrios antes de fazer o (ver a Figura 7). quitetura, ferramenta de edio avanada
deploy da mesma: JDBC, JMS, etc., para Entre outros recursos planejados para (JavaFX Scene Builder NetBeans), alm
depois fazermos o deploy do arquivo Java EE 7, podemos destacar: melhorias de novos componentes. Outro grande
.EAR. Atravs do servio de cloud pode-se da API de JMS, nova API para caching, anncio em relao ao JavaFX foi que

Edio 101 Java Magazine 41


JavaOne Latin America 2011

ele agora open source, e ser parte do OpenJDK. Uma grande


oportunidade da comunidade Java ajudar a manter e fazer com
que essa ferramenta cresa.
Como apresentado na Figura 9, a Oracle tem muitos planos
para o JavaFX, como o lanamento do JavaFX no OpenJDK para
Mac OS e suporte a Linux em meados de 2012 e o lanamento da
verso 3. Figura 10. Java ME Roadmap Fonte: Oracle

Java ME Projeto Avatar


Um dos pontos destacados durante os keynotes da Oracle foi o fato Outra grande surpresa do JavaOne Latin America 2011 foi o
de desenvolvedores Java reclamarem que o Java ME diferente do anncio do Project Avatar (Projeto Avatar). O HTML 5 uma
Java SE. Quando uma pessoa j sabe Java SE e quer aprender Java tecnologia que veio para mudar o modo como vemos a web atu-
ME, necessrio aprender vrias coisas novas para se comear a almente, e no temos como fugir dela. O Projeto Avatar abre as
desenvolver no mdulo mobile. Tendo isso em vista, a Oracle tem portas para o HTML 5 e ajuda a incorpor-lo nos projetos Java.
planos para juntar o Java ME e o Java SE, fazendo releases paralelas Hoje j podemos integrar cdigo HTML 5 com Java, mas no
dos dois produtos, ou seja, quando for lanado a verso X do Java SE, to simples assim. JavaServer Pages (popularmente conhecidos
tambm ser lanado a verso X do Java ME. Outro ponto importan- como JSPs) foram criados para ajudar e facilitar a integrao de
te do plano da empresa fazer com que seja possvel executar APIs cdigo HTML com Java, e o Projeto Avatar est sendo criado para
do Java ME em um ambiente Java SE, alm do desenvolvimento de facilitar a integrao do HTML 5 com o Java SE, Java EE e Java
novas APIs para desenvolvimento mobile. ME (veja a Figura 11).
Um roadmap do Java ME tambm foi divulgado durante o even-
to, contendo os prximos lanamentos, como podemos verificar
na Figura 10.

Figura 11. Projeto Avatar Fonte: Oracle


Figura 7. Elasticidade de aplicaes Java EE Fonte: Oracle
A Oracle apresentou uma demonstrao de como todas essas
tecnologias iro funcionar juntas no keynote de estratgia da
companhia.

Community Keynote
Em 2011 a Oracle tambm cedeu o fechamento do evento para
a comunidade Java brasileira, com o Community Keynote. A
Oracle deu total autonomia para que a comunidade decidisse
sobre o que apresentar. Foi um voto de confiana que a Oracle
depositou nos representantes brasileiros.
Figura 8. Objetivos do Java EE 7 Fonte: Oracle
O Community Keynote foi um dos destaques do evento, sendo
apresentado por Bruno Souza e Fabiane Nardon, com partici-
pao especial de Vincius Senger, que apresentou o projeto
JHome, vencedor do Dukes Choice Award 2011, entregue no
JavaOne 2011 (San Francisco Estados Unidos).
O foco dado por Fabiane e Bruno no keynote foi mostrar como
os desenvolvedores Java so pessoas animadas, brilhantes e
capazes de fazer projetos incrveis com Java.
Com o JHome, Vincius Senger passou um caf e ascendeu
vrias lmpadas (inclusive com tema natalino e com direito a
Figura 9. JavaFX Roadmap Fonte: Oracle pisca-pisca). A plateia tambm pde participar ascendendo e

42 Java Magazine Edio 101


desligando uma lmpada atravs de um tweet. Outro desta- Loiane Groner
que da apresentao do JHome foi controlar os batimentos contato@loiane.com, http://loiane.com
cardacos de Arun Gupta, que estava vestindo um transmis- bacharel em Cincia da Computao, trabalha como Engenheira de
sor de frequncia cardaca da Polar usando Java, e quando os Software Sr no Citibank (maior instituio financeira do mundo) em
batimentos de Arun Gupta chegaram a 70, o website preferido projetos internacionais, em So Paulo. J trabalhou na IBM como IT Specialist
e lder de equipe para projetos internacionais. Possui 6+ anos de experi-
dele abriu no telo do keynote hall (oracle.com).
ncia em Java EE. Escritora, tem um livro sobre ExtJS em ingls (Ext JS 4 First Look) lanado
Durante o Community Keynote tambm foi lanado o grupo
mundialmente pela Packt Publishing. Atua como JUG Leader no CampinasJUG e coordenadora
JDuchessBR, um segmento dentro do SouJava que possui a do ESJUG,alm de ser uma das fundadoras do JDuchessBR. Nas horas vagas escreve artigos
mesma ideia do JDuchess, que uma rede global para mu- tcnicos e sobre carreira em TI nos blogs http://loiane.com e http://loianegroner.com.
lheres conectadas pela tecnologia Java. O objetivo do grupo
dar maior visibilidade s mulheres que j esto na rea e http://www.loiane.com/2011/12/javaone-brasil-2011-video-do-
tambm incentivar que mais mulheres escolham TI para sua community-keynote/
carreira profissional. Estavam presentes no lanamento do Vdeo completo do Community Keynote.
grupo: Fabiane Nardon, Loiane Groner, Yara Senger e Ana
Abrantes. http://www.youtube.com/watch?v=BNJIjgFhpUA
E para fechar o evento e o keynote com chave de ouro, foi Vdeo dos desenvolvedores Java no fechamento do Community Keynote.
exibida uma verso do clipe Java Life - Code Hard (rap http://blogs.oracle.com/java/entry/javaone_latin_america_videos_and
criado pela Oracle) chamada Real Java Geeks, com fotos Entrevistas e podcast gravados durante o JavaOne Brasil 2011.
de desenvolvedores Java em suas horas vagas. Desenvolve-
dores Java que tambm so msicos, surfistas, jardineiros, http://www.oracle.com/javaone/lad-pt/home/index.html
velejadores, ciclistas, etc. Parte do trecho desse rap criado Pgina do evento.
pela Oracle dizia We code hard in these cubicles, que em http://geekbikeride.eventbrite.com/
traduo livre para o portugus significa: Ns programamos Geek Bike Ride: passeio de bicicleta organizado por Fabiane Nardon.
muito nesses cubculos (no sentido de baia de trabalho). E
a mensagem sinalizava para sairmos de vez em quando dos
http://www.soujava.com/jDuchessBR
cubculos e viver a vida, fazer outras atividades e se divertir.
Site no grupo JDuchess no SouJava.
Uma tima maneira de fechar o evento! http://www.loiane.com/2011/12/javaone-latin-america-2011-links-fotos-e-
videos-do-evento
Concluses Fotos, vdeos, entrevistas e links do evento.
O JavaOne Latin America foi maravilhoso, tornando-se o
http://blogs.oracle.com/javaspotlight/
evento Java mais importante da Amrica Latina. Durante e
Java Spotlight Podcast.
depois do evento, os participantes deram seu feedback e mais
melhorias sero implantadas para o prximo JavaOne Brasil,
D seu feedback sobre esta edio!
que ser um evento ainda melhor. Cabe agora comunidade eu
Feedback

s
brasileira aproveitar e apreciar a oportunidade de entrar em A Java Magazine tem que ser feita ao
D
seu gosto. Para isso, precisamos saber

sobre e
contato com vrios profissionais brasileiros experientes e
o que voc, leitor, acha da revista!
profissionais Oracle que esto frente das ferramentas do
s
ta
edio

mundo Java. D seu voto sobre este artigo, atravs do link:


www.devmedia.com.br/javamagazine/feedback

Edio 101 Java Magazine 43


Seo Java: Nesta seo voc encontra artigos intermedirios e avanados sobre Java

Transaes com EJB


Manipule transaes com as facilidades do

Resumo DevMan
De que se trata o artigo:
Este artigo apresenta formas de se trabalhar com transaes em conjunto com o Java EE, as caractersticas
bsicas de uma transao, a JPA e os modos de gerenciamento de transaes CMT e BMT.

Em que situao o tema til:


O tema til para desenvolvedores e projetistas de sistemas que trabalham com EJBs e necessitam
de tcnicas para o controle de transaes, alm dos conhecimentos adicionais sobre o compor-
tamento de transaes no Java EE, a manipulao das interfaces e anotaes JTA, e os modos de
gerenciamento CMT e BMT.

Transaes com EJB:


O Java EE, por meio da JTA, possui dois modos simples para o gerenciamento de transaes: o
configurvel (CMT) e o programvel (BMT). Dessa forma, possvel adotar estes modos para projetar
e desenvolver sistemas mais eficazes com o uso de transaes. Este o foco principal do contedo
apresentado neste artigo.

A
tualmente, grande parte dos sis- O que uma transao?
temas corporativos utiliza banco Transao uma sequncia ordenada
de dados relacional para guardar de operaes em um banco de dados que
informaes referentes a caractersticas so tratadas como um bloco nico. Ela
de negcio que os mesmos se propem a trabalha com a unio de dois grupos de
atender. Com isso, alm do desenvolvedor instrues, sendo um para manipulao
conhecer atecnologia Java, importante de dados (incluso, alterao e excluso) e
conhecer o funcionamento bsico de um outro para delimitao da transao (begin,
banco de dados ecomo feita a comuni- commit e rollback).
cao entre eles.
Quando trabalhamos com o banco de - A delimitao da transao explicitada pelos
dados relacional,alm de manipularmos termos:begin, que determina o incio da transao;
os dados com as operaes bsicas de commit, que confirma o sucesso da manipulao de
consulta, incluso, alterao e excluso, dados desde o incio da transao; e rollback, que
tambm se faz necessrio ter o domnio anula toda a manipulao de dados desde o incio
sobre transaes e como a tecnologia Java da transao.
pode trabalhar com ela.
Neste contexto, este artigo ir abordar Uma transao deve seguir o principio
uma introduo ao assunto transaes ACID, que o acrnimo para Atmica,
em banco de dados, destacando seus Consistente, Isolada e Durvel. Sendo:
princpios e suas instrues de controle, Atmica: Uma transao que deve exe-
seguido das formas que o Java EE possui cutar completamente ou no executar. Isso
para control-las, utilizando EJB. significa que cada operao dentro de uma

44 Java Magazine Edio 101


Entenda como o Java
EE pode auxili-lo no
controle das transaes
com JTA, CMT e BMT

o Java EE
Eduardo Correia da Silva

unidade de trabalho no deve conter erros. Se uma delas falhar, tratamento. Ou seja, so tratamentos que tendem ao infinito.
toda a unidade de trabalho ou transao ser abortada, signifi- neste caso que a transao se aplica.
cando que quaisquer alteraes nos dados sero desfeitas. Por A Listagem 3, por sua vez, o mesmo exemplo da Listagem 2,
sua vez, se todas elas executarem com sucesso, a transao ser mas modificado para fazer uso de uma transao. A instruo
confirmada, o que significa que as alteraes nos dados tornam-se begin delimita o incio da transao, commit termina a transao
permanentes e durveis; garantindo o sucesso de toda a manipulao de dados, e as instru-
Consistente: Refere-se integridade do armazenamento de es rollback terminam a transao anulando toda a manipulao
dados. Ela configurada por meio de restries impostas direta- de dados.
mente no banco de dados, tais como criao de chaves primrias, A vantagem da utilizao de uma transao a no necessidade
integridade referencial, entre outros. Assegurando que as tran- de efetuar operaes adicionais para desfazer manipulaes de
saes no quebraro as regras de negcio definidas no banco de dados de operaes anteriores, uma vez que a instruo rollback
dados; tem esta responsabilidade.
Isolada: Significa que uma transao precisa ter permisso de
ser executada sem a interferncia de outros processos ou transa-
Listagem 1. Exemplo de especificao tcnica para uma transferncia bancria
es. Em outras palavras, os dados que uma transao acessa no sem transao.
podem sofrer interferncia de qualquer outra parte do sistema at
a transao ou unidade de trabalho ser completada; Mtodo de transferencia( conta origem, conta destino, valor ){
Instruo para alterar o saldo na conta origem, subtraindo o valor a ser transferido
Durvel: Significa que todas as alteraes realizadas nos da- Instruo para alterar o saldo na conta destino, somando o valor transferido
dos durante o perodo de uma transao devem ser gravadas }
em algum tipo de armazenamento fsico antes da transao ser
Listagem 2. Exemplo de especificao para uma transferncia bancria com
completada com sucesso. tratamento de erros, sem transao.

Mtodo de transferencia( conta origem, conta destino, valor ){


Para compreendermos o uso e a importncia de uma transao, Instruo para alterar o saldo na conta origem, subtraindo o valor a ser transferido
imagine uma transferncia bancria, onde um determinado SE ocorreu problemas na instruo acima ENTO
valor deve ser subtrado da conta de origem e somado na conta sair do mtodo
FIM-DO-SE
de destino. Instruo para alterar o saldo na conta destino, somando o valor transferido
Na Listagem 1, segue o exemplo de uma especificao para um SE ocorreu problemas na instruo acima ENTO
mtodo que atenda a esta operao. Porm, as instrues no Instruo para alterar o saldo na conta origem, somando o valor a ser transferido
FIM-DO-SE
possuem tratamento de erros. Estes erros podem ser vrios (por }
exemplo, indisponibilidade da rede, o que impossibilita a comu-
Listagem 3. Exemplo de especificao para uma transferncia bancria envolvido
nicao entre a aplicao e o banco de dados). Caso a instruo de
por uma transao.
subtrao seja efetuada com sucesso e ocorra problema com a de
soma, a operao de transferncia, mesmo assim, ser completada. Procedimento de transferencia( conta origem, conta destino, valor ){
Isto , apenas parte da operao foi realizada. begin
Instruo para alterar o valor, subtraindo ele na conta origem
A Listagem 2 demonstra o mesmo exemplo da Listagem 1, po-
SE ocorreu problemas na instruo acima ENTO
rm adicionando o tratamento de errospara as situaes: 1) Em rollback
caso de problema na instruo de subtrao, a instruo de soma sair do mtodo
no deve ocorrer; 2) Em caso de problema na instruo de soma, FIM-DO-SE
Instruo para alterar o valor, somando ele na conta destino
a instruo de subtrao deve ser desfeita.
SE ocorreu problemas na instruo acima ENTO
Ao analisar a Listagem 2, podemos verificar que foi includa rollback
uma terceira instruo, para desfazer a operao que a primeira sair do mtodo
instruo fez em caso de problemas com a segunda. No entanto, FIM-DO-SE
a terceira no possui tratamento de erros e, ao trat-la, seria commit
}
necessrio mais uma operao, que tambm necessitaria de um

Edio 101 Java Magazine 45


Primeiros passos com o Spring LDAP

Transaes em Java EE comEJB, JTA e JTS Neste modo, o Java EE responsvel por efetuar o begin e commit
O Java EE possui uma API de alto nvel para simplificar e ao ou o rollback da transao. E os momentos de ele fazer estas deci-
mesmo tempo maximizar o controle das transaes denominada ses so nas chamadas e nos retornos dos mtodos do EJB.
JTA (Java Transaction API). Ela prov mecanismos ao desenvolvedor A Figura 2 exibe um cliente chamando um mtodo de um EJB.
para a manipulao de transaes. Esta chamada auditada pelo Java EEque decide se efetua o be-
gin ou no de uma transao e repassa o controle para o mtodo
- Java EE (ou Java Enterprise Edition) uma especificao de um conjunto de chamado. No retorno do mtodo, caso exista uma transao, o
recursos (EJB, Servlet, JTA, RMI, Web Services, JNDI, entre outros) para auxlio e Java EE audita novamente, decide se efetua o commit ou rollback
suporte ao desenvolvimento de sistemas corporativos. Esta especificao seguida da mesma e repassa o controle para o cliente.
tanto pelos fabricantes de servidores de aplicao (Oracle GlassFish, RedHat JBoss,
IBM WebSphere, por exemplo) quanto pelos desenvolvedores que utilizam estes
recursos em sistemas do dia-a-dia.

A JTA o mecanismo de comunicao entre o EJB e o servio de


gerenciamento de transaes, o JTS (Java Transaction Service). Ou
seja, JTS a implementao do JTA. E ambos esto contidos no
conjunto de funcionalidades disponibilizadas por Java EE.
A Figura 1 ilustra o comportamento de uma transao iniciada
por um EJB, sendo ele o cliente do JTA, utilizando suas interfaces de
gerenciamento e manipulao. Em seguida, as camadas de trabalho
da JTA e JTS, envolvidos como funcionalidades sob o domnio do
Java EE, e a comunicao da transao com o banco de dados.

Figura 2. Java EE em ao quando um mtodo do EJB chamado

A deciso para o Java EE efetuar o begin ou no da transao


configurada pelos atributos de transao. Ou seja, so com estes
atributos previamente configurados nos mtodos da classe do EJB
que o Java EE faz esta deciso.
Para configurar um mtodo da classe do EJB com atributos
de transao, basta anot-lo com @TransactionAttribute, junto com
Figura 1. O comportamento transacional no Java EE uma das opes do enumerador TransactionAttributeType, que so:
MANDATORY, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED e
A JTA possui dois modos de se trabalhar comtransaes, que NEVER.
so: CMT (Container Managed Transaction Transao Gerenciada NOT_SUPPORTED: Um mtodo com esta configuraono suporta
pelo Container) e BMT (Bean Managed Transaction Transao uma transao. Se o cliente possuir uma transao, ela sus-
Gerenciada pelo Bean). O modo CMT configurado inteiramente pensa at o mtodo do EJB chamado completar sua execuo.
de forma declarativa por anotaes ou via XML, e o modo BMT Com isso, a transao no propagada para o mtodo do EJB
configurado programaticamente, ou seja, por instrues no chamado ou para qualquer outro EJB que ele possa chamar.
corpo dos mtodos. Aps a concluso do mtodo, a transao suspensa retoma sua
O gerenciamento da transao configurado com a anotao execuo (Figura 3);
@TransactionManagement no nvel da classe,junto com uma das
opes do enumerador TransactionManagementType, que pode ser
BEAN ou CONTAINER.

O modo CMT
Este o modo padro(default) do EJB. Isto , quando um EJB no
possuir a anotao @TransactionManagement, significa que ele est
configurado no modo CMT. Para explicitar esta configurao,
basta anotar a classe do EJB com @TransactionManagement(Transaction
ManagementType.CONTAINER). Figura 3. Atributo NOT_SUPPORTED

46 Java Magazine Edio 101


SUPPORTS: Um mtodo com esta configurao pode suportar uma
transao (Figura 4, situao A) ou no (Figura 4, situao B). Est
configurao dificilmente usada. Quando o cliente possui uma
transao, a mesma propagada para o EJB chamado.

Figura 6. Atributo REQUIRES_NEW

MANDATORY: A existncia prvia de uma transao do cliente ao


chamar o mtodo do EJB obrigatria (Figura 7, situao A),
Figura 4. Atributo SUPPORTS caso contrrio, a exceo javax.ejb.EJBTransactionRequiredException ser
lanada pelo Java EE ao cliente (Figura 7, situao B).
REQUIRED: Com esta configurao a existncia de uma transao
garantida. Se o cliente possuir uma transao, a mesma pro-
pagada para o EJB chamado (Figura 5, situao A), do contrrio,
o Java EE cria uma nova transao para este EJB (Figura 5,
situao B).

Figura 7. Atributo MANDATORY

NEVER: Ao chamar um mtodo do EJB com esta configurao, o


cliente no deve possuir uma transao (Figura 8, situao A),
caso contrrio, uma exceo javax.ejb.EJBException ser lanada pelo
Java EE ao cliente (Figura 8, situao B).

Figura 5. Atributo REQUIRED

- O tipo REQUIRED a configurao padro (default), e tambm a normalmente


utilizada. este o comportamento do Java EE quando no h configurao de
atributos de transao no EJB.

REQUIRES_NEW: Uma novatransao sempre ser criada quando o


mtodo do EJB for chamado (Figura 6, situao B). Caso o cliente
j possua uma transao, a mesma suspensa temporariamente
at o termino da execuo do mtodo do EJB chamado (Figura 6,
situao A). Figura 8. Atributo NEVER

Edio 101 Java Magazine 47


Primeiros passos com o Spring LDAP

A deciso para o Java EE efetuar o rollback de uma transao De posse do UserTransaction, basta utilizar o mtodo begin() para
configurada por meio das excees. Em outras palavras, com o dar incio transao, seguido das operaes de manipulao
lanamento de uma exceo por um mtodo da classe do EJB que de dados envolvidas pela proteo do bloco try, adicionado o uso
o Java EE decide se efetua orollback da transao. do mtodo rollback() no bloco catch, e finalmente o uso do mtodo
Por outro lado, a deciso para o Java EE efetuar o commit sina- commit() para terminar a transao com sucesso, conforme o trecho
lizada a partir da ausncia de excees no retorno do mtodo da de cdigo:
classe do EJB. Deste modo, caso o mtodo executado no lance
excees, o Java EE efetua o commit da transao. ut.begin();
try{
//operaes para manipulao de dados
Excees }catch(Exception e){
ut.rollback();
As excees exercem um grande impacto sobre o resultado das
throw e;
transaes, com relao ao procedimento de rollback pelo Java EE. }
Elas podem ser classificadas em dois grupos, sendoexcees de ut.commit();
sistema e excees de aplicativo.
Excees de sistema: So subclasses de java.lang.RuntimeException, Estudo de caso
mais a mesma, e no so excees checadas. Caso exista uma Para por em prtica o contedo apresentado, ser explorado o
transao e uma delas for lanada por um mtodo de uma classe gerenciamento de transaesnos modos CMT e BMT de um sim-
EJB, o Java EE ir efetuar o rollback da transao; ples mtodo de transferncia bancria. Esse mtodo est omisso
de padres e boas prticas, para que seja mantida a simplicidade
- As excees checadas obrigam o compilador a cobrar o tratamento delas via e o foco no entendimento do conceito.
blocos try/catch ou aclusula throws. As tecnologias utilizadas para suportar este exemplo foram:
JBoss AS 6 por ser um servidor de aplicao compatvel com
Excees de aplicativo: So subclasses de java.lang.Exception, Java EE;
mais a mesma, e so checadas. Caso exista uma transao e uma JPA para abstrao das entidades;
delas for lanada por um mtodo de uma classe EJB, o Java EE Hibernate como provedor JPA nativo do JBoss AS 6;
no ir efetuar o rollbackpelo motivo de que esta exceo pode HSQLDB que o banco de dados nativo do JBoss AS 6;
ser prevista por alguma regra de negcio/aplicativo, e pode ser IDE Eclipse Indigo.
tratada para normalizar a situao, sem que exista a necessidade
do rollback. Entretanto, este comportamento pode ser manipula- Entretanto, estas tecnologias podem ser substitudas, caso o
do com a anotao @ApplicationException(rollback=true) na classe de leitor deseje e conhea alguma similar, pois o foco do exemplo
exceo. Com isso, caso ela seja lanada, o Java EE ir efetuar o estar sobre o EJB.
rollback da transao. Como ponto de partida, criada uma exceo checada personali-
zada e configurada com a anotao @ApplicationException(rollback=true),
O modo BMT conforme a Listagem 4. Com isso, indicando ao Java EE a execuodo
Este o modo que permite ao desenvolvedor controlar transaes procedimento de rollback em caso de seu lanamento quando existir
de forma programtica, ou seja, por instrues de programao no uma transao, e quando o modo de gerenciamento da transao
corpo do mtodo da classe do EJB. Para trabalhar com esta confi- for CMT.
gurao, deve-se anotar a classe do EJB com @TransactionManagement Em seguida, temos a Listagem 5, uma classe Java simples que
( TransactionManagementType.BEAN). representa a entidade da conta corrente, com as anotaes @Entity
Ao configurar o EJB para o modo BMT, o Java EE disponibiliza e @Id do JPA.
o objeto javax.transaction.UserTransaction para o controle da transao. A Listagem 6 o ncleo do exemplo. A classe do EJB est confi-
Este objeto possui os mtodos begin(), commit() e rollback(). Para ter gurada para o modo CMT, e os mtodos que fazem a manipulao
acesso a ele, basta criar um atributo na classe do EJB e utilizar a de dados como REQUIRED. O mtodo mais importante deste EJB
anotao @Resource para o Java EE prov-lo. o efetuarTransferencia(), visto que ele possui duas operaes de
O trecho de cdigo a seguirmostra a configurao da classe do manipulao de dados que esto protegidas por uma transao.
EJB para o modo BMT e o atributo UserTransaction com a anotao Complementando o EJB, sua interface de negcio criada na
@Resource: Listagem 7.
A classe de testes simples, conforme exibe a Listagem 8, possui as
@TransactionManagement(TransactionManagementType.BEAN) seguintes operaes: criao de duas contas correntes, conferncia
public class MeuBean implements MeuBeanRemote{
@Resource da persistncia das contas, transferncia de valores entre as duas
UserTransaction ut; contas com sucesso (commit), criao de uma conta corrente falsa
/* mtodos omitidos */
(com id nulo), transferncia de valores entre conta1 e contaFalsa com
}
problema(rollback) e, finalmente, conferncia do saldo da conta1.

48 Java Magazine Edio 101


Listagem 4. MinhaException.java: Utilizao da anotao para indicar procedimento Listagem 7. MeuBeanRemote.java: A interface remota de negcio do EJB.
de rollback.
package br.com.jm.transacao.bean;
package br.com.jm.transacao.excecao; import javax.ejb.Remote;
import javax.ejb.ApplicationException; import br.com.jm.transacao.entidade.ContaCorrente;
@ApplicationException(rollback=true) import br.com.jm.transacao.excecao.MinhaException;
public class MinhaException extends Exception { @Remote
public MinhaException(String mensagem){
public interface MeuBeanRemote {
super(mensagem);
public ContaCorrente selecionarContaCorrente(Integer id);
}
public void incluirContaCorrente(ContaCorrente contaCorrente)
}
throws MinhaException, Exception;
Listagem 5. ContaCorrente.java: Entidade. public void efetuarTransferencia(ContaCorrente contaOrigem,
ContaCorrente contaDestino, Integer valor) throws MinhaException, Exception;
package br.com.jm.transacao.entidade; }
import java.io.Serializable;
import javax.persistence.Entity; Listagem 8. Teste.java: Classe de teste simples.
import javax.persistence.Id;
@Entity package br.com.jm.transacao.teste;
public class ContaCorrente implements Serializable{
@Id import javax.naming.*;
private Integer id; import br.com.jm.transacao.bean.MeuBeanRemote;
private Integer saldo; import br.com.jm.transacao.entidade.ContaCorrente;
import br.com.jm.transacao.excecao.MinhaException;
public ContaCorrente(){}
public class Teste {
public ContaCorrente(Integer id, Integer saldo){
this.id = id; public static void main(String[] args) throws Exception{
this.saldo = saldo;
}
Context ctx = new InitialContext();
MeuBeanRemote meuBean =
/* mtodos getters e setters omitidos */
(MeuBeanRemote) ctx.lookup(MeuBean/remote);
}
//Criacao das contas
Listagem 6. MeuBean.java: O EJB configurado como CMT. ContaCorrente conta1 = new ContaCorrente(1, 10);
ContaCorrente conta2 = new ContaCorrente(2, 10);
package br.com.jm.transacao.bean;
import javax.ejb.*; meuBean.incluirContaCorrente(conta1);
import javax.persistence.*; meuBean.incluirContaCorrente(conta2);
import br.com.jm.transacao.entidade.ContaCorrente;
import br.com.jm.transacao.excecao.MinhaException; //Conferncia de valores persistidos ANTES da transferncia
@Stateless conta1 = meuBean.selecionarContaCorrente(1);
@TransactionManagement(TransactionManagementType.CONTAINER) System.out.println(saldo antes da transf. conta1.: + conta1.getSaldo());
public class MeuBean implements MeuBeanRemote{
@PersistenceContext conta2 = meuBean.selecionarContaCorrente(2);
private EntityManager em; System.out.println(saldo antes da transf. conta2.: + conta2.getSaldo());
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void efetuarTransferencia(ContaCorrente contaOrigem, //TRANSFERENCIA do valor de 5 reais, da conta1 para a conta2
ContaCorrente contaDestino, Integer valor) throws MinhaException, Exception{ meuBean.efetuarTransferencia(conta1, conta2, 5);
try{
contaOrigem.setSaldo(contaOrigem.getSaldo() - valor); //Conferncia de valores persistidos DEPOIS da transferncia
em.merge(contaOrigem); conta1 = meuBean.selecionarContaCorrente(1);
contaDestino.setSaldo(contaDestino.getSaldo() + valor); System.out.println(saldo depois da transf. conta1.: + conta1.getSaldo());
em.merge(contaDestino); conta2 = meuBean.selecionarContaCorrente(2);
}catch(Exception e){ System.out.println(saldo depois da transf. conta2.: + conta2.getSaldo());
throw new MinhaException(e.getMessage()); //forar erro na transferncia para a conta destino.
} ContaCorrente contaFalsa = new ContaCorrente(null, 0);
} try{
@TransactionAttribute(TransactionAttributeType.REQUIRED) meuBean.efetuarTransferencia(conta1, contaFalsa, 5);
public void incluirContaCorrente(ContaCorrente contaCorrente) }catch(MinhaException e){
throws Exception{ System.out.println(Erro.: + e.getMessage());
em.merge(contaCorrente); }
} //Conferncia de valores persistidos DEPOIS do rollback
public ContaCorrente selecionarContaCorrente(Integer id){ conta1 = meuBean.selecionarContaCorrente(1);
return em.find(ContaCorrente.class, id); System.out.println(saldo depois do rollback. conta1.: + conta1.getSaldo());
}
} }
}

Edio 101 Java Magazine 49


Primeiros passos com o Spring LDAP

Para utilizao do JPA necessria a criao do seu XML des- transferncia, com a contaFalsa, foi lanada a exceo customizada
critor de configuraes, como exibido na Listagem 9. Este possui e o Java EE efetuou o rollback da transao, protegendo assim o
uma unidade de persistncia apontada para o Data Source java:/ saldo da conta1. A Listagem 11 demonstra o log da execuo da
DefaultDS do HSQLDB, que o banco de dados nativo do JBoss. classe de testes na sada do console.
Alm disso, um arquivo com as propriedades de acesso ao JNDI Para finalizar, a Listagem 12 exibe o mesmo EJB da Listagem 6,
do JBoss, apresentado na Listagem 10, requerido pela instruo no entanto, configurado para o modo BMT. Como era de se esperar,
Context ctx = new InitialContext() da Listagem 6. Nele est configurado ao executar o teste com este EJB, o comportamento da transao e o
qual o endereo de acesso ao JNDI e quais so as interfaces de resultado so os mesmos da execuo com o EJB em modo CMT.
acesso especficas do JBoss.
Listagem 11. Sada do console aps a execuo do teste.
Listagem 9. persistence.xml: Descritor para a configurao da unidade de persis-
tncia do JPA. saldo antes da transf. conta1.: 10
saldo antes da transf. conta2.: 10
<?xml version=1.0 encoding=UTF-8?> saldo depois da transf. conta1.: 5
<persistence version=2.0 saldo depois da transf. conta2.: 15
Erro.: org.hibernate.id.IdentifierGenerationException: ids for this class must
xmlns=http://java.sun.com/xml/ns/persistence
be manually assigned before calling save():
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
br.com.jm.transacao.entidade.ContaCorrente
xsi:schemaLocation=http://java.sun.com/xml/ns/persistence
saldo depois do rollback. conta1.: 5
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd>
<persistence-unit name=minhaPersistenceUnit>
Listagem 12. MeuBean.java: EJB reconfigurado para BMT.
<jta-data-source>java:/DefaultDS</jta-data-source>
<properties> package br.com.jm.transacao.bean;
<property name=hibernate.dialect value=org.hibernate.dialect.HSQLDialect /> import javax.annotation.Resource;
<property name=hibernate.hbm2ddl.auto value=create-drop/> import javax.ejb.*;
</properties> import javax.persistence.*;
</persistence-unit> import javax.transaction.UserTransaction;
</persistence> import br.com.jm.transacao.entidade.ContaCorrente;
import br.com.jm.transacao.excecao.MinhaException;
Listagem 10. jndi.properties: Configura o acesso ao JNDI do JBoss utilizado pelo
Teste.java. @Stateless
@TransactionManagement(TransactionManagementType.BEAN)
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory public class MeuBean implements MeuBeanRemote{
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost @PersistenceContext
private EntityManager em;

@Resource
Na montagem do ambiente de trabalho, a disposio das classes
private UserTransaction ut;
e interfaces criadas, arquivos XML e propriedades, com configu-
raes necessrias, deve estar similar Figura 9. Neste momen- public void efetuarTransferencia(ContaCorrente contaOrigem,
ContaCorrente contaDestino, Integer valor) throws MinhaException,
totambm importante destacar o arquivo jndi.properties. Este Exception{
deve estar localizado na raiz do projeto, ou seja, fora dos pacotes ut.begin();
e do diretrio META-INF. try{
contaOrigem.setSaldo(contaOrigem.getSaldo() - valor);
em.merge(contaOrigem);

contaDestino.setSaldo(contaDestino.getSaldo() + valor);
em.merge(contaDestino);
}catch(Exception e){
ut.rollback();
throw new MinhaException(e.getMessage());
}
ut.commit();
}

public void incluirContaCorrente(ContaCorrente contaCorrente)


throws Exception{
ut.begin();
em.merge(contaCorrente);
ut.commit();
Figura 9. Disposio das classes, XML e arquivo de propriedades }

public ContaCorrente selecionarContaCorrente(Integer id){


Aps a execuo do teste com o EJB configurado no modo return em.find(ContaCorrente.class, id);
CMT, a primeira transferncia de valores ocorreu com sucesso }
e o Java EE efetuou o commit da transao. Porm, na segunda }

50 Java Magazine Edio 101


Concluso as anotaes podem ser adicionadas e manipuladas sem alterar a
Neste artigo vimos uma introduo ao conceito de transao, a regra de negcios, o que possibilita ao projetista do sistema elabo-
forma como a JTA embutida no Java EE efetua o gerenciamento rar classes e mtodos de EJB mais adequados a este modo;
dela, as possibilidades de uso do EJB em conjunto com os modos O BMT de mais baixo nvel por ser programvel e mais
de gerenciamento CMT e BMT, e a influncia das excees. flexvel, permitindo ao desenvolvedor controlar transaesdi-
Como os modos de gerenciamento de transao CMT e BMT retamente pelas instrues begin, commit e rollback via interface
so maneiras diferentes de se trabalhar, vale explicitar algumas UserTransaction.
consideraes:
O CMT de mais alto nvel por ser configurvel, e tende a difcil apontar qual o melhor modo entre CMT e BMT. Entre-
ser mais intuitivo, uma vez que o comportamento padro tanto, esperamos que este artigo o auxilie na deciso de qual deles
(TransactionManagementType.CONTAINEReTransactionAttributeType.REQUIRED), o mais adequado para a necessidade do seu sistema, quando for
sendo necessria uma ateno para as excees. Caso necessrio, necessrio controlar transaes com Java EE.

Eduardo Correia da Silva D seu feedback sobre esta edio! Feedback


eu
eduardoc222@gmail.com

s
A Java Magazine tem que ser feita ao

D
engenheiro de software na Ebiz, graduado em cincias da com- seu gosto. Para isso, precisamos saber

sobre e
putao e ps-graduado em projetos orientados a objetos. Possui o que voc, leitor, acha da revista!

s
ta
as certificaes OCJP, OCWCD, OCBCD e CSM. edio

D seu voto sobre este artigo, atravs do link:


www.devmedia.com.br/javamagazine/feedback

Edio 101 Java Magazine 51


Seo Boas Prticas: Nesta seo voc encontra artigos sobre as tecnologias que podero aumentar

Aplicaes Java EE lightw


Reavaliando o uso de boas prticas e pad

Resumo DevMan
De que se trata o artigo:
Neste artigo veremos como construir aplicaes Java EE leves e enxutas, utilizando Padres J2EE revi-
sitados para a nova verso da plataforma. Para isso, mostraremos trs alternativas de implementao de
casos de uso do tipo CRUD utilizando os Padres Java EE.

Em que situao o tema til:


A criao de aplicaes corporativas leves e enxutas, que utilizam padres de projetos na medida certa,
no s escalam melhor quando necessrio, como so mais fceis de realizar manutenes e evolues no
decorrer do seu ciclo de vida.

Aplicaes Java EE "lightweight":


A plataforma corporativa Java evoluiu de tal maneira nos ltimos tempos que, muitos dos padres de
projetos J2EE amplamente empregados nas suas antigas verses, no so mais necessrios na atual verso,
Java EE 6. Isso se deve ao fato de que muitos dos problemas solucionados por estes padres deixaram de
existir. Um exemplo desta maior abstrao provida pela plataforma Java EE a possibilidade de criarmos
uma CRUD genrica utilizando apenas o padro Service Facade, sendo que, nas verses anteriores da
plataforma, seria necessrio utilizarmos um Session Facade e um ou mais Business Objects, como o DAO.

C
omo era de se esperar, a cada nova Neste contexto, neste artigo veremos
verso da plataforma corporativa formas distintas para simplificar a imple-
do Java, a construo de aplicaes mentao de casos de uso do tipo CRUD,
fica mais simples e intuitiva. A sua ltima rotineiros em aplicaes corporativas Java
verso, Java EE 6, est mais coesa e resolveu EE, utilizando padres J2EE repaginados
muitos dos problemas de infraestrutura para a nova plataforma Java EE. Para isso,
presentes na plataforma J2EE, permitindo mostraremos diferentes estratgias de im-
ao desenvolvedor focar ainda mais nos plementao dos padres Service Facade
problemas de negcio e no se preocupar e Data Access Object, tendo como base
muito com problemas de infraestrutura da os padres apresentados no livro Real
plataforma, como por exemplo, a integrao World Java EE Patterns Rethinking Best
entre as camadas do sistema. Desta forma, Practices, do autor Adam Bien.
muitos dos padres J2EE amplamente uti-
lizados anteriormente caram em desuso, e Padres Java EE
em alguns casos, tornaram-se anti-padres. Os padres J2EE foram catalogados
Isto porque simplesmente no so mais em meados de 2001 no livro Core J2EE
necessrios na nova plataforma Java EE. Patterns Best Practices and Design
Exemplos disso so o Service Locator e o Strategies e atualizados em 2003 com a
Business Delegate, anteriormente utiliza- segunda edio deste mesmo livro. Este
dos para abstrair complexidades de integra- catlogo totaliza 21 padres, divididos em
o e reduzir o acoplamento de camadas, trs camadas, mostrados na Tabela 1. Desde
no so mais necessrios com a utilizao ento, nenhuma atualizao foi apresenta-
de EJB 3 e CDI. da oficialmente comunidade Java. Desta

52 Java Magazine Edio 101


a qualidade do desenvolvimento de software

Simplifique suas aplicaes

eight
utilizando os recursos da
plataforma Java EE 6 e
aplicando boas prticas e
padres Java EE

res Java EE
Oscar Costa

forma, sem novas atualizaes, muitos destes padres se tornaram Soluo: apresenta a implementao base do padro, bem como
obsoletos medida que a plataforma era evoluda. possveis estratgias de implementao do mesmo;
Um fator que tornava as aplicaes J2EE complexas de serem Testes: tpico onde mostrado como realizar testes na imple-
implementadas e mantidas, era a necessidade da incluso de mentao;
diversos padres de projetos para resolver problemas de infraes- Documentao: mostra como documentar o padro com dia-
trutura da plataforma. Estes problemas ocorriam logo no incio da gramas e comentrios no cdigo;
construo da aplicao, onde j era exigida a implementao de Consequncia: tpico onde so listados os pontos positivos e
alguns padres, como Business Delegate, Service Locator, Session negativos na utilizao do padro;
Facade e Transfer Object. Padres relacionados: apresenta padres similares ou direta-
mente ligados ao padro explicado.
Camada de apresentao Camada de negcio Camada de integrao
Intercepting Filter Business Delegate * Data Access Object (DAO) Como podem ser observados na Tabela 2, alguns padres tm
Context Object Service Locator * Service Activator
mais de uma denominao. Os nomes destacados entre parnteses
so os nomes antigos, utilizados na plataforma J2EE, como o caso
Front Controller Session Facade Domain Store *
do padro Application Service, que agora chamado de Service
Application Controller Application Service Web Service Broker
Facade. E os padres com nomes separados por barra (/), so
View Helper Business Object padres de certa forma diferentes, porm com comportamento e
Composite View Composite Entity * aplicao muito semelhante, por exemplo: os padres Paginador e
Dispatcher View Transfer Object Fast Lane Reader. Alm disso, algumas estratgias de programa-
Service To Worker TO Assembler * o, como a integrao e migrao de EJB 2 e POJO legado para a
nova plataforma, tambm so descritas pelo autor.
Value List Handler *

Tabela 1. Padres do catlogo "Core J2EE Patterns" Repensando a camada Repensando a camada
Padres de infraestrutura
de negcios de integrao
No livro Real World Java EE Patterns Rethinking Best Prac- Service Facade
Data Access Object Service Starter
tices, o autor questiona a aplicao dos padres de projeto e das (Application Service)
Service Transfer Object / Data
boas prticas da plataforma J2EE em aplicaes concebidas nas Singleton
(Session Facade) Transfer Object
novas plataformas Java EE, mostrando como padres amplamente
Persistent Domain EJB 2 Integration and
utilizados no passado caram por terra. Estes padres esto mar- Bean locator
Object (Business Object) Migration
cados com um asterisco * na Tabela 1. Enquanto outros padres Legacy POJO Inte-
tiveram suas implementaes simplificadas, ou permitiram a Gateway Thread tracker
gration
adoo de diferentes estratgias de implementao para atender Dependency injection
Fluid Logic Generic JCA
a novos problemas. extender
Mas o foco do livro no explicar porque muitos dos padres Asynchronous
Paginator /
J2EE se tornaram inteis. Isso apenas uma consequncia da evo- Resource Integrator Payload extractor
Fast Lane Reader
luo da plataforma, que tambm relatada. O objetivo principal (Service Activator)
Resource Binder
do livro apresentar os padres e boas prticas J2EE ainda teis
Context Holder
na plataforma Java EE. Estes padres so separados por camada,
onde so melhores empregados (veja a Tabela 2), e destrinchados Tabela 2. Padres Java EE
pelos seguintes tpicos:
Problema: so relatados os problemas que o padro resolvia Simplificando um caso de uso CRUD
anteriormente e os motivos pelos quais ele continua a ser utilizado Casos de uso do tipo CRUD, ou suas funcionalidades (criar, ler,
na plataforma Java EE; atualizar e excluir), so habitualmente encontrados em aplicaes
Motivao: lista as motivaes para utilizao do padro; corporativas. E, devido arquitetura multicamadas de muitas

Edio 101 Java Magazine 53


Aplicaes Java EE lightweight

destas aplicaes, as funcionalidades das CRUDs so geralmente uma implementao purista de casos de uso do tipo CRUD.
fragmentadas e muitas vezes replicadas para tratar diferentes A utilizao do padro Service Facade visa melhorar a manute-
casos de uso. Entretanto, o emprego desta complexidade para nibilidade, simplificando a utilizao dos servios e a construo
casos de uso e funcionalidades simples como estas, no neces- de testes, alm de j manter a consistncia dos dados atravs de
srio com o nvel de abstrao e com as facilidades presentes na transaes providas pela JPA 2.
plataforma Java EE. Pensando em reuso, possvel que um nico CRUD Facade seja
Em aplicaes J2EE, a implementao de casos de uso do tipo utilizado por todos os CRUDs e outros casos de uso da aplicao.
CRUD utilizava duas ou trs camadas, como mostrado na Figura 1. Desde que, para isso, os recursos disponveis nas especificaes
Neste caso, um Session Facade delegava todas as suas chamadas Java SE e EE sejam utilizados de forma coerente. No exemplo
diretamente a um DAO, sendo que, muitas vezes esta ligao era de CRUD Facade apresentado na Listagem 1, foram utilizados
intermediada por outro Business Object. J na plataforma Java EE, Generic Methods para os mtodos bsicos de criao, busca dire-
esta implementao complexa pode ser substituda por apenas um ta, atualizao e excluso, e para os mtodos de pesquisa com
Stateless SessionBean, conforme mostrado na Figura 2. parmetros e paginao, foram utilizadas Named Queries, que
devem ser definidas nos metadados das entidades JPA. A interface
CrudService foi suprimida aqui, pois somente define os mtodos
anotados com @Override.

- Generic Methods foram introduzidos no Java SE 5.0 e so timas opes para reutilizar
mtodos recorrentes. Como por exemplo, os quatro mtodos bsicos da CRUD (criar,
ler, atualizar e excluir), evitando assim a duplicao desnecessria de cdigo.

- Named Queries so consultas estticas escritas nos metadados das entidades


JPA, que podem ser definidas utilizando JPQL (Java Persistence Query Language)
ou SQL. E por serem estticas, tm a vantagem de poderem ser validadas pelo
container na inicializao da aplicao.

- Como a criao de interfaces para Session Beans no EJB 3.1 no obrigatria, o


CRUD Facade pode ser mais simplificado caso a arquitetura da aplicao necessite,
abnegando-se das interfaces local e/ou remota.

Alternativas para o caso de uso CRUD


Caso seja necessria a especializao do CRUD Facade para
atender outras funcionalidades de negcio da aplicao, este pode
Figura 1. CRUD na plataforma J2EE ser utilizado como Generic DAO (veja a Figura 3) ou Abstract DAO
(veja a Figura 4). Estas so estratgias de implementao do padro
DAO que visam simplificao do acesso a dados, desacoplando
a aplicao da fonte de dados, e tambm primam pela reutilizao
de cdigo. A principal diferena entre as duas estratgias a for-
ma de utilizao: herana no caso do Abstract DAO e injeo de
dependncia para o Generic DAO. Outra diferena significativa
a possibilidade de utilizar mais de uma fonte de dados no Abstract
DAO, pois o EntityManager no est injetado na classe abstrata.
Figura 2. CRUD na plataforma Java EE O Generic DAO consiste em uma nica classe responsvel por
encapsular o acesso a dados, que consegue gerenciar qualquer
Esta simplificao do CRUD na plataforma Java EE denomi- entidade JPA da aplicao. Esta estratgia bem adequada para ser
nada por Adam Bien, em seu livro, de CRUD Facade. Ela consiste utilizada em operaes de CRUDs, pois todas as funcionalidades
em uma estratgia de implementao do padro Service Facade, bsicas so cobertas pelo padro.
exposto na fronteira entre a camada de negcio e a camada de Para aplicaes onde a maior parte da lgica de negcios consiste
apresentao, como um Session Facade. E com todas as fun- em acessar a base de dados, a estratgia Abstract DAO apresenta
cionalidades de um DAO, injetadas atravs do EntityManager. uma abordagem bem pragmtica, com os mtodos de acesso a
Desta maneira, utilizando o padro Service Facade, um nico dados disponveis, sem a necessidade de injetar outro compo-
Stateless SessionBean absorveu o papel de no mnimo duas nente, mesmo quando h a necessidade de utilizarmos mais de
camadas, Session Facade e DAO, anteriormente utilizadas em uma fonte de dados.

54 Java Magazine Edio 101


Listagem 1. Cdigo de CRUD Facade.

import java.util.*; @Override


import javax.ejb.*; public List findWithNamedQueryPaginated(String namedQueryName,
import javax.persistence.*; int firstResult, int resultLimit) {
@Stateless return findWithNamedQueryPaginated(namedQueryName,
@Local(CrudService.class) new HashMap<String, Object>(),
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) firstResult, resultLimit);
}
public class CrudServiceBean implements CrudService { @Override
@PersistenceContext public List findWithNamedQueryPaginated(String namedQueryName,
private EntityManager em; Map<String, Object> parameters,
@Override int firstResult, int resultLimit) {
public <T> T create(T t) { Query query = em.createNamedQuery(namedQueryName);
em.persist(t); if (firstResult > 0) {
em.flush(); query.setFirstResult(firstResult);
em.refresh(t); }
return t; if(resultLimit > 0) {
} query.setMaxResults(resultLimit);
@Override }
public <T> T update(T t) { for (Map.Entry<String, Object> entry : parameters.entrySet()) {
return em.merge(t); query.setParameter(entry.getKey(), entry.getValue());
} }
@Override return query.getResultList();
public <T> void delete(Class<T> type, Object id) { }
Object ref = em.getReference(type, id); @Override
em.remove(ref ); public Integer countResultsOfNamedQuery(String namedQueryName) {
} return countResultsOfNamedQuery(namedQueryName,
@Override new HashMap<String, Object>());
public <T> T find(Class<T> type, Object id) { }
return em.find(type, id); @Override
} public Integer countResultsOfNamedQuery(String namedQueryName,
@Override Map<String, Object> parameters) {
public List findByNamedQuery(String namedQueryName) { Query query = this.em.createNamedQuery(namedQueryName);
return findWithNamedQueryPaginated(namedQueryName, 0, 0); for (Map.Entry<String, Object> entry : parameters.entrySet()) {
} query.setParameter(entry.getKey(), entry.getValue());
@Override }
public List findByNamedQuery(String namedQueryName, return query.getResultList().size();
Map<String, Object> parameters) { }
return findWithNamedQueryPaginated(namedQueryName, parameters, 0, 0); }
}

Um possvel questionamento de utilizar as estratgias Generic no mandatrias, so: mover o Generic DAO para um pacote supe-
DAO e Abstract DAO o fato de que elas violam o princpio de rior ou especfico, permitindo um acesso padronizado para todos
separao de interesses, que deu origem camada de persis- os seus clientes; e a criao de uma interface para desacoplar dos
tncia separada da camada de negcios, ou servios. Porm, na clientes os diferentes tipos de acesso aos dados, caso a arquitetura
plataforma Java EE 6, o EntityManager pode ser considerado uma da aplicao necessite.
implementao do padro DAO, no havendo mais a necessidade
de encapsular todo acesso a dados em uma camada distinta.

Figura 3. Utilizao da Estratgia Generic DAO para uma CRUD

Para refatorar um CRUD Facade para um Generic DAO, devemos


alterar o tipo de transao para MANDATORY (veja a Listagem 2)
e implementar os clientes do DAO com o tipo de transao RE-
QUIRES_NEW, j que estes passam a ter agora a funo de Service
Facade (veja a Listagem 3). Outras refatoraes desejveis, porm Figura 4. Utilizao da estratgia Abstract DAO para uma CRUD

Edio 101 Java Magazine 55


Aplicaes Java EE lightweight

J a refatorao do CRUD Facade para o Abstract DAO envolve Listagem 2. Cdigo de Generic DAO.
um pouco mais de mudanas estruturais neste componente,
import java.util.*;
visto que quem possui o EntityManager como atributo agora so as
import javax.ejb.*;
classes concretas que herdam de Abstract DAO. O SessionBean import javax.persistence.*;
passa a ser uma classe abstrata com a adio de um mtodo abs-
trato para recuperar o EntityManager dos clientes concretos (veja as @Stateless
Listagens 4 e 5). @Local(CrudService.class)
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public class CrudServiceBean implements CrudService {
- Os tipos de transaes da plataforma Java EE (MANDATORY, REQUIRED, REQUI-
RES_NEW, SUPPORTS, NOT_SUPPORTED e NEVER) definem como ser o comporta- @PersistenceContext
mento da transao. Por exemplo, caso um mtodo ou classe anotada com o tipo private EntityManager em;
de transao MANDATORY seja chamada por outro mtodo que j esteja dentro de
(...)
uma transao, a mesma transao utilizada. Porm, caso o mtodo chamador
no esteja dentro de uma transao, a exceo TransactionRequiredException ser }
lanada ao chamar o mtodo anotado com o tipo de transao MANDATORY.
Listagem 3. Cdigo do Cliente de Generic DAO.

Java EE e o padro ECB import java.util.*;


Em muitas aplicaes corporativas, construdas sobre a platafor- import javax.ejb.*;
import javax.persistence.*;
ma Java EE, cada componente separado claramente em fronteira,
controle e entidade, onde: a camada de fronteira so as Facades; @Stateless
na camada de controle so implementadas as lgicas do negcio, @TransactionAttribute(TransactionAttributeType.REQUIRED_NEW)
public class EmpresaServiceBean {
geralmente utilizando EJBs; e na camada de entidades esto con-
tidas as representaes do domnio da aplicao, implementadas (...)
com JPA. Desta forma cada componente uma implementao do
}
padro ECB, sigla do ingls Entity Control Boundary, apresentado
na Figura 5. Listagem 4. Cdigo de Abstract DAO.

import java.util.*;
import javax.ejb.*;
import javax.persistence.*;

@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public abstract class CrudServiceBean {

public abstract EntityManager getEntityManager();

Figura 5. Padro ECB (retirada do livro Real World Java EE - Night Hacks) (...)

}
Este padro tem como objetivo principal prover uma clara
Listagem 5. Cdigo do Servio Concreto de Abstract DAO.
separao entre a lgica de negcios e a lgica de apresentao,
reduzindo o acoplamento entre as camadas, e, como consequncia, import java.util.*;
facilitando a utilizao da aplicao por clientes de diferentes import javax.ejb.*;
import javax.persistence.*;
tecnologias, como por exemplo: JSF 2, GWT ou REST.
Alm de prover um fraco acoplamento entre as camadas de uma @Stateless
aplicao, o padro ECB no indivisvel. Casos de uso mais sim- @TransactionAttribute(TransactionAttributeType.REQUIRED_NEW)
public class EmpresaServiceBean extends CrudServiceBean {
ples, como CRUDs, podem ser implementados utilizando apenas
uma camada Boundary acessando vrias entidades, como foi @PersistenceContext
mostrado neste artigo. Isso se deve, principalmente, facilidade private EntityManager em;
e flexibilidade da plataforma Java EE 6, com as especificaes do
public EntityManager getEntityManager() {
JPA 2, EJB 3.1 e CDI. return em;
}
A camada de apresentao (...)
A utilizao de um SessionBean na plataforma Java EE 6 to
simples como injetar um EntityManager em um EJB. Para isto, basta }
utilizar a anotao @EJB, como mostrado na classe CrudController

56 Java Magazine Edio 101


(Listagem 6). Esta classe abstrata define o comportamento comum evita trafegar vrias informaes em um escopo de request, ou
para os controladores de CRUDs do sistema. Um exemplo de con- ficar controlando manualmente o tempo de vida dos objetos no
trolador concreto que herda o comportamento da classe controla- escopo de sesso. Ou em um caso mais complexo, evitamos a
dora abstrata a classe EmpresaController, exibida na Listagem 7. utilizao de um pesado Stateful SessionBean, para implementar
Como o ManagedBean EmpresaController tem o escopo de viso uma simples paginao ou ordenao de dados.
@ViewScoped, podemos utilizar a tag <ajax> (demonstrada na
Listagem 8) para realizar a paginao de dados na pesquisa, em - Com a especificao JSR-299 para CDI (Context and Dependency Injection), a
conjunto com uma classe abstrata utilitria PaginationHelper (mos- anotao @EJB pode ser substituda pela anotao @Inject, com a vantagem de
trada na Listagem 9). Esta implementao com escopo de viso poder utilizar herana nos componentes injetados.

Listagem 6. Cdigo do JSF Controlador Abstrato.

import com.openarch.webrh.entities.EntidadeBase; try {


import com.openarch.webrh.services.CrudService; entidade = crudService.create(entidade);
import java.io.Serializable; JsfUtil.addSuccessMessage(CrudEntityCreated,
import javax.ejb.EJB; entidade.getClass().getSimpleName());
import javax.faces.model.DataModel; } catch (Exception e) {
public abstract class CrudController<T extends EntidadeBase> JsfUtil.addErrorMessage(e, CrudEntityCreatedError,
implements Serializable { entidade.getClass().getSimpleName());
@EJB }
protected CrudService crudService; }
protected T entidade; public void update() {
protected DataModel items = null; try {
protected PaginationHelper pagination; entidade = crudService.update(entidade);
public T getEntidade() { JsfUtil.addSuccessMessage(CrudEntityUpdated,
return entidade; entidade.getClass().getSimpleName());
} } catch (Exception e) {
public abstract PaginationHelper getPagination(); JsfUtil.addErrorMessage(e, CrudEntityUpdatedError,
public void next() { entidade.getClass().getSimpleName());
getPagination().nextPage(); }
items = getPagination().createPageDataModel(); }
} public String delete() {
public void previous() { try {
getPagination().previousPage(); crudService.delete(entidade.getClass(), entidade.getId());
items = getPagination().createPageDataModel(); JsfUtil.addSuccessMessage(CrudEntityDeleted,
} entidade.getClass().getSimpleName());
public DataModel getItems() { } catch (Exception e) {
if (items == null) { JsfUtil.addErrorMessage(e, CrudEntityDeletedError,
items = getPagination().createPageDataModel(); entidade.getClass().getSimpleName());
} }
return items; return List;
} }
public void create() { }

Listagem 7. Cdigo do Controlador de Empresa.

import com.openarch.webrh.entities.Empresa; @Override


import com.openarch.webrh.entities.Contato; public PaginationHelper getPagination() {
import com.openarch.webrh.entities.Endereco; if (pagination == null) {
import java.util.List; pagination = new PaginationHelper(5) {
import javax.annotation.PostConstruct; @Override
import javax.faces.bean.*; public int getItemsCount() {
import javax.faces.model.*; return crudService.countResultsOfNamedQuery(Empresa.FIND_ALL);
@ManagedBean(name = empresaController) }
@ViewScoped
@Override
public class EmpresaController extends CrudController<Empresa> {
public DataModel createPageDataModel() {
@PostConstruct
public void init() { List lista = crudService.findWithNamedQueryPaginated(Empresa.FIND_ALL,
String id = JsfUtil.getRequestParameter(id); getPageFirstItem(), getPageSize());
if (AppUtil.isBlank(id)) { return new ListDataModel(lista);
entidade = new Empresa(); }
entidade.setContato(new Contato()); };
entidade.setEndereco(new Endereco()); }
} else { return pagination;
entidade = crudService.find(Empresa.class, Long.parseLong(id)); }
} public SelectItem[] getListaEmpresas() {
} List lista = crudService.findByNamedQuery(Empresa.FIND_ALL);
public Empresa getEmpresa() { return JsfUtil.getSelectItems(lista, true);
return entidade; }
} }

Edio 101 Java Magazine 57


Aplicaes Java EE lightweight

Listagem 8. Exemplo de utilizao da tag ajax. Concluses


A plataforma Java EE 6 nos prov a infraestrutura necessria
<h:form styleClass=jsfcrud_list_form>
<h:panelGroup rendered=#{empresaController.items.rowCount > 0}> para que as aplicaes sejam desenvolvidas muito mais focadas
<h:panelGroup layout=block style=text-align: center;> na resoluo dos problemas de negcio, sem nos preocupar tanto
<h:commandLink action=#{empresaController.previous}
value=#{msgs.PaginacaoAnterior} com problemas de infraestrutura da plataforma como era neces-
disabled=#{not empresaController.pagination.hasPreviousPage}> srio antes. Deste modo, muitas das boas prticas e padres J2EE
<f:ajax render=@form/>
</h:commandLink> utilizados anteriormente caram por terra e devem ser evitados,
&nbsp; pois estes padres geram um nvel de complexidade desnecess-
<h:outputText value=#{empresaController.pagination.pageFirstItem + 1}
.. #{empresaController.pagination.pageLastItem + 1} rio para aplicaes construdas na atual plataforma, sem trazer
/ #{empresaController.pagination.itemsCount}/>&nbsp; nenhum benefcio ao processo de desenvolvimento, ou mesmo
<h:commandLink action=#{empresaController.next}
value=#{msgs.PaginacaoProximo} s aplicaes.
disabled=#{not empresaController.pagination.hasNextPage}>
<f:ajax render=@form/>
Com foco no desenvolvimento de aplicaes Java EE mais
</h:commandLink> simples e enxutas, mostramos neste artigo como implemen-
</h:panelGroup>
<h:dataTable value=#{empresaController.items} var=item border=0
tar as funcionalidades de casos de uso do tipo CRUD, que
cellpadding=2 cellspacing=0 rules=all> so muito corriqueiros em aplicaes corporativas. Para isso,
<h:column>
<f:facet name=header>
uma CRUD genrica foi implementada utilizando a estratgia
<h:outputText value=#{msgs.EmpresaTituloNome}/> CRUD Facade, derivada do padro Session Facade. Alm dis-
</f:facet>
<h:outputText value=#{item.nome}/> so, apresentamos implementaes alternativas desta mesma
</h:column> CRUD, utilizando as estratgias Generic DAO e Abstract DAO,
</h:dataTable>
</h:panelGroup> derivadas do padro DAO. Por fim, mostramos como utilizar
<h:commandButton action=/empresa/Crud herana e recursos do JSF 2, como o escopo de viso e AJAX,
value=#{msgs.PesquisaEmpresaAcaoNovo}/>
</h:form>
para implementar a camada de apresentao, que funciona
como um cliente da CRUD.
Listagem 9. Cdigo da classe auxiliar para paginao. Duas timas fontes, presentes nas referncias deste artigo, para
import javax.faces.model.DataModel; se aprofundar na utilizao de padres Java EE so: o livro Real
public abstract class PaginationHelper {
private int pageSize;
World Java EE Patterns Rethinking Best Practices, indicado
private int page; tambm na pgina de referncias da plataforma Java EE da Oracle,
public PaginationHelper(int pageSize) {
this.pageSize = pageSize;
e o repositrio de implementaes dos Padres Java EE no projeto
} Kenai, mantido por Adam Bien, autor desse mesmo livro.
public abstract int getItemsCount();
public abstract DataModel createPageDataModel();
public int getPageFirstItem() {
return page * pageSize;
Oscar Costa
} oscarcosta@gmail.com, @oscarcosta
public int getPageLastItem() { bacharel em Cincias da Computao e ps-graduando em Arqui-
int i = getPageFirstItem() + pageSize - 1;
int count = getItemsCount() - 1; tetura de Sistemas. Vem atuando como desenvolvedor Java EE a mais
if (i > count) { de cinco anos. Possui as certificaes SCJP 5, SCWCD 5 e SCBCD 5. pai da
i = count; Daniela (2), pratica mountain bike e toca contra baixo nas horas vagas.
}
if (i < 0) {
i = 0;
} oracle.com/technetwork/java/javaee/blueprints
return i; Pgina de referncia da plataforma Java EE
}
public boolean isHasNextPage() {
return (page + 1) * pageSize + 1 <= getItemsCount(); adam-bien.com
} Site do autor, arquiteto e Java Champion, Adam Bien
public void nextPage() {
if (isHasNextPage()) { kenai.com/projects/javaee-patterns/
page++;
} Coleo das implementaes dos Padres Java EE descritos no livro
} Real World Java EE Patterns Rethinking Best Practices.
public boolean isHasPreviousPage() {
return page > 0;
}
public void previousPage() { D seu feedback sobre esta edio! Feedback
eu
if (isHasPreviousPage()) {
s

A Java Magazine tem que ser feita ao


D

page--;
seu gosto. Para isso, precisamos saber
sobre e

}
} o que voc, leitor, acha da revista!
s

ta
public int getPageSize() {
edio

return pageSize; D seu voto sobre este artigo, atravs do link:


}
} www.devmedia.com.br/javamagazine/feedback

58 Java Magazine Edio 101


Edio 101 Java Magazine 59
Seo Boas Prticas: Nesta seo voc encontra artigos sobre as tecnologias que podero aumentar

Maven 3, Sonar e Hudson


Descobrindo uma maneira mais gil de d

Resumo DevMan
De que se trata o artigo:
Neste artigo vamos abordar a integrao das ferramentas Maven 3, Sonar e Hudson com a inteno de criar
um ambiente de desenvolvimento mais gil por meio do estmulo eliminao de atividades repetitivas,
reduo na incidncia de defeitos e aumento da qualidade do cdigo produzido.

Em que situao o tema til:


Uma das principais causas da mortalidade prematura de projetos de software est ligada diminuio da
qualidade do cdigo. Assim, um dos principais objetivos deste artigo estimular a criao de um ambiente
continuamente integrado e que seja capaz de irradiar importantes informaes, alertando a equipe quanto
a problemas existentes no projeto.

Maven 3,Sonar e Hudson:


O objetivo deste artigo mostrar o caminho das pedras paraa utilizao e integrao das ferramentas
Maven, Sonar e Hudson. Juntas, elas so capazes de automatizar uma srie de atividades repetitivas exis-
tentes no dia-a-dia de qualquer ambiente de desenvolvimento de software, fornecerimportantes mtricas
e indicadores de qualidade de cdigo, evitando o acmulo de dbito tcnico, e ainda integrar o projeto
continuamente para proporcionar feedback constante para o cliente.

P
ara desenvolver software de forma podem ser feitas tanto na estrutura da
cada vez mais gil importante es- empresa e em seus processos, quanto no
tar sempre atento aos desperdcios prprio indivduo.
existentes no processo de desenvolvimen- Taiichi Ohno, um dos grandes prota-
to, buscando estratgias para elimin-los e, gonistas do Toyota Production System,
se possvel, fazer com que eles no voltem aplicava o Kaizen de forma sistemtica
a ocorrer. e consistente nas fbricas da Toyota. Ele
Nesse sentido importante compreen- costumava desenhar um crculo no cho
der dois conceitos muito fortes na cultura da fbrica, que mais tarde ficou conhecido
oriental e que podem ajudar nessa difcil como Crculo de Ohno, e pedia para que
tarefa. Eles so conhecidos como Hansei supervisores e gerentes entrassem nele
e Kaizen. apenas para observar enquanto seus lide-
O Hansei est diretamente ligado hu- rados trabalhavam. Aps algum tempo
mildade. Ter um comportamento humilde ele perguntava se estava tudo bem. Caso
a base para que possamos assumir e a resposta fosse positiva, a pessoa era
reconhecer os problemas existentes em convidadaapermanecer observando por
nosso ambiente de desenvolvimento mais tempo at que conseguisse identi-
atual. Sem isso extremamente difcil ficar problemas no processo. Para Taiichi
promover qualquer tipo de melhoria mais Ohno, sempre era possvel melhorar, e foi
profunda e efetiva. essa obsessoque tornou a Toyota uma
Para o Kaizen sempre possvel fazer empresa reconhecida mundialmente pela
melhor e nenhum dia deve passar sem que alta qualidade de seus produtos. Segundo
alguma melhoria tenha sido observada, ele: No ter problema o maior de todos
sugerida ou implantada. Essas melhorias os problemas!.

60 Java Magazine Edio 101


a qualidade do desenvolvimento de software

Neste artigo vamos


mostrar como utilizar as
ferramentas Maven 3, Sonar
e Hudson para desenvolver
software com mais
esenvolver software qualidade e agilidade

Rodrigo Branas

Aplicados juntos, estes conceitos proporcionam um ambiente Os mtodos geis se baseiam no desenvolvimento iterativo e
preparado para evoluir e melhorar constantemente. incremental. Em pequenos intervalos de tempo, pequenas partes
Neste contexto, o objetivo deste artigo mostrar como instalar, das funcionalidades do software so planejadas, desenvolvidas
utilizar e extrair valor de ferramentas como: Maven, para auto- eentregues ao cliente. Dessa forma possvel proporcionar retorno
matizar uma srie de atividades repetitivas; Sonar, para visua- de investimento antecipado e ainda guiar o desenvolvimento de
lizar mtricas e indicadores de qualidade de cdigo, evitando o novas funcionalidades com base na experincia adquirida com a
acmulo de dbito tcnico (uma espcie de dvida acumulada utilizao das partes j entregues.
por conta de problemas tcnicos no resolvidos); e Hudson,para No entanto, uma das grandes dificuldadespode estar relaciona-
integrar tudo continuamente e proporcionar feedback constante da justamentecom o ambiente de desenvolvimento.Este deve ser
para o cliente. capaz de disponibilizar, em tempo real, a ltima verso do projeto
para que o cliente possa utilizar e testar, se envolvendo com mais
Descobrindo seu prprio ambiente profundidade no processo de desenvolvimento. Infelizmente, pela
Costumamos realizar uma srie de atividades diferentes em dificuldade de gerar uma verso adequada para testes por conta
meio correria do nosso dia-a-dia e muitas vezes no nos damos do ambiente, o feedback acaba sendo constantemente adiado.
conta de que algumas delas so extremamente repetitivas. Em seu livro de Extreme Programming, escrito h mais de 10
Pense em quantas vezes precisamos realizar algumas dastarefas anos, Kent Beck rene prticas imprescindveis para o sucesso de
abaixo: um projeto, como a automao de build e a integrao contnua.
Criar e configurar um projeto em determinada tecnologia; Essas prticas ajudam a desenvolver software de alto valor agre-
Configurar o ambiente de desenvolvimento seja para novos gado e com menos desperdcios.
desenvolvedores ou mesmo em casos onde precisamos trocar de
computador por algum motivo; Reduo no nmero de defeitos
Incluir e atualizar verses e dependncias de bibliotecas do Um dos maiores desperdcios no desenvolvimento de projetos
projeto; de software est relacionado ocorrncia de defeitos. A maior
Preparar e empacotar uma verso do projeto antes de coloc-lo dificuldade muitas vezes no est na sua correo, mas sim na
em produo; dificuldade de reproduo e identificao do trecho de cdigo
Executar o procedimento de implantao de uma nova verso que ocasiona o erro.
do projeto. Pense em quantas vezes voc j ficou horas tentando entender
o que poderia estar causando o problema e apenas uma ou duas
Quanto tempo poderia ser economizado automatizando esse linhas de cdigo foram necessrias para corrigir efetivamente o
tipo de atividade? defeito. A analogia abaixo ilustra bem essa situao:
Imagina por um minuto que voc est andando na rua e per-
A importncia do feedback cebe que sua chave caiu do bolso. Ao ouvir o barulho do choque
Pesquisas feitas pelo The Standish Group, uma importante orga- da chave com o cho, voc prontamente olha para trs e localiza
nizao americana sediada em Boston e responsvel por realizar facilmente sua chave cada, recuperando e seguindo novamente
pesquisas sobre a performance de projetos de TI,revelam que boa o caminho.
parte das funcionalidades implementadas raramente utilizada E se voc no tivesse ouvido a chave cair no cho e continuasse
pelos clientes. Isso acontece, em grande parte das vezes, pela falta andando por cerca de 10 minutos? Ser que seria to fcil assim
de feedback e principalmente de envolvimento do cliente durante encontrar a chave?
o processo de desenvolvimento do projeto. Muitas vezes o tempo gasto para localiz-la, dependendo do
Desenvolver software de forma gil no significa programar quanto se tenha andado, acaba sendo to grande que mais fcil
mais rpido, mas sim reconhecer funcionalidades desnecessrias e rpido chamar um chaveiro para abrir a porta de casa e trocar
e evit-las. A simplicidade um dos princpios do Manifesto gil. a fechadura.
Ela definida como a arte de maximizar a quantidade de software Quanto mais cedo for descoberto o problema, maior ser a eco-
no desenvolvido. nomia, pois menos tempo precisar ser investido na correo!

Edio 101 Java Magazine 61


Maven 3, Sonar e Hudson

Maven 3 de downloads no site do projeto (http:// O resultado esperado pode ser verificado
O Maven, atualmente na verso 3.0.3, maven.apache.org/download.html), locali- na Figura 1.
uma poderosa ferramenta para automao zado dentro do site da Apache Software Vale lembrar que imprescindvel ter o
e gerenciamento de configurao de pro- Foundation, e baixar a ltima verso. Aps Java corretamente instalado e configurado
jetos em Java. Entre suas principais carac- realizar o download do arquivo, descom- na mquina. Assim, verifique tambm a
tersticas esto a gesto de dependncias, pacte o contedo dentro de um diretrio existncia da varivel de ambiente JAVA_
a padronizao da estrutura de diretrios, de sua preferncia. HOME e da referncia %JAVA_HOME/
o ciclo de vida bem definido, a gerao Para finalizar a instalao, ser necess- bin no PATH.
de documentao, alm de uma imensa rio criar uma varivel de ambiente com Com o Maven instalado corretamente,
quantidade de plugins disponveis que o nome M2_HOME, apontando para o podemos seguir adiante e criar o nosso
permitem estender suas funcionalidades. diretrio de instalao do Maven. Tam- primeiro projeto!
Para montar nosso ambiente de desenvolvi- bm importante modificar a varivel
mento gil, o Maven ser fundamental, ser- PATH, adicionando o caminho%M2_ Criando seu primeiro projeto com o Maven
vindo como ferramenta base para gerenciar HOME%/bin. O Maven oferece uma formaextrema-
todo o processo de implantao do projeto. Verifique se o procedimento foi realiza- mente simples paracriar novos projetos.
do corretamente executando o seguinte No entanto, para entender como fazer isso,
Processo de Instalao comando no console: ser necessrio compreender melhorum
O processo de instalao do Maven ex- recurso conhecido como Archetypes.
tremamente simples. Basta entrar na seo mvn --version De forma resumida, Archetype um
template para gerao rpida daestrutura e
configurao bsica de projetos. O grande
diferencial deste recurso a possibilidade
de criar projetos baseado em uma deter-
minada tecnologia sem a necessidade de
criar diretrios, arquivos de configurao
e nem baixar bibliotecas para ter seu pro-
jeto pronto para uso.
Figura 1. Verso do Maven sendo exibida no console
Imagine que voc precisa criar um
projeto com base em algum framework,
como o Spring, Apache Wicket, Google
Web Toolkit (GWT) ou qualquer outro.
Normalmente seria necessrio ler a docu-
mentao de instalao, baixar uma srie
de bibliotecas, configur-las no projeto e
ainda criar alguns arquivos de configura-
o especficos at ter o mnimo necessrio
para criar um simples Hello, World!.
Para criar seu primeiro projeto com o
Maven, basta executar o comando:

mvn archetype:generate

Em seguida, o Maven ir mostrar uma


lista conforme a Figura 2 indicando os
Archetypes disponveis, e ento s sele-
cionar um nmero com base na lista de
tecnologias suportadas.
Caso a tecnologia desejada no seja
encontrada, recomendada a utilizao
do Archetype padro (sugerido pelo pr-
prio Maven), para criar a estrutura bsica
do projeto. Nesse caso, a configurao
das bibliotecas precisar ser realizada
Figura 2. Lista de Archetypes disponveis no Maven manualmente.

62 Java Magazine Edio 101


Configurando as propriedades bsicas de um projeto Maven o Maven. Dentro dele esto as configuraes bsicas, definio
Aps selecionar o Archetype padro, ser necessrio configurar das dependncias necessrias, configurao dos plugins utiliza-
as propriedades bsicas para finalizar a criao do projeto. Estas dos e demais especificaes importantes referentes gesto de
propriedades so obrigatrias e servem para identificar o projeto configurao do projeto.
de forma nica.So elas:
groupId: Representa a estrutura bsica (raiz) de pacotes do projeto; Estrutura de diretrio Tipo de contedo
artifactId: Representa o nome do projeto; src/main/java Pasta principal, onde fica localizado o cdigo fonte da
version: Determina a verso do projeto. aplicao.
src/main/resources Arquivos de configurao e demais recursos.
Realizada a configuraodas propriedades bsicas, o Maven src/main/webapp Fontes relacionados Web.
ir solicitar a confirmao dos parmetros informados antes de src/test/java Cdigo fonte dos testes da aplicao.
proceder com a criao da estrutura do projeto.
src/test/resources Arquivos de configurao e demais recursos necess-
Finalizado o processo, o Maven criar a estrutura do projeto
rios aos testes.
dentro de uma pasta com o mesmo nome do artifactId. Na Figura 3 src/site Documentao do projeto.
temos a estrutura de pastas criada pelo Maven sendo exibida
dentro do Eclipse. Tabela 1. Detalhes sobre a padronizaoda estrutura de diretrios

O POM tem como uma de suas grandes vantagens a concen-


trao de informaes em um local nico e seu alto nvel de
abstrao,permitindo configurar rapidamente estratgias de
implantao e empacotamento para o projeto.
Na Listagem 1, podemos observar o pom.xml resultante do
processo de criao do projeto utilizando o Archetype padro do
Maven, contendo alm das propriedades bsicas, algumas confi-
guraes que veremos a seguir.

Listagem 1. Contedo do arquivo pom.xml.

<Project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi=


http://www.w3.org/2001/XMLSchema-instancexsi:schemaLocation=
http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-
v4_0_0.xsd>
<modelVersion>4.0.0</modelVersion>
<groupId>br.com.rodrigobranas</groupId>
<artifactId>ProjetoJavaMagazine</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>ProjetoJavaMagazine</name>
</project>
Figura 3. Estrutura de diretrios padro gerada pelo Maven

Entendendo a estrutura de diretrios padro Gesto de Dependncias


Uma caracterstica interessante do Maven a padronizao A utilizao de bibliotecas e frameworks ajuda a evitar a criao
que ele proporciona. No incomum encontrar nas empresas a desnecessria de cdigo e ainda permite que os desenvolvedores fo-
utilizao de diferentes estruturas de diretrio para armazenar os quem no que gera mais valor de negcio para o projeto. No entanto,
fontes de projetos Java. Com o tempo, isso pode causar, alm de a gesto dessas dependncias pode se tornar difcil, com o passar
confuso, uma sensao de falta de organizao. O Maven utiliza, do tempo, por conta de mudanas e atualizaes constantes.
por padro, a estrutura de pastas detalhada na Tabela 1. Normalmente, essas bibliotecas ficam armazenadas e configu-
No entanto, existem alguns casos em que h uma conveno pr- radas dentro do prprio projeto em que so utilizadas, gerando
pria que define a estrutura de pastas. Nesse caso, ser necessrio duplicao nos casos em que diferentes projetos utilizam as mes-
sobrescrever a estrutura padro do Maven, alterando o arquivo mas dependncias. Outro problema que, alm de ocupar mais
pom.xml localizado no diretrio raiz do projeto. espao em disco, tanto na maquina do desenvolvedor quanto no
repositrio de cdigo fonte, aumentam o trfego da rede sempre
Project Object Model, o corao do projeto que necessrio baixar novamente todo o projeto.
O Project Object Model, tambm conhecido como pom.xml, O Maven muda esse cenrio ao introduzir o conceito de reposit-
o principal arquivo de configurao de um projeto que utiliza rio local, ou seja, todas as dependncias, independente do projeto

Edio 101 Java Magazine 63


Maven 3, Sonar e Hudson

em que so utilizadas, so armazenadas de forma centralizada e compile o escopo padro e ser sempre utilizado caso a
podem ser reutilizadas em todo o ambiente de desenvolvimento. propriedade no seja definida. As dependncias estaro dispo-
Esse repositrio fica localizado na pasta .m2/repository dentro do nveis em todos os ambientes do projeto;
home do usurio. provided A dependncia estar disponvel em tempo de
Ao executar o ciclo de vida de construo do projeto, o Maven compilao, no entanto, ser fornecida externamente em tempo
procura pela dependncia dentro do repositrio local e, caso ela de execuo. Ou seja, no precisar ser empacotada junto com
no seja encontrada, ser automaticamente baixada de um repo- o projeto;
sitrio pblico, na internet. r untime Semelhante ao provided, a dependncia no
necessria em tempo de compilao, somente em execuo;
Incluindo novas bibliotecas ao projeto test Indica que a dependncia estar disponvel apenas
Para incluir bibliotecas no projeto basta editar o arquivopom.xml durante a compilao e execuo dos testes. Um exemplo
e adicionar a configurao da dependncia. Essa configurao interessante a utilizao de bibliotecas de mock, utilizadas
feita dentro da tag <dependency>, onde necessrio informar, apenas pelos testes, no entanto, desnecessrias para o resto do
tambm por meio de tags, o groupId, artifactId e version da depen- projeto.
dncia desejada. Na Listagem 2 temos um exemplo feito com a
biblioteca JUnit 3.8.1.
Listagem 3. Configurao do escopo da dependncia no arquivo pom.xml.

Listagem 2. Configurao de dependncias no arquivo pom.xml. <Project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi=


http://www.w3.org/2001/XMLSchema-instance
<Project xmlns=http://maven.apache.org/POM/4.0.0 xmlns:xsi= xsi:schemaLocation=http://maven.apache.org/POM/4.0.0
http://www.w3.org/2001/XMLSchema-instance http://maven.apache.org/maven-v4_0_0.xsd>
<modelVersion>4.0.0</modelVersion>
xsi:schemaLocation=http://maven.apache.org/POM/4.0.0
<groupId>br.com.rodrigobranas</groupId>
http://maven.apache.org/maven-v4_0_0.xsd> <artifactId>ProjetoJavaMagazine</artifactId>
<modelVersion>4.0.0</modelVersion> <packaging>jar</packaging>
<groupId>br.com.rodrigobranas</groupId> <version>1.0-SNAPSHOT</version>
<artifactId>ProjetoJavaMagazine</artifactId> <name>ProjetoJavaMagazine</name>
<dependencies>
<packaging>jar</packaging>
<dependency>
<version>1.0-SNAPSHOT</version> <groupId>junit</groupId>
<name>ProjetoJavaMagazine</name> <artifactId>junit</artifactId>
<dependencies> <version>3.8.1</version>
<dependency> <scope>test</scope>
<groupId>junit</groupId> </dependency>
</dependencies>
<artifactId>junit</artifactId> </project>
<version>3.8.1</version>
</dependency>
</dependencies>
</project>
Ciclo de vida
O Maven possui um ciclo de vida bem definido para gerenciar
as fases de construo de um projeto. Todas as etapas do ciclo
Dependncias transitivas so executadas com base nas configuraes feitas no pom.xml
O sistema de gesto de dependncias do Maven funciona de do projeto.
forma transitiva, ou seja, identificando e obtendo todas as depen- O ciclo de vida, utilizado para realizardesde a compilao at
dncias das dependncias. Isso simplifica imensamente o processo a implantao do projeto, define as seguintes etapas:
de construo do projeto, j que no necessrio se preocupar com validate Verifica se o projeto est correto e se todas as infor-
as bibliotecas necessrias para fazer a aplicao funcionar. maes necessrias esto disponveis;
O funcionamento desse mecanismo determinado conforme o compile Compila o cdigo fonte do projeto;
escopo escolhido na configurao de cada dependncia. t est Testa o cdigo fonte compilado com base em um
framework de testes;
Escopo da dependncia package Empacota o cdigo compilado no formato especificado;
Muitas vezes, s necessrio utilizar uma determinada biblio- integration-test Processa e implanta o pacote em um am-
teca durante a execuo de testes. Em outros casos, acaba sendo biente onde possvel executar testes de integrao;
desnecessrio empacotar a dependncia junto com a aplicao, verify Executao processo de validao do pacote com base
pois ela j fornecida pelo servidor. Por esse motivo, importante em critrios de qualidade;
conhecer a configurao do escopo da dependncia. install Instala o projeto no repositrio local para ser utilizado
Na Listagem 3, temos um exemplo da dependncia JUnit 3.8.1 como dependncia em outros projetos;
configurada para o escopo de teste. deploy Executa o procedimento de implantao do projeto
A seguir, seguem os principais tipos de escopo: no servidor.

64 Java Magazine Edio 101


Por exemplo, para executar o processo de compilao de um Limpando o projeto
determinado projeto, basta executar o seguinte comando (a partir O Maven tambm define um ciclo de vida de limpeza que uti-
do diretrio raiz do projeto): lizado para apagar o diretrio target, excluindo as classes e testes
compilados juntamente com os pacotes gerados durante o ciclo
mvn compile de vida principal. Para isso, utilizamos o comando:

Em seguida o Maven ir compilar todo o cdigo fonte do pro- mvn clean

jeto, buscando dependncias caso necessrio e disponibilizando Esse ciclo pode ser executado inclusive em conjunto com etapas
o cdigo compilado dentro do diretrio target/classes, conforme do ciclo de implantao.Por exemplo, para executar o processo de
mostrado na Figura 4. limpeza e implantao do projeto, invoque o comando:
mvn clean deploy

Criando a documentao do projeto


Outra funcionalidade interessante do Maven a possibilidade de
gerar documentao a partir de definies e configuraes feitas
no projeto. Essas definies no sero abordadas neste artigo, no
entanto extremamente interessante estudar esses recursos para
automatizar tambm etapas de documentao do projeto.
Para executar o ciclo de vida de criao da documentao do
projeto basta executar o comando abaixo:

mvn site

Deste modo o Maven ir disponibilizar a documentao dentro


do diretrio target/site.
Figura 4. Detalhes do diretrio target, gerado aps a compilao
Integrao com o Eclipse
Um detalhe importante que as etapas so executadas em se- Para integrar um projeto criado pelo Maven com o Eclipse
quncia, ou seja, caso seja executada a etapa de deploy, todas as necessrio ter os arquivos de configurao .project e .classpath.
anteriores a ela tambm sero executadas pelo Maven. Eles so utilizados pelo Eclipse para identificar adequadamente
Outro exemplo interessante o processo de empacotamento do o projeto e ainda disponibilizar corretamente suas dependncias
projeto, que realizado atravs do comando: para que o processo de compilao funcione corretamente. Esses
arquivos podem ser gerados com a utilizao do comando:
mvn package

Observe na Figura 5 o arquivo empacotado no formato JAR. O nome mvn eclipse:eclipse

dele foi gerado com base no artifactId juntamente com o version.


Aps a execuo os arquivos so criados e o projeto estar pronto
para ser importado dentro do Eclipse. Um detalhe importante
gerar novamente esses arquivos sempre que houver qualquer
atualizao de dependncia no pom.xml. Isso faz com que o Eclipse
reconhea corretamente as dependncias recm-includas, caso
contrrio, ele no conseguir compilar o projeto adequadamente.

Qual o problema com a qualidade do cdigo?


Escrever cdigo com baixa qualidade, de forma ilegvel e bagun-
ada pode at funcionar! No entanto, esse tipo de atitude, seja ela
consciente ou no, resulta na contrao de uma dvida que cobra
juros altos, pagos com a perda constante de produtividade. Essa
perda pode ser observada na Figura 6.
Com o tempo, os custos de desenvolvimento e manuteno do
projeto aumentam, ficando cada vez mais caro e demorado criar
novas funcionalidades e realizar qualquer tipo de modificao,
Figura 5. Detalhes do projeto empacotado dentro do diretrio target aps o processo de
empacotamento sem falar na quantidade de defeitos.

Edio 101 Java Magazine 65


Maven 3, Sonar e Hudson

capazes de ajudar toda a equipe a identificar falhas e evitar o


acmulo de dbito tcnico.
Tornar visvel mtricas como cobertura de testes, complexi-
dade, violaes de boas prticas, duplicao de cdigo, nvel de
comentrios, entre outras informaes pode ajudar a criar uma
cultura onde as pessoas se preocupam e lutam para manter nveis
saudveis de qualidade.
Na Figura 7, temos o dashboard do Sonar e o tipo de informaes
que podemos visualizar durante todo o tempo.
Figura 6. Evoluo da produtividade ao longo do tempo

Esse tipo de problema pode trazer prejuzos financeiros e at


afetar a imagem da empresa no mercado. Outro reflexo negativo
a rotatividade da equipe, que em muitos casos acaba desistindo do
projeto por no aguentar mais a presso e o ambiente catico.
Muitas vezes, a melhor opo realmente acaba sendo jogar tudo
fora e fazer novamente.

A importncia do profissionalismo
Nos tempos de faculdade, a principal preocupao dos jovens
aspirantes a desenvolvedores de fazer com que o software pedido
pelo professor simplesmente funcione, no importando a qualida-
de do cdigo, seu desempenho ou mesmo durabilidade.
J no mercado de trabalho, absurdo que desenvolvedores
profissionais tenham a mesma postura. A iluso do imediatismo
a principal causa da mortalidade de projetos de software que
poderiam ter mais sucesso se critrios mnimos de qualidade
fossem adotados. Figura 7. Dashboard do Sonar
Em 1982, James Q. Wilson e George L. Kelling escreveram
um famoso artigo chamado Janelas Quebradas que dizia o
seguinte: Processo de Instalao
Pense em um edifcio com apenas algumas janelas quebradas. Como no podia deixar de ser, o processo simples. Basta
Se as janelas no forem reparadas, a tendncia para que vndalos fazer o download da ltima verso do Sonar em http://www.
quebrem mais janelas. Eventualmente, podero inclusive entrar sonarsource.org/downloads/ e descompactar no diretrio de sua
no edifcio, e se este estiver desocupado, pode ser tomado ou at preferncia.
mesmo incendiado. Aps esse procedimento, s iniciar o Sonar executando o
No desenvolvimento de software, a teoria das janelas quebradas arquivo StartSonar.bat para os usurios da plataforma Windows
pode ser entendida de uma forma at pior.Se o cdigo est ruim, ou Sonar.sh para outras plataformas. Em seguida, o servidor web
o projeto no tem testes, as excees no so tratadas da forma interno do Sonar ser iniciado e poder ser acessado em http://
correta, a tendncia que as pessoas no tenham a mnima von- localhost:9000.
tade de melhorar e simplesmente continuam programando da
mesma forma, agravando ainda mais a situao. Utilizando o Sonar pela primeira vez
Em meio a esse cenrio o Sonar fundamental pois fornece At que ponto chega a simplicidade? Apenas digitando o co-
visibilidade a todos sobre a qualidade do cdigo que est sendo mando abaixo j ser possvel se conectar ao Sonar e executar a
produzido! verificao de qualidade:

Descobrindo o Sonar mvn sonar:sonar

Em um submarino, para detectar a presena de inimigos, mesmo


que escondidos na imensido do oceano, o uso de um sonar fun- Aps a verificao de qualidade ser possvel visualizar as
damental. No mundo do desenvolvimento de software tambm. mtricas recolhidas em http://localhost:9000.
No entanto, nesse caso, o inimigo outro!
O Sonar uma ferramenta open source dedicada ao controle e Mtricas de cdigo
medio da qualidade do cdigo. Funcionando de maneira inte- O Sonar capaz de fornecer uma srie de mtricas que revelam
grada ao Hudson, ela possibilita fornecer continuamente mtricas diversos detalhes importantes sobre a situao tcnica do projeto.

66 Java Magazine Edio 101


Com a anlise dessas mtricas possvel
descobrir pontos importantes de melhoria
para a reduo do dbito tcnico, manten-
do o projeto saudvel e manutenvel.
importante conhecer alguns dos prin-
cipais indicadores do Sonar:
C obertura de testes (Code Coverage):
Revela o ndice de cobertura de testes
existente no projeto. Quanto mais alto,
mais confiana e segurana teremos para
fazer alteraes no cdigo sem ter medo
de introduzir novos bugs;
Complexidade (Complexity): A Comple-
xidade Ciclomtica, tambm conhecida
como mtrica de McCabe, representa o
quanto um mtodo se torna complexo con- Figura 8. Tela inicial do Hudson. Detalhe para o link de Nova Tarefa
forme aumenta a quantidade de estruturas
de controle de fluxo como ifs, fors, whiles
entre outras. Quanto mais alto, mais difcil ven, o ciclo de vida executado passando padro de implantao de aplicativos do
ser entender e dar manuteno; por etapas como compilao, execuo servidor de aplicao escolhido.
Duplicaes (Duplications): Representa o dos testes, empacotamento e por fim a Aps esse procedimento, basta acessar o
nvel de duplicao de cdigo existente no implantao em um servidor de testes ou contexto /hudson dentro do servidor e a tela
projeto. Normalmente, esse nmero pode homologao caso todas as etapas sejam de inicializao do Hudson aparecer.
ser melhorado com o aumento do reuso completadas com sucesso.
das funcionalidades; Caso algum problema ocorra, os desen- Configurando um projeto no Hudson
Comentrios (Comments): Mostra a volvedores so notificados imediatamente O Hudson trabalha com o conceito de
quantidade de comentrios existentes no e tm a oportunidade de eliminar erros tarefa para realizar o procedimento de
projeto; recm-inseridos, aumentando a qualidade construo do projeto. As tarefas so se-
Violaes (Violations): Nmero de viola- do produto final. melhantes a receitas de bolo e nelas esto
es de regras ocorridas dentro do cdigo. configurados todos os detalhes que permi-
Esse nmero calculado com base na Hudson, muito prazer! tem ao Hudson saber exatamente quando
utilizao de plugins como o Checkstyle, O Hudson um servidor de integrao e como fazer para construir um projeto em
PMD e Findbugs e pode ser configurado contnua de cdigo aberto e escrito em um determinado ambiente.
de acordo com as necessidades do projeto. Java, extremamente fcil de instalar e O processo de configurao iniciado
uma importante fonte de informaes configurar e ainda com uma disponibili- por meio do link Nova Tarefa, como apre-
que pode determinar onde o cdigo pode dade grande de plugins. Ele tem suporte sentado na Figura 8.
ser melhorado. a diversos tipos de repositrios de cdigo Aps clicar em Nova Tarefa ser neces-
fonte como SVN, CVS e Git e tambm a srio definir o tipo de projeto desejado.
Integrao Contnua com o Hudson ferramentas como Ant e Maven. Por esses Entre as opes de configurao dispo-
O processo de integrao contnua motivos o Hudson est se tornando cada nveis, conforme descrito na Figura 9, foi
fundamental para detectar a ocorrncia de vez mais famoso e utilizadoentre os de- selecionada a opo de Construir um projeto
inconsistncias no momento da integrao senvolvedores. Maven 2/3 por ser mais simples quando
do cdigo produzido pela equipe. Anteci- o objetivo configurar um projeto que
paresses problemas por meio da execuo Processo de Instalao utilize apenas o Maven. Para os casos
de testes em um ambiente de integrao Baixe a ltima verso diretamente do site onde seja necessrio um nmero maior
importante para proporcionar e garantir um do Hudson (http://hudson-ci.org/), dentro de configuraes, diferentes ambientes e
feedback de qualidade para os clientes. da seo de downloads.Para instalar o plataformas, mais recomendado que seja
O funcionamento simples. O servidor Hudson necessrio ter disponvel um escolhida a opo de Construir um projeto
de integrao fica constantemente tentan- servidor Apache Tomcat ou similares. com mltiplas configuraes.
do baixar atualizaes do cdigo fonte no Feito isso, basta copiar o arquivo de Agora vamos configurar as proprie-
repositrio (SVN, CVS ou Git) e assim que distribuio do Hudson (Hudson.war) dades principais do projeto, conforme
consegue inicia o processo de integrao. para dentro da pasta de webapps, no caso mostrado na Figura 10, como o reposi-
Com base em uma ferramenta como o Ma- do Apache Tomcat, ou seguir o processo trio de cdigo fonte,e o projeto estar

Edio 101 Java Magazine 67


Maven 3, Sonar e Hudson

pronto para ser integrado continuamente


pelo Hudson.
Com a configurao finalizada ser
possvel iniciar o processo de construo
do projeto. Para isso, ser necessrio clicar
no link Construir Agora, como pode ser ob-
servado na Figura 10, no menu de opes
disponveis para o projeto.
Na Figura 11 possvel visualizar deta-
lhes importantes como o momento da lti-
Figura 9. Tela de configurao inicial do projeto ma construo de sucesso e de fracasso.

Integrando o Hudson com o Sonar


J vimos como utilizar o Sonar por meio
do Maven e agora a hora de aprender a
configurar o Sonar para ser utilizado em
conjunto com o Hudson. Dessa forma ser
possvel manter as estatsticas sobre a qua-
lidade do cdigo sempre atualizadas (aps
cada construo do projeto). Para realizar
essa integrao ser necessrio instalar o
plugin do Sonar. O primeiro passo, por-
tanto, entrar na tela de gerenciamento
do Hudson, como indicado na Figura 12,
clicando no link Gerenciar Hudson e em
seguida entrar na tela de gerenciamento
de plugins, por meio do link Gerenciar
Figura 10. Detalhes da tela de configurao do projeto Plugins.
Na guia de plugins disponveis, sele-
cione o checkbox Sonar plugin (verifique
a Figura 13) e depois clique no boto Ins-
talar, localizado no canto inferior direito
da tela.
Aps o Hudson realizar a atualizao dos
plugins ser necessrio reiniciar o servidor
de aplicao e configurar a integrao no
projeto.

Configurando o Sonar no projeto


Figura 11. Tela principal do Hudson Na tela de configuraes do projeto
existem outras configuraes disponveis,
taiscomo: ativar notificaes por e-mail;
definir a periodicidade da construo do
projeto; e uma das funcionalidades mais
importantes para a construo do nosso
ambiente gil, a integrao com o Sonar.
Para ativar a integrao, basta selecionar o
checkbox Sonar dentro do grupo de Aes-
Ps-Construo, conforme a Figura 14.
Pronto! Agora s ac e s sa r htt p://
localhost:9000 e observar as informaes
atualizadas pelo servidor de integrao
Figura 12. Tela de gerenciamento do Hudson contnua.

68 Java Magazine Edio 101


Concluso
Este artigo apresentou como utilizar o
Maven para realizar a gesto de configura-
o do projeto e automatizar importantes
atividades, muitas vezes trabalhosas, do
nosso dia-a-dia de trabalho. Para estimular
o aumento da qualidade e ganhar segu-
rana no cdigo, vimos que o Sonar pode
ser um grande aliado na difcil tarefa de
encontrar problemas no cdigo que antes
acabavam ficando esquecidos, aumen-
tando o dbito tcnico do projeto e ainda
podendo causar muitas dores de cabea
no futuro. Para integrar tudo e manter a
casa sempre em ordem, o Hudson atua
como um integrador, executando todo o
Figura 13. Tela de plugins disponveis
processo de construo e validao do
projeto constantemente, mostrando para
a equipe os problemas no momento em
que acontecem, evitando que eles cheguem
at o cliente.
Este um grande passo rumo criao
de um ambiente mais gil, capaz de evitar
que as pessoas permaneam na zona de
conforto e se sintam sempre estimuladas
a melhorarem continuamente a qualidade
do software que esto produzindo.

Rodrigo Branas
rodrigo.branas@gmail.com
Formado em Computao na UFSC
e MBA em Gesto de Projetos na
FGV, atua no mercado de desenvol-
vimento de softwareh 10 anos, se Figura 14. Ativando a integrao entre o projeto configurado no Hudson e o Sonar
especializando em projetos baseados na arquitetura
Java. Possuias certificaes SCJA, SCJP, SCJD, SCWCD
e SCBCD e PMP. Atualmente trabalha como consultor
na rea de desenvolvimento de software e tambm http://maven.apache.org/
instrutor das Academias Java e Agile da Globalcode, Site oficial do Maven.
onde j acumula cerca de 1.000 horas em sala de aula. http://www.sonarsource.org/
Para mais informaes, visitewww.rodrigobranas.com.
Site oficial do Sonar.
br ou siga no twitter @rodrigobranas.
http://hudson-ci.org/
Site oficial do Hudson.
D seu feedback sobre esta edio! Feedback
eu http://visaoagil.wordpress.com/2009/01/06/
s

A Java Magazine tem que ser feita ao


D

seu gosto. Para isso, precisamos saber melhoria-continua-e-efetiva-atraves-do-


sobre e

o que voc, leitor, acha da revista! hansei-e-kaizen/


s

ta
PIMENTEL, MEDEIROS - Blog Viso gil
edio

D seu voto sobre este artigo, atravs do link: Melhoria contnua efetiva atravs do
www.devmedia.com.br/javamagazine/feedback Hansei e Kaizen.

Edio 101 Java Magazine 69


Seo Engenharia de Software: Nesta seo voc encontra artigos relacionados a anlise, modelagem,

Processo de Teste de Soft


Garantindo mais qualidade com a implant

A Resumo DevMan
o contrrio do que muitos ima-
ginam, testar um software vai
muito alm de executar testes De que se trata o artigo:
explorando as funcionalidades de um Explicar como a utilizao de um Processo de Teste pode melhorar a efetividade dos testes, controlando
sistema j desenvolvido. Na realidade, as atividades e garantindo mais credibilidade e valor ao produto.
para que seja possvel avanar diante
desse estigma, o primeiro obstculo a ser Em que situao o tema til:
enfrentado fazer com que o Processo de Para evitar que o teste seja uma mera etapa do ciclo de desenvolvimento, a implantao de um pro-
Teste e o Processo de Desenvolvimento cesso relacionado a este garante um maior controle das atividades de teste e, consequentemente, mais
sejam executados em paralelo, desde o qualidade ao software.
incio do ciclo de vida do software.
Um Processo de Teste de Software tem Processo de Teste de Software:
como objetivo estruturar as etapas, as Nesse artigo apresentamos o Processo de Teste de Software com as suas principais etapas e respectivos
atividades, os artefatos, os papis e as artefatos gerados. Abordamos tambm os papis e as responsabilidades de cada membro da equipe
responsabilidades do teste, permitindo envolvida. Por fim, citamos algumas boas prticas que podem contribuir para obter sucesso na utilizao
organizao e controle de todo o ciclo do de um Processo de Teste.
teste, minimizando os riscos e agregando
valor ao software. prticas que podem contribuir para a Conforme indicado na Tabela 1, a exe-
A estrut urao do processo tem o melhoria do software com a implantao cuo de cada etapa do ciclo de vida tem
propsito de reduzir o nmero de er- do processo. um tempo estimado de durao. Assim,
ros apresentados no projeto. Mas para recomendvel seguir essa estimativa para
que isso seja possvel, a definio dos Ciclo de Vida do Processo de Teste que seja possvel executar todas as fases
objetivos do teste deve ser bem clara, as O ciclo de vida consiste em uma srie do processo, minimizando riscos e conse-
melhores tcnicas devem ser seleciona- de etapas dependentes, consideradas quentemente garantindo mais qualidade
das, e uma equipe de pessoas treinadas como o esqueleto do Processo de Teste, ao software.
e qualificadas deve estar apta para de- que visam estruturar as atividades defi- A seguir, sero apresentadas as princi-
sempenhar os respectivos papis dentro nindo como os testes sero conduzidos pais etapas do ciclo, juntamente com as
do processo. no projeto. suas respectivas responsabilidades dentro
Aps estruturar os objetivos, o prximo Essas etapas podem variar de acordo do Processo de Teste:
passo implantar o processo. A implan- com a metodologia utilizada, e con- a) Planejar: esta a atividade inicial do
tao permite que o teste deixe de ser forme apresentado na Figura 1, sero processo, onde definido o objetivo dos
tratado como uma atividade secundria, demonstradas nesse artigo as principais testes, registrado atravs do artefato Plano
passando a ser um processo prprio, con- etapas do ciclo de vida de um processo de Teste. Essa etapa tambm responsvel
dutor do fluxo das atividades do teste e de teste. pela identificao das tcnicas de teste
gerador de artefatos que tornam possvel que sero aplicadas ao projeto, como por
a avaliao da qualidade do software. exemplo:
Neste contexto, apresentaremos nesse Teste de Conformidade;
artigo as principais fases do ciclo de vida Teste de Contingncia;
do Processo de Teste, com os referentes Teste de Desempenho;
artefatos gerados por cada uma delas. T este de Estresse;
Abordaremos tambm a hierarquia e Teste de Funcionalidade;
a definio dos papis envolvidos no Teste de Integrao;
teste, com suas respectivas responsabi- Teste de Regresso;
lidades. Por fim, sero listadas algumas Figura1. Ciclo de Vida do Processo de Teste de Software Teste de Segurana;

70 Java Magazine Edio 101


projeto, testes, entre outros temas relacionados a ES

A elaborao de um processo

ware
prprio estrutura as
atividades e impede que o
teste seja tratado como uma
etapa secundria do projeto
ao de um novo processo
Renata Eliza e Vivian Lagares

Etapa Do Processo de Teste Distribuio do Tempo Estimado extrados indicadores e rastreadas todas as mudanas aplicadas
Planejar Testes 10% ao software.
Projetar Testes 40% Durante a terceira etapa do ciclo so executadas as seguintes
Executar Testes 45% atividades:
Entregar 5% Execuo dos Casos de Teste;
Tabela 1. Estimativa de tempo para cada etapa do ciclo Execuo dos Scripts de Teste;
G esto de Defeitos;
Durante o Planejamento so executadas as seguintes atividades: Atualizao da Massa de Teste;
D efinio do Escopo dos Testes; Avaliao do Plano de Teste;
D efinio dos Mtodos e Tcnicas de Teste; Avaliao dos Resultados do Teste;
Planejamento das Atividades de Teste; Formalizao da Evidncia dos Testes.
Planejamento do Ambiente de Testes;
D esignao dos Recursos envolvidos no Teste; d) Entregar: o objetivo da ltima etapa assegurar que os testes
D efinio dos Riscos do Projeto de Teste; foram executados conforme projetado, permitindo assim que o
Definio das mtricas para monitorar e controlar os Testes. sistema esteja apto para entrega e garantindo que os objetivos
planejados foram alcanados.
b) Projetar: depois de realizado o planejamento, o prximo passo Essa etapa conta com a participao direta do cliente, que tem a
colocar em prtica tudo que foi especificado. o momento de funo de executar os testes de aceitao, validando se o que foi
projetar os Casos de Teste, Roteiros de Teste e Procedimentos de desenvolvido realmente atende ao que foi solicitado.
Teste do Software. Nesse momento provavelmente surgiro defeitos, fazendo com
Durante a segunda etapa do ciclo so executadas as seguintes que seja necessrio continuar utilizando a ferramenta para con-
atividades: trole de bugs. A Gesto de Defeitos nessa fase permitir que os
I dentificao dos requisitos planejados; problemas encontrados pelo cliente sejam analisados e corrigidos
Elaborao (e reviso) dos Casos de Teste; por prioridade.
Elaborao dos Scripts de Teste; Durante a ltima etapa do ciclo so executadas as seguintes
Preparao do Ambiente de Teste; atividades:
Preparao da Gesto de Defeitos; Elaborao e Anlise dos Indicadores de Teste;
Refino das Estimativas de Teste; Elaborao do Sumrio de Teste;
Preparao da Massa de Teste; Entrega do Sistema para o Cliente;
Acompanhamento dos riscos do projeto de Teste. A poio ao Cliente na Execuo dos Testes de Aceitao;
Gesto de Defeitos;
c) Executar: o objetivo dessa fase colocar em prtica tanto o que Momento de aprendizado para utilizar o conhecimento adqui-
foi planejado quanto o que foi projetado no processo. o momento rido em novos projetos.
de executar os testes. Um cuidado especial deve ser tomado antes
de iniciar essa etapa. preciso verificar se o ambiente est propcio Artefatos
e estvel, para que a execuo dos testes seja possvel. Os artefatos so produzidos durante a execuo das respectivas
Conforme programado nas primeiras etapas do ciclo, utilizar etapas do ciclo de vida do processo, com o propsito de registrar
uma ferramenta de Gesto de Defeitos durante a execuo dos e acompanhar a evoluo do projeto, e inclusive verificar se os
testes fundamental. Afinal, ela possibilitar o registro coerente resultados obtidos esto de acordo com o que foi especificado.
dos problemas encontrados, condizentes com a sua categoria A Figura 2 destaca os principais artefatos gerados por todas as
(melhoria, erro ou sugesto), prioridade (baixa, normal ou etapas apresentadas do processo: Planejar, Projetar, Executar e
urgente) e claro, gravidade (trivial, mdia ou obstculo). Alm Entregar.
disso, a Gesto de Defeitos proporcionar uma visualizao a) Planejar: a primeira fase do ciclo gera como artefato o Plano
completa de todo o escopo do projeto, permitindo que sejam de Teste. Vejamos uma anlise sobre ele:

Edio 101 Java Magazine 71


Processo de Teste de Software

svel colocar em prtica os Passos e chegar ao Resultado


Esperado;
- Passos: so as aes que devero ser executadas para verificar
se o software cumpre com o que foi especificado;
- Resultado Esperado: o resultado que se deseja obter ao final
da execuo dos passos do Caso de Teste.
Massa de Teste: um conjunto de valores inserido na base de
dados que propicia um ambiente apto para a execuo dos testes.
Esta massa pode ser inserida manualmente ou automaticamente,
atravs da utilizao de scripts de carga;
Roteiro de Teste: formado pela organizao de um ou mais
Casos de Teste que devem ser executados em uma sequncia
Figura 2. Artefatos de um Processo de Teste de Software lgica. recomendvel que para cada Especificao de Caso de
Uso um roteiro seja elaborado. Alm disso, cada Caso de Teste
Plano de Teste: o documento que define o nvel de cobertura, representado no Roteiro de Teste deve exibir o seu respectivo Re-
completo ou reduzido, que dever ser alcanado pelos testes. Tem sultado Esperado, para que o testador confronte com o resultado
como finalidade fornecer uma viso geral do projeto, contendo as obtido na execuo dos testes.
diretrizes que possibilitaro a execuo do Processo de Teste. Ele c) Executar: durante a execuo da terceira fase do ciclo de vida
responsvel pela definio de todo o escopo dos testes, possibi- do processo so gerados os artefatos Relatrio de Bugs e Resultado
litando que os mesmos possam ser repetidos e controlados. do Teste, detalhados a seguir:
Esse artefato representa todo o planejamento para a execuo do Relatrio de Bugs: utilizado para registrar qualquer ocorrn-
teste, incluindo os recursos (pessoas, software, hardware), estratgias, cia no projeto de teste que requeira algum tipo de investigao.
cronograma das atividades e as funcionalidades que sero testadas. O uso mais comum desse relatrio para controlar os defeitos
Ao passar dos anos algumas normas surgiram com o objetivo ocorridos durante os testes, e deve ser encaminhado para a equipe
de definir padres para a documentao de um Plano de Teste, de desenvolvimento tomar as providncias cabveis;
estipulando a estrutura e as sees que este artefato deve conter, Resultado do Teste: utilizado para a formalizao dos resul-
por exemplo: QAI, PMBOK e IEEE829. A mais utilizada a norma tados obtidos na execuo dos testes a cada iterao do ciclo de
IEEE829, que possui as sees relacionadas na Tabela 2. desenvolvimento do sistema.
d) Entregar: na ltima etapa do ciclo, as informaes relevantes
Sees da Norma IEEE829 extradas durante a execuo dos testes so armazenadas atravs
1) Identificador 6) Introduo 11) Itens de Teste do artefato comentado a seguir:
2) Features a testar 7) Abordagem 12) Critrios de Liberao Sumrio de Teste: este artefato organiza e apresenta uma anlise
3) Critrios de Suspenso 8) Entrega do Teste 13) Tarefas do Teste resumida dos Resultados do Teste, juntamente com as principais
4) Ambiente 9) Responsabilidades 14) Treinamentos medidas para reviso e avaliao do projeto. Normalmente esse
5) Cronograma 10) Risco e Contingncia 15) Aprovao relatrio finaliza os testes.
Tabela 2. Sees da Norma IEEE829
Durante a execuo das atividades do Processo de Teste, os
Para elaborar um Plano de Teste, verifique as sees sugeridas artefatos produzidos devem ser armazenados em um repositrio
pelas normas e guias, e monte o modelo que mais se enquadra s nico, acessvel a todos os envolvidos no projeto. Isso possibilitar
necessidades do seu projeto. um acompanhamento da evoluo dos trabalhos realizados por
b) Projetar: a fase onde testes so criados, sendo responsvel todos os participantes da equipe testes.
pela gerao dos artefatos discutidos a seguir:
C asos de Teste: um conjunto de entradas, sadas e resultados Papis
esperados que tem como objetivo identificar as condies que A rea de Teste de Software possui nomenclaturas definidas para
sero verificadas e validadas no projeto. Em outras palavras, o os principais papis envolvidos no Processo de Teste, como pode
artefato que estabelece o que ser testado no software. ser verificado na Figura 3. Os papis tm a funo de organizar
Os Casos de Teste so utilizados basicamente para listar um nme- as responsabilidades de execuo de cada atividade, alm de
ro adequado de testes que englobem as principais funcionalidades definir quem ir gerar os artefatos do teste. No entanto, para que
do software, e possuem basicamente a seguinte estrutura: seja possvel colocar em prtica todas as atividades do processo,
- Ttulo: nome sucinto que define o que ser executado no Caso importante levar em considerao as habilidades exigidas por
de Teste; cada um. Faamos uma anlise sobre eles:
- Pr-Condio: estado obrigatrio do sistema antes do incio Gerente de Teste: o responsvel por todos os assuntos rela-
do teste. Isto , o que precisa ser realizado para que seja pos- cionados ao Teste de Software. Normalmente quem define a

72 Java Magazine Edio 101


poltica de teste adotada na organizao, incluindo planejamento, funo inicial da hierarquia do teste. ele quem elabora os Casos
documentao, controle e monitoramento dos testes, aquisio de de Teste que sero executados pelo Testador. Em alguns casos,
ferramentas, participao em inspees e revises do trabalho de pe a mo na massa e executa os testes. Para exercer esse papel
teste. Para exercer esse papel algumas caractersticas so funda- algumas caractersticas so fundamentais, como por exemplo:
mentais, como por exemplo: - Boa capacidade de visualizar, articular e resolver problemas;
- Bom conhecimento dos aspectos do Processo de Teste de - Conhecimento em falhas comuns em softwares.
Software; Testador: tambm conhecido como Homologador ou Tester, o
- Habilidades de planejamento e gerenciamento de atividades. profissional que tem como responsabilidade principal executar os
testes planejados pelo Analista de Teste e, se for o caso, reportar os
erros encontrados. Para exercer esse papel algumas caractersticas
so fundamentais, como por exemplo:
- Conhecimento das abordagens e das tcnicas de teste;
- Capacidade para diagnosticar e resolver problemas.

A definio dos papis bem clara, mas vlido frisar que os pa-
pis do Teste de Software so adaptveis realidade das empresas.
Alm disso, apesar de no ser recomendvel, no existe objeo
para que uma pessoa assuma mais de um papel no projeto.

Responsabilidades
A definio das responsabilidades de execuo das atividades
de teste vem logo aps a seleo dos papis participantes do ciclo
de vida do processo. O objetivo determinar as atribuies de
Figura 3. Hierarquia dos Papis do Processo de Teste de Software cada componente da equipe.
Essa estruturao permite que as atividades estejam bem dividi-
Lder de Teste: tambm intitulado Coordenador de Teste, o das entre o time do teste. A Tabela 3 lista a matriz de responsabi-
profissional responsvel pela organizao dos testes. ele quem lidades de acordo com cada papel do Processo de Teste.
estima os esforos, os recursos e o tempo de teste. tambm quem
cria e mantm o artefato Plano de Teste e atribui as tarefas para Papel Responsabilidade
os demais membros da equipe. Para exercer esse papel algumas - Executar os Casos de Teste
caractersticas so fundamentais, como por exemplo: Testador - Registrar os bugs
- Experincia em liderana e vasto conhecimento sobre tcnicas - Elaborar o relatrio dos defeitos encontrados
e ferramentas de teste; - Identificar o objetivo do teste
Analista de
- Elaborar os Casos de Teste e o Roteiro de Teste
- Habilidades interpessoais, principalmente diplomacia e defesa. Teste
- Preparar a Massa de Teste
Arquiteto de Teste: tambm chamado de Engenheiro de Teste,
Automatiza-
responsvel pela criao e manuteno de toda a infraestrutura - Elaborar os Scripts de Teste
dor
de teste, que inclui o ambiente, a arquitetura e as ferramentas. - Definir e manter a Arquitetura de Automatizao dos Testes
Para exercer esse papel algumas caractersticas so fundamentais, Arquiteto de
- Identificar os mecanismos de Testabilidade
Teste
como por exemplo: - Preparar e manter o Ambiente de Teste
- Capacidade em diagnosticar e resolver problemas do ambiente; - Elaborar o Plano de Teste
- Conhecimento sobre a instalao e configurao das ferramen- Gerente de - Assegurar o Gerenciamento e o Planejamento apropriados
tas voltadas para o Teste. Teste para os testes
- Elaborar o Sumrio de Teste
Automatizador: conhecido tambm como Analista de Teste
de Automao, quem transforma os Casos de Teste elaborados Tabela 3. Matriz de Responsabilidades dos Papis do Processo de Teste
pelo Analista de Teste em scripts automatizados. Alm de auto- Uma grande vantagem de atribuir a responsabilidade a cada papel
matizar os testes funcionais, tambm responsvel pelos testes evitar incertezas na execuo das atividades por parte dos envolvidos.
de desempenho, performance e carga. Para exercer esse papel Pensando nisso, a Tabela 4 apresenta a responsabilidade de cada
algumas caractersticas so fundamentais, como por exemplo: papel distribuda pelas fases do ciclo de vida do Processo de Teste.
- Domnio sobre linguagens de programao; Ademais, para que seja possvel obter sucesso, a equipe envolvida
- Conhecimento de diversas tcnicas e tipos de teste. nos Testes deve ser devidamente capacitada para exercer a funo
Analista de Teste: tambm intitulado Analista de Homologao definida. A competncia tcnica precisa ser avaliada e determinada
ou Projetista de Teste, tem como premissa ser mais experiente que de acordo com o nvel e a complexidade do projeto. Caso contrrio,
o Testador, ou seja, chega a ser primordial que tenha exercido a poder impactar negativamente no resultado final do processo.

Edio 101 Java Magazine 73


Processo de Teste de Software

Etapas Lies Aprendidas: realizar um balano geral dos testes execu-


Papel tados, analisando as conquistas e desafios, possibilita que as lies
Planejar Projetar Executar Entregar
aprendidas e armazenadas sejam utilizadas em projetos futuros,
Testador Apia Apia Executa Apia
Analista Apia Executa Executa Apia
evitando que os erros sejam repetidos e permitindo que os acertos
Automatizador Apia Executa Executa Apia sejam aprimorados, aumentando a qualidade e diminuindo os
Arquiteto Executa Executa Apia Apia custos e os riscos do software.
Gerente Executa Apia Apia Executa
Tabela 4. Papis responsveis pela execuo das etapas Concluso
A utilizao de um Processo de Teste contribui para melhorar a
Melhores Prticas efetividade e eficincia do teste em um projeto, agregando confian-
Determinadas prticas so consideradas boas ou at mesmo mais a e credibilidade ao software. No entanto, para que seja possvel
teis que outras, no entanto, essa definio depende diretamente do colher esses frutos, preciso um acompanhamento prximo de
contexto do projeto. Em funo disso, visando melhoria do processo, todas as fases do ciclo de vida. Pode ser que mesmo conduzindo
a busca pelas melhores prticas deve ser contnua e permanente. de perto os testes, surjam presses que impactaro diretamente no
Para exemplificar, foram selecionadas algumas boas prticas j rumo do processo implantado. Essa situao possivelmente far
carimbadas no mercado de teste que podem ser teis em diferentes com que nem todas as atividades planejadas sejam executadas. Para
realidades de projeto, como demonstradas a seguir: amenizar o impacto na qualidade final do projeto, a anlise de riscos
Checklists: ao longo de todo o Processo de Teste de Software, a e a definio de estimativas tornam-se imprescindveis.
utilizao de um checklist pode trazer grandes vantagens, agre- Aprender com os erros, aprimorar os acertos, adotar uma gesto
gando qualidade e tornando mais fcil a realizao dos testes. O de defeitos, ter uma equipe qualificada, utilizar tcnicas e ferra-
objetivo evitar o esquecimento, os erros e as falhas durante a mentas voltadas para a necessidade do projeto, tambm so fatores C

execuo das tarefas atribudas; fundamentais para obter o sucesso no processo.


M
Estimativas: apesar de muitos taxarem como uma atividade vlido ressaltar que independente dos percalos encontrados
complexa de se realizar, a estimativa tem fundamental importncia ao longo do caminho, a implantao de um Processo de Teste Y

dentro do Processo de Teste. Afinal, para garantir a execuo dos contribui bastante para a melhoria do software, tornando o teste CM

testes necessrio que haja tanto um planejamento quanto um ge- organizado e controlado atravs da definio de um escopo pr- MY

renciamento dos mesmos. Para isso, importante que seja definida prio. No entanto, para que seja possvel garantir o xito, alm de
CY
uma estimativa mais prxima do tempo realmente necessrio para caminhar em paralelo com o ciclo de desenvolvimento, o processo
realizao dos testes, o que ir propiciar um melhor gerenciamento deve ser revisto continuamente. O objetivo ampliar a sua atuaoCMY

das atividades, possibilitando um maior controle do processo; e aprimorar as lies aprendidas, possibilitando cada vez mais K

Metodologias: busque agregar a utilizao de normas, tcnicas, controle das atividades de teste no projeto.
modelos e metodologias no Processo de Teste. Isso ir contribuir
bastante na busca pela melhoria contnua; Renata Eliza
Anlise de Riscos: analisar os possveis riscos do processo en- renataeliza@gmail.com - @RenataEliza
volve a identificao das ameaas mais provveis em conjunto com Atua na rea de Teste de Software h mais de seis anos. Tecnloga em
o exame das vulnerabilidades relacionadas ao software. Combina Processamento de Dados, MBA em Teste de Software e ISTQB Certified
a probabilidade de ocorrncia de uma falha com a gravidade e o Tester Foundation Level. Mantm o blog www.asespecialistas.blog.com.
grau de prejuzos que os danos podero acarretar. Visando mi-
nimizar os possveis problemas, a utilizao da anlise de riscos Vivian Lagares
pode reduzir os custos do projeto e garantir mais qualidade ao vivian.lagares@gmail.com - @VivianLagares
software, ao priorizar os testes nos pontos mais relevantes; Atua na rea de Teste de Software h mais de sete anos. Tecnloga
Gesto de Defeitos: para um bom desempenho dos testes, em Processamento de Dados, ps-graduada em Gesto de Projetos
um importante fator o registro e o acompanhamento dos bugs. pelo IETEC, MBA em Teste de Software e ISTQB Certified Tester Founda-
Porm, apenas descobrir os defeitos no suficiente, preciso tion Level. Tambm mantm o blog www.asespecialistas.blog.com.
administr-los. Utilizar o gerenciamento de defeitos no Processo
de Teste possibilita que os riscos sejam minimizados, controlados, D seu feedback sobre esta edio! Feedback
eu
evidenciados e o seu impacto no seja grande para o projeto;
s

A Java Magazine tem que ser feita ao


D

Equipe: deixe os papis e responsabilidades claramente definidos seu gosto. Para isso, precisamos saber
sobre e

dentro do processo, para que cada membro do time saiba a sua fun- o que voc, leitor, acha da revista!
s

ta
edio
o. Alm disso, lembre-se das caractersticas que um profissional de
D seu voto sobre este artigo, atravs do link:
teste deve ter. Algumas delas so fundamentais para o desempenho
de um bom trabalho. Priorize os profissionais com perfil investigador, www.devmedia.com.br/javamagazine/feedback
criativo, questionador, detalhista, proativo e comprometido;

74 Java Magazine Edio 101


Edio 101 Java Magazine 75

Vous aimerez peut-être aussi