Professional Documents
Culture Documents
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
Vdeos
3 3 vdeo-aulas sobre JPA e JSF.
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
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
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.
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
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.
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
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-
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.
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,
- O projeto recm-criado no Eclipse oferece suporte da IDE ao Maven, mas algumas Listagem 3. Arquivo de configurao do Servlet container, web.xml.
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.
- 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.
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>
Listagem 14. Cdigo da pgina index.xhtml. Listagem 15. Cdigo da classe base dos nossos managed beans, BaseBean.
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
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
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.
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
mento de servlets
Adam Victor Nazareth Brandizzi
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());
} }
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,
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:
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. }
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
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
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.
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.
es do Dojo Toolkit
enriquecer o visual de
seus formulrios web
utilizando recursos
desta biblioteca
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.
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
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.
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.
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.
ta
edio
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.
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-
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
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.
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
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
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
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.
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
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.
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.
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
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.
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();
}
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
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.
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
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
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.
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.
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.
import java.util.*;
import javax.ejb.*;
import javax.persistence.*;
@Stateless
@TransactionAttribute(TransactionAttributeType.MANDATORY)
public abstract class CrudServiceBean {
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
page--;
seu gosto. Para isso, precisamos saber
sobre e
}
} o que voc, leitor, acha da revista!
s
ta
public int getPageSize() {
edio
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.
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!.
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!
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 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.
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
mvn site
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:
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
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.
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;
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:
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.
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
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;