Você está na página 1de 40

Sumrio

Tutorial, Core

Core, Web

Banco de Dados/Persistncia, Minicurso

Tutorial, Core

Boas Prticas, Tutorial

05 Revisando Estruturas de Repetio

Conhea as principais estruturas de repetio do Java


[ Mauro Pichiliani ]

11 Minha primeira aplicao web com JSF


Como utilizar JSF 2 em uma aplicao Java para web
[ Luiz Sanches ]

17 Java Database Connectivity (JDBC)


Persistindo dados em Java Parte 2
[ Paulo Csar Coutinho ]

24 Aprendendo POO e Java

Explore POO e Java de maneira interativa e visual com Greenfoot


[ Ilis Cavalcante ]

32 Dicas de Produtividade com IDEs

Como aproveitar as funcionalidades do NetBeans e Eclipse


[ Ronaldo Caldas da Silva ]

[Tutorial] Artigo no estilo tutorial passo-a-passo.


[Core] Tcnicas Server-side, ferramentas, IDEs, e outros assuntos
que fogem s demais categorias.

Ol, eu sou o DevMan! Desta pgina em diante, eu estarei lhe


ajudando a compreender com ainda mais facilidade o contedo
desta edio. Ser um prazer contar com sua companhia!
Confira abaixo o que teremos nesta revista:

[Banco de Dados/Persistncia] Artigo sobre o universo de


persistncia de dados.
[Web] Artigos sobre ou que envolvam tcnicas de desenvolvimento para WEB.

[Minicurso] Srie de artigos apresentando o desenvolvimento


de aplicaes e/ou o ensinamento de tecnologias Java.

Editorial

ps as duas primeiras edies, avanaremos um pouco mais na linguagem


e apresentaremos o primeiro artigo sobre uma das grandes foras do Java, o

Ano I Edio 03 2010

desenvolvimento web. Antigamente, tudo que um desenvolvedor iniciante

gostaria de fazer, era criar sua primeira aplicao desktop. Hoje, o principal objetivo
implementar a primeira aplicao voltada para a web.
Neste contexto, Minha primeira aplicao web com JSF expe, de forma simples,
como encarar o desafio de criar sistemas que possam ser acessados de qualquer lugar do

Edio

mundo. Para isso, adotaremos a tecnologia mais utilizada neste segmento, o JavaServer

Editor

Faces. Para enriquecer o contedo abordado, veja o vdeo desta matria, que ensina os

Eduardo Spnola (eduspinola@gmail.com)

primeiros passos no desenvolvimento web com a IDE NetBeans.


Na Easy Java Magazine de nmero 2, iniciamos um minicurso sobre JDBC, e agora

Arte
Capa e Diagramao Romulo Araujo (romulo@devmedia.com.br)

Produo
Gerncia de Marketing Kaline Dolabella (kalined@terra.com.br)
Jornalista Responsvel Kaline Dolabella - JP24185
Reviso e Superviso Thiago Vincenzo (thiago.v.ciancio@devmedia.com.br)
Coordenao Geral Daniella Costa (daniella@devmedia.com.br)

Atendimento ao leitor

vamos conclu-lo. Assim, voc conhecer praticamente tudo o que precisa saber sobre este
tema que representa uma base to importante para os mecanismos de persistncia. Em
Java Database Connectivity Parte 2, criaremos as ltimas funcionalidades e a interface
com o usurio da nossa agenda de contatos. Alm disso, na vdeo aula, demonstraremos
como tirar proveito de statements pr-definidos para parametrizar nossas queries e evitar
SQL Injection.
Agora, que tal conhecer as estruturas de repetio? Revisando Estruturas de Repetio
destaca outro ponto indispensvel a qualquer programador. O domnio sobre este tema

A DevMedia possui uma Central de Atendimento on-line, onde voc pode


tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um de
nossos atendentes. Atravs da nossa central tambm possvel alterar dados
cadastrais, consultar o status de assinaturas e conferir a data de envio de suas
revistas. Acesse www.devmedia.com.br/central, ou se preferir entre em
contato conosco atravs do telefone 21 3382-5038.

possibilitar a codificao de sistemas evitando a repetio de cdigo. No vdeo deste

Publicidade

e qualidade em nossos cdigos, uma IDE robusta fundamental. E foi pensando nisso

artigo veremos, na prtica, como usar as principais opes que a linguagem oferece.
Um assunto ainda pouco comentado em nossas pginas digitais o ambiente de
desenvolvimento. Se para iniciarmos os estudos recomendado por as mos na massa
em ferramentas que no forneam tantas funcionalidades, para alcanar desempenho

Cristiany Queiroz

que elaboramos o contedo Dicas de Produtividade com IDEs, onde veremos como

publicidade@devmedia.com.br 21 3382-5038

aproveitar alguns recursos do NetBeans e do Eclipse.

Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia, voc


divulga sua marca ou produto para mais de 100 mil desenvolvedores de todo o
Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com detalhes sobre
preos e formatos de anncios.

Orientada a Objetos e Java de maneira interativa e visual. O Greenfoot , atualmente, o

A ltima matria, Aprendendo POO e Java, nos ensina como estudar a Programao
ambiente que mais vem sendo utilizado para isso. Se voc no se sente a vontade com
termos como abstrao, herana, interface, polimorfismo, entre outros, aps conhecer
esta ferramenta, programar se tornar muito mais simples e divertido.
Deste modo, chegamos ao final da terceira edio da Easy Java.
Boa leitura e at a prxima!

Fale com o Editor!


muito importante para a equipe saber o
que voc est achando da revista: que tipo
de artigo voc gostaria de ler, que artigo voc
mais gostou e qual artigo voc menos gostou.
Fique a vontade para entrar em contato com
os editores e dar a sua sugesto!
Se voc estiver interessado em publicar

Eduardo Oliveira Spnola


um artigo na revista ou no site Easy Java
Magazine, entre em contato com o editor,
informando o ttulo e mini-resumo do tema
que voc gostaria de publicar:
Eduardo Spnola - Editor da Revista
eduspinola@gmail.com

eduspinola@gmail.com
twitter.com/Java_Magazine

Revisando Estruturas de
Repetio
Mauro Pichiliani

programao de computadores
normalmente requer que o profissional seja capaz de manipular
com preciso diversas estruturas, comandos e recursos especficos das linguagens
de programao. Dentre os diversos comandos disponveis preciso conhecer e
saber manipular bem aqueles que alteram
o fluxo de execuo dos programas, sendo as estruturas de repetio o principal
recurso para o programador reaproveitar
diversas linhas do seu cdigo fonte.
Este artigo tem como objetivo apresentar
uma reviso das principais estruturas de
repetio do Java para quem est comeando a programar nesta linguagem de programao e ainda est se familiarizando
com a forma de estruturar logicamente um
programa. O artigo discute o conceito das
estruturas, seus usos, implicaes, riscos e
tambm detalhes especficos das sintaxes
destas estruturas no Java.

Estruturas de repetio
Antes de comear a tratar sobre as
estruturas de repetio importante
compreender corretamente um conceito
fundamental para qualquer profissional
que deseja trabalhar com a linguagem de
programao Java: o conceito de fluxo de
execuo.
O fluxo de execuo abordado logo
no incio dos cursos de introduo programao ou de lgica de programao.
A compreenso correta deste conceito
muito importante, pois uma vez que o
aluno saiba bem como o programa ser
executado ele deve ser capaz de estruturar seus algoritmos baseados em uma
sequncia lgica de passos. Normalmente
a apresentao de algoritmos, fluxos de
execuo e sequncia de passos so realizados por meio de solues sistemticas
para problemas do dia a dia, como trocar

Resumo DevMan
De que se trata o artigo:
Apresenta uma discusso de diversos aspectos relacionados utilizao de estruturas de repetio para
quem est comeando a trabalhar com Java.

Para que serve:


O contedo apresentado neste artigo serve como um guia para auxiliar tanto professores de programao como alunos iniciantes.

Em que situao o tema til:


O tema til para aqueles que esto ministrando ou participando de um curso introdutrio de Java e
desejam revisar o conceito de estruturas de repetio.

um pneu de um carro, tarefas a


serem realizadas aps acordar,
preparao de uma receita culinria, etc. A Figura 1 mostra um
exemplo inicial de algoritmo em
linguagem natural que descreve
os passos para a realizao de uma
ligao telefnica em um telefone
pblico.
O algoritmo apresentado na
Figura 1 apresenta trs tipos im- Figura 1. Exemplo de algoritmo e fluxo de execuo
portantes de controle de fluxo: a)
sequencial, representado pelos passos de
Apesar de existirem variaes, como
1 a 4; b) desvio condicional, representado
as execues simultneas de mais de
pelos passos 5 e 6; e c) Repetio, represenum fluxo encontradas em algoritmos de
tado pelo passo 6.1.
programao concorrente, as trs setas
A partir do conceito de fluxo de execuapresentadas na Figura 2 demonstram
o e de passos lgicos possvel montar
como os passos de um algoritmo podem
diversos algoritmos para resolver um
ser executados. Obviamente, possvel
problema. Como pode ser visto pelas setas
da Figura 1, o fluxo de execuo sequencial pode ser alterado por uma estrutura
de desvio, como o passo 5, ou por uma
estrutura de repetio. Em geral, os trs
tipos de fluxo de execuo mais comuns
(sequencial, desvio e repetio) encontrados em um algoritmo so mostrados na
Figura 2, onde os fluxos so representados
por setas.

Edio 03 Easy Java Magazine

Revisando Estruturas de Repetio

Figura 2. Trs tipos possveis de fluxo de execuo em um


algoritmo

Figura 3. Um loop 360 de uma montanha russa


combinar e encadear os trs tipos de fluxo,
porm neste artigo nos concentraremos
apenas no fluxo repetitivo de execuo.
Quando falamos sobre programas natural implementar a lgica definida do algoritmo em uma linguagem de programao
e isso vale tambm para a forma de controlar o fluxo de execuo. As linguagens
de programao mais utilizadas, como o
Java, contam com estruturas de repetio
para permitir ao desenvolvedor reutilizar
linhas de cdigo por meio da repetio
do fluxo de execuo do programa. comum utilizar o termo loop para se referir
a uma estrutura de repetio genrica e
no entrar nos seus detalhes internos de
funcionamento, como o uso de variveis
contadoras, limites, etc. A propsito, o uso
do termo loop uma referncia estrutura
de uma montanha russa que faz com que
seus ocupantes percorram um crculo
completo, ou seja, 360, como mostrado
na Figura 3.
Cada linguagem de programao possui
estruturas de controle implementadas por
meio de comandos especficos ou palavras
chaves da linguagem como, por exemplo,

6 Easy Java Magazine Edio 03

loop, while, for, do, do while, etc. Antes de


comear a falar especificamente sobre os
comandos do Java para implementar estruturas de repetio importante tirar um
pouco as mos do teclado e refletir sobre a
importncia, implicaes e consequncias
do uso de estruturas de repetio.
A principal importncia a reutilizao
do cdigo. Com estruturas de repetio
pode-se executar a mesma linha de programao mais de uma vez. Isso algo comum desde a linguagem de mquina mais
bsica, como o assembly, at as linguagens
(ou outras maneiras de se programar o
computador) mais recentes. Alm disso,
tambm possvel executar diversas vezes a mesma linha de programao com
uma pequena variao em cada execuo
que indique qual o nmero da vez que
se est executando. Este recurso muito
poderoso e, sob um ponto de vista fundamental, as nfimas velocidades com as
quais os processadores mais atuais conseguem executar instrues o que permite
ao computador realizar o trabalho braal
de repetio e nos auxiliar em todas as
tarefas que realizamos por meio do uso
de um software.
Porm aqui vale o velho ditado: com
grandes poderes vm grandes responsabilidades. Se o programador no souber
utilizar com responsabilidade o poder
de uma estrutura de repetio ele pode
sofrer graves consequncias. Talvez a
consequncia mais comum decorrente do
uso incorreto de uma estrutura de repetio conhecida como loop infinito, ou
seja, o programador no especificou nem
a quantidade mxima de repeties na
estrutura de repetio e nem uma condio
possvel para que o loop seja terminado.
Deste modo o programa, em teoria, ficar
repetindo o mesmo conjunto de instrues
indefinidamente. Nos tempos primordiais
da programao de computadores isso
realmente era um problema. Hoje em dia
existem diversos meios, tanto do sistema
operacional como do ambiente de execuo
do programa, para que um programa que
esteja em um loop infinito no consuma
todos os recursos disponveis (memria,
processamento, etc.) e possa ser interrompido por um processo externo.

As implicaes do uso de estruturas de


repetio acabam envolvendo uma rea
muito importante da computao terica:
a anlise de algoritmos, ou seja, o estudo
dos algoritmos e o consumo de recursos
associado ao desempenho dos algoritmos. As estruturas de repetio afetam
diretamente o consumo de recursos do
computador, sejam eles relacionados
memria, processamento, ou armazenamento em disco. Atualmente j existem
muitas teorias e estudos que abordam
tanto classificaes de algoritmos (quadrtico, exponencial, NP: no determinstico
polinomial, etc.) quanto tcnicas para que
os algoritmos consumam menos recursos
(dividir e conquistar, programao dinmica, algoritmos probabilsticos, etc.). De
qualquer forma, o uso correto de estruturas de repetio pode fazer a diferena
entre um programa que executado em
poucos segundos e um programa que
demora dias, semanas ou meses para
finalizar a sua execuo.
Vale a pena mencionar tambm que a
utilizao de uma estrutura de repetio
geralmente acompanhada de uma estrutura de dados como uma lista, matriz, array,
arraylist, vetor, ou outra estrutura interna
da linguagem de programao que permite
a manipulao de diversos tipos de dados
agrupados. muito comum utilizar uma
estrutura de repetio para percorrer os
elementos da estrutura de dados ou para realizar alguma operao para cada elemento
tais como leituras ou gravaes dos valores
armazenados. Estruturas de repetio tambm permitem a criao de blocos de cdigo
delimitados e quase sempre so utilizadas
junto com as estruturas condicionais, seja
para especificar a quantidade mxima de
repeties ou para indicar que aps certo
nmero de repeties preciso fazer algum
conjunto de instrues de forma diferente.
O termo iterao utilizado para indicar
cada ciclo da estrutura de repetio, visando enumerar a quantidade de vezes que o
bloco dentro da estrutura j foi utilizado.
Por exemplo, se o fluxo do programa est
na iterao cinco isso quer dizer que o
bloco de instrues dentro da estrutura j
foi executado quatro vezes e esta a quinta
execuo do bloco.

Estruturas de repetio em Java


Aps conhecer a teoria das estruturas de
repetio, veremos quais so os principais
comandos em Java que implementam este
recurso. Existem diversas variaes das
estruturas de repetio, porm uma das
mais simples representada pelo comando
while. Este comando requer uma expresso
booleana que ser verificada antes de cada
iterao ser iniciada. Note que o comando
while no possui nenhum tipo de contador
associado e se o programador necessitar
de um contador ele deve implement-lo
por meio de uma varivel adequada. A
Listagem 1 apresenta um exemplo de um
programa em Java que faz uso de um comando while. Este programa gera nmeros
aleatrios entre 0 e 4 e os imprime na tela
enquanto os nmeros aleatrios gerados
forem diferentes de 0.
No exemplo apresentado pela Listagem 1
a expresso booleana utilizada no comando while verificada antes do fluxo de
execuo entrar na primeira iterao de
modo que, dependendo do valor gerado
pela expresso colocada na varivel valor,
possvel que nenhuma iterao seja realizada. Nota-se que este exemplo no utiliza
uma varivel contadora e que a quantidade
de iteraes efetivamente realizada pelo
programa incerta at o momento da
execuo. Existem variaes do comando while que permitem a execuo de ao
menos uma iterao, pois a verificao
da expresso booleana colocada aps o
bloco de instrues.
Para situaes onde a quantidade de iteraes da estrutura de repetio conhecida, ou pelo menos se tem uma noo desta
quantidade, recomendada a utilizao
da estrutura de repetio for, que possui
uma varivel contadora associada. Deve-se
indicar uma inicializao desta varivel,
a expresso booleana que ser verificada
antes do incio de cada iterao e tambm
o passo que atualiza a varivel contadora.
comum utilizar no passo um incremento
ou decremento representados pelos operadores unrios ++ e --, respectivamente,
colocados junto varivel contadora. A
Listagem 2 contm um exemplo de um
programa que utiliza um contador for da
seguinte maneira: quando a quantidade

de parmetros passadas na linha de execuo do programa em Java for maior que


zero o programa mostrar uma contagem
a partir de 0 e indo at o nmero representado pelo valor numrico do primeiro
parmetro menos uma unidade. Nota-se
que neste caso, e em muitas situaes onde
se utiliza uma varivel contadora para
percorrer uma estrutura de dados, o valor
do contador inicia em 0 e termina com o
nmero total de elementos da estrutura de
dados menos 1. J a Listagem 3 apresenta
um exemplo simples onde o comando for
utilizado para mostrar os valores contidos
em um vetor de inteiros. Este exemplo
mostra como a varivel contadora de um
for utilizada como ndice do vetor dentro
do bloco de cdigo a ser executado em
cada iterao.
Uma variao do comando for no Java
conhecida pelo comando foreach. Apesar
de se utilizar a palavra chave for na codificao comum dizer que o loop um
foreach quando se utiliza a estrutura de
repetio for sem um contador numrico
e exclusivamente para percorrer elementos de uma estrutura de dados tipada. A
Listagem 4 apresenta um exemplo do uso
do comando for quando este se comporta
da maneira foreach para percorrer todos os
elementos do tipo String armazenados em
um vetor de Strings e mostr-los na tela
do console. No h grandes dificuldades
neste exemplo, porm programadores
mais tradicionais, especialmente aqueles
que j possuem uma boa experincia na
linguagem C/C++, podem demorar a se
acostumar com esta verso simplificada
do comando for.
Conforme o Java foi evoluindo novas abordagens foram utilizadas para se trabalhar
com as estruturas de repetio, especialmente quando se utiliza tal estrutura para
percorrer elementos de uma coleo. Um
dos pontos a ser destacado e que representa
uma grande dificuldade de entendimento
para quem est comeando em Java o uso
do padro de projeto Iterator.
Este padro de projeto explora uma soluo para resolver o seguinte problema:
como montar um loop com o comando for
genrico que percorra os objetos de uma
estrutura de dados sem se preocupar

Listagem 1. Exemplo simples do comando while


em Java

public class Aleatorio


{
public static void main(String arg[])
{
int valor = (int)(Math.random()*5);

while(valor != 0)
{
valor = (int)(Math.random()*5);
System.out.println(Valor igual a + valor);
}

Listagem 2. Demonstrao simples do comando


for em Java

public class ExemploFor


{
public static void main(String[] args)
{
if (args.length > 0 )
{
for(int j=0; j<Integer.parseInt(args[0]); j++)
{
System.out.println( + j + );
}
}

System.out.println(Fim da Contagem);

System.out.println(Fim do programa);

Listagem 3. Exemplo de uso do comando for para


percorrer um vetor

class ExemploFor2
{
public static void main(String arg[ ])
{
int A[] = new int[3];
A[0] = 50;
A[1] = 100;
A[2] = 150;
System.out.println(Tamanho do vetor =
+ A.length);
int conta;

for(conta = 0; conta< A.length ; conta++)


{
System.out.println(indice = + conta +
valor= + A[conta] );
}

com o tipo de dados interno da estrutura? A soluo utilizar uma classe que
implementa a interface Iterator e utilizar
os mtodos que geram um objeto genrico. Este objeto, cujo tipo de dados da
interface Iterator, ser utilizado para obter
os objetos da estrutura de dados em si e
tambm para controlar a quantidade de

Edio 03 Easy Java Magazine

Revisando Estruturas de Repetio

iteraes do loop. A Listagem 5 apresenta


um trecho de cdigo que mostra como o
padro de projeto Iterator pode ser utilizado. Este cdigo apenas um trecho de um
Padro de Projeto: Padres de projeto de software ou
padres de design de software, tambm muito conhecido pelo
exemplo incompleto, porm o conjunto de
termo original em ingls: Design Patterns, descrevem solues
classes do Java est recheado de estruturas
para problemas recorrentes no desenvolvimento de sistemas de
software orientados a objetos. Um padro de projeto estabelece
de dados que implementam o padro de
um nome e define o problema, a soluo, quando aplicar esta
projeto Iterator. O leitor que se interessar
soluo e suas consequncias. Os padres de projeto visam
mais por este assunto pode encontrar mais
facilitar a reutilizao de solues de design isto , solues
na fase de projeto do software, sem considerar reutilizao de
informaes em um dos artigos da seo
cdigo. Tambm acarretam um vocabulrio comum de design,
de referncias.
facilitando a comunicao, documentao e aprendizado dos
Outro recurso da linguagem relacionado
sistemas de software.
ao uso de loops que apresenta dificuldade
para programadores que esto iniciando
em Java o uso de genricos. Este recurso
foi adicionado recentemente ao Java e est
diretamente relacionado com o tipo de
Casting: Casting a converso de objetos ou tipos primitivos
dados de uma coleo e o que preciso
de um tipo para outro tipo. Ao se tratar casting, considera-se
fazer para percorrer esta coleo com
a necessidade de converso explcita entre tipos o que,
potencialmente, pode causar perdas de informao. Vale
uma estrutura de repetio. A principal
ressaltar que no obrigatrio fazer casting de um valor de
motivao para o uso de genricos a
um dado tipo primitivo para um tipo primitivo maior, pois esta
necessidade de se realizar casting no tipo
categoria de converso sempre permitida. Salienta-se que,
em Java, o casting de tipos primitivos aplicvel a todos, exceto
de dados da estrutura quando era preciao tipo boolean (para o qual, no se pode fazer casting de um
so recuperar os dados da coleo. Desta
boolean para qualquer outro tipo e vice-versa)
maneira havia uma probabilidade muito
grande do programador cometer um
erro, uma vez que o compilador do
Listagem 4. Uso do comando for para percorrer objetos no
estilo foreach
Java no faz verificao dos tipos de
dados na compilao quando se utiliza
public class ExemploForeach
{
o casting. Com o uso de genricos as
public static void main(String[] args)
colees devem ser tipadas, ou seja,
{
String[] nomes = { Altrano, Beltrano,
deve-se utilizar estruturas de dados

Nota do DevMan

Nota do DevMan

Celtrano, Deltrano };

que no sejam genricas e sim que j


contenham o tipo correto. A Listagem 6
mostra um trecho de cdigo de exemplo
onde se utiliza genricos para percorrer
uma estrutura de dados. Novamente, o leitor que deseja se aprofundar em genricos
pode encontrar mais informaes em um
dos artigos da seo de referncias.
For fim, vale a pena lembrar que o uso de
uma estrutura de repetio tambm pode
ser representada dentro de um diagrama
de sequncia da UML. Por exemplo, a
Figura 4 mostra como um loop que percorre todos os elementos de uma estrutura
de dados representado no diagrama de
sequncia. O objeto chamado render da
classe e OpenGLRender e, de acordo com o
diagrama, durante o seu ciclo de vida
preciso percorrer todos os elementos retornados pela chamada do mtodo models().
Este loop est numerado como 2: foreach
models() no diagrama e representado
por uma seta que sai do fluxo de execuo
do objeto render e volta para ele mesmo.
Nota-se tambm que a especificao do
loop no ciclo de vida do objeto adiciona um
novo retngulo que colocado ao lado direito do retngulo original que representa
o fluxo do ciclo de vida do objeto.
A Figura 5 mostra outro diagrama de
sequncia que contm uma referncia a
um loop. Desta vez o objeto aCustomer, que

// Percorrendo os elementos do tipo String


armazenados
// no vetor nomes
for( String s : nomes )
{
System.out.println(s);
}

Listagem 5. Trecho de cdigo que exemplifica o uso do


padro de projetos Iterator.

ObjectGroup groupOfObjects = new ObjectGroup ();


Iterator it = Iterator.iteratorFor ( groupOfObjects ) ;
// O mtodo hasMore() retorna verdadeiro se houver
mais elementos ou
// falso caso contrrio
while ( it.hasMore() )
{
// O mtodo current() retorna um objeto genrico, que
precisa ser convertido
// para o objeto que compe os membros da coleo
Object obj = it.current();

8 Easy Java Magazine Edio 03

Figura 4. Exemplo de representao de um loop em um diagrama de sequncia

Listagem 6. Trecho de cdigo que exemplifica o uso de genricos

// Obtm a coleo Fazendeiro que dono de galinhas


Fazendeiro ze=new Fazendeiro(fazenda);
// Obtm o objeto galinhas da interface Iterator j tipado para o objeto
Galinha
Iterator<Galinha> galinhas =ze.pegarGalinhas();
// O mtodo hasNext() retorna verdadeiro se houver mais elementos ou
// falso caso contrrio
while(galinhas.hasNext())
{
// O mtodo next() retorna um objeto j tipado da classe galinhas
Galinha galinha=galinhas.next(); // sem fazer casting

representa um cliente em um modelo de


vdeo locadora, deve fazer um loop para
obter todos os itens que esto alugados
pelo cliente em algum momento do ciclo
de vida do objeto aCustomer. O loop representado no diagrama pela seta que aponta
para o prprio fluxo de execuo e pelo
texto * [for all rentals]. Notem que nos
exemplos dos diagramas das Figuras 4 e 5
nenhuma indicao fornecida a respeito
de qual comando, contador, objeto ou tipo
de dados deve ser utilizado, pois os diagramas da UML so utilizados em um nvel
de abstrao maior. Os detalhes tcnicos
utilizados para implementar o loop em Java
que correspondam ao que foi modelado no
diagrama devem ser tratados diretamente
por quem foi realizar a codificao.

Exerccios de fixao
Para auxiliar o leitor que est comeando
a programar em Java, este artigo apresenta
trs exerccios de fixao do contedo de
estruturas de repetio. Recomenda-se
que durante a resoluo destes exerccios
o leitor primeiro organize mentalmente
como o algoritmo deve ser implementado
antes de efetivamente criar o programa
em Java. Obviamente, existem diversas
maneiras para resolver um mesmo problema, e o objetivo dos exerccios aqui
colocar em prtica a habilidade de manipular estruturas de repetio assim como
outras habilidades necessrias para um
programador Java.

Figura 5. Segundo exemplo de representao de um loop em um diagrama de sequncia

1) Monte um programa em Java que verifique se um nmero de CPF fornecido vlido


ou no. A regra a seguinte: o nmero de um
CPF tem exatamente nove algarismos em
sua raiz e mais dois dgitos verificadores que
so indicados por ltimo. Portanto, um CPF
tem 11 algarismos. O nmero do CPF escrito na forma abcdefghi-jk ou diretamente
como abcdefghijk, onde os algarismos no
podem ser todos iguais entre si. Tambm
comum colocar pontos e traos no CPF desta
maneira: abc.def.ghi-jk, onde o nmero
representado pela letra j chamado 1 dgito
verificador do nmero do CPF e o nmero
representado pela letra k chamado 2 dgito
verificador do nmero do CPF.
Regra de clculo do dgito verificador j:
Para calcular o valor de j devemos multiplicar os dgitos a, b, c, d, e, f, g, h e i pelas
constantes correspondentes de acordo com
a Tabela 1.
O resultado da soma, S1 = 10a + 9b + 8c +
7d + 6e + 5f + 4g + 3h + 2i dividido por 11.
Em seguida obtm-se o RESTO da diviso
de S1 por 11 e verifica-se o seguinte:
O
dgito verificador j ser igual a zero,
se RESTO for igual a 0 ou 1;
O
dgito verificador j ser igual ao resultado da expresso numrica 11 RESTO,
se o valor de RESTO for igual a 2, 3, 4, 5, 6,
7, 8, 9 ou 10.
Regra de clculo do dgito verificador k:
Para calcular o valor de k devemos multi-

Dgito

Deve-se multiplicar por

x10

x9

x8

x7

x6

x5

x4

x3

x2

Tabela 1. Valores multiplicativos de acordo com cada dgito


para o verificador j
plicar os dgitos a, b, c, d, e, f, g, h e i pelas
constantes correspondentes de acordo com
a Tabela 2.
Note que para calcular o dgito verificador k preciso primeiro calcular o dgito
verificador j. O resultado da soma, S2 = 11a
+ 10b + 9c + 8d + 7e + 6f + 5g + 4h + 3i + 2j
dividido por 11. Em seguida obtm-se o
RESTO da diviso de S2 por 11 e verificase o seguinte:
O dgito verificador k ser igual a zero,
se RESTO for igual a 0 ou 1;
O
dgito verificador k ser igual ao resultado da expresso numrica 11 RESTO,
se o valor de RESTO for igual a 2, 3, 4, 5, 6,
7, 8, 9 ou 10.
Exemplo: Vamos verificar se o CPF
491.122.534-30 vlido. Nota: este nmero
no o CPF do autor deste artigo! Para o
clculo de j temos:

Edio 03 Easy Java Magazine

Revisando Estruturas de Repetio

S1 = (4*10) + (9*9) + (1*8) + (1*7) + (2*6) +


(2*5) + (5*4) + (3*3) + (4*2)
S1 = 40 + 81 + 8 + 7 + 12 + 10 + 20 + 9 +
8 = 195
Dividindo-se 195 por 11 obtemos o
RESTO 8 e, para este RESTO o dgito j o
resultado de [11 - RESTO], portanto, j = 3.
Para o clculo de k temos:
S2 = (4*11) + (9*10) + (1*9) + (1*8) + (2*7) +
(2*6) + (5*5) + (3*4) + (4*3) + (3*2)
S2 = 44 + 90 + 9 + 8 + 14 + 12 + 25 + 12 +
12 + 6 = 232
Dividindo-se 232 por 11 obtemos o RESTO 1 e, para este RESTO o dgito k o 0,
portanto k = 0.

Figura 6. Exemplos de nmeros triangulares e frmula para


o clculo de elementos do n-simo nmero triangular
Dgito

Deve-se multiplicar por

x11

x10

x9

x8

x7

x6

x5

x4

x3

x2

Tabela 2. Valores multiplicativos de acordo com cada dgito


para o verificador k

10 Easy Java Magazine Edio 03

Como o nmero de CPF fornecido foi:


491.122.534-30 e, pelos clculos, j=3 e k=0
temos que este CPF vlido. Dica: Utilize o
operador de mdulo (%) para o clculo do
resto da diviso e teste seu algoritmo com
os valores de diversos CPFs existentes.
2) Um nmero triangular, proposto por
Gauss em 1788 quando ele tinha somente
10 anos de idade, um nmero natural que
pode ser representado na forma de tringulo equiltero. Para encontrar o n-simo
nmero triangular a partir de um nmero
triangular anterior basta somar-lhe n unidades de acordo com a Figura 6.
Baseado nestas informaes desenvolva
um programa em Java que recebe como
parmetro o valor de n e mostre na tela do
console a representao grfica do nmero triangular. Faa um loop que coloque
o caractere . (ponto) para representar o
tringulo como se fossem as bolinhas
vermelhas da Figura 6.
3) Faa um programa em Java que capte
n valores do teclado (podem ser numricos ou no). Alm disso, obtenha pelo
teclado um nmero k. O seu programa
deve imprimir na tela todas as possveis
combinaes dos n valores organizados
em grupos com k elementos, ou seja: kn
que quer dizer a combinao de todos os n
elementos em grupos de k elementos. Por
exemplo: se forem digitados os valores: a,
b e c (n = 3) e se for digitado o valor 3 para
k, o programa deve imprimir todas as
combinaes dos valores a, b e c com trs
elementos em cada grupo sem repeties
de grupos, como se segue:
(a,a,a) (b,a,a) (c,a,a) (a,b,a) (b,b,a) (c,b,a)
(a,c,a) (b,c,a) (c,c,a) (a,a,b) (b,a,b) (c,a,b)
(a,b,b) (b,b,b) (c,b,b) (a,c,b) (b,c,b) (c,c,b)
(a,a,c) (b,a,c) (c,a,c) (a,b,c) (b,b,c) (c,b,c) (a,c,c)
(b,c,c) (c,c,c)
A resoluo dos exerccios de fixao vai
fornecer ao leitor uma oportunidade para
testar suas habilidades de programao
com as estruturas de repetio do Java.
Para auxiliar aqueles que sentirem dificuldade, o cdigo fonte com uma sugesto de
soluo para cada um dos trs exerccios
ser disponibilizado no site da Easy Java.

Concluso
Este artigo apresentou uma pequena
reviso dos conceitos relacionados s
estruturas de repetio de um algoritmo
e de um programa. O foco principal do
artigo foi apresentar os conceitos por
trs das repeties no fluxo de execuo
de algoritmos, seguido pela explicao e
detalhamento de alguns comandos em
Java que implementam as estruturas de
repetio. O artigo tambm abordou as
consequncias e implicaes do uso de estruturas de repetio, e foi finalizado com
a apresentao de trs exerccios de fixao
do contedo abordado com o objetivo de
auxiliar os leitores que esto comeando
a programar em Java.
Mauro Pichiliani
pichiliani@uol.com.br
bacharel em Cincia da Computao, mestre e doutorando
pelo ITA (Instituto Tecnolgico de
Aeronutica) e MCP, MCDBA e MCTS.
Trabalha h mais de 9 anos utilizando diversos bancos
de dados e linguagens de programao. escritor da
revista SQL Magazine e colunista do web site iMasters.
(http://www.imasters.com.br).

www.devmedia.com.br/post-9668-ArtigoJava-Magazine-16-Genericos-no-J2SE-5-0.
html
Artigo Genricos no J2SE 5.0, escrito
por Osvaldo Pinali Doederlein e publicado na
edio nmero 16 da Revista Java Magazine.
http://www.devmedia.com.br/post-9639-ArtigoJava-Magazine-26-Numeros-em-Java.html
Artigo Nmeros em Java, escrito por
Fernando Lozano e publicado na edio
nmero 26 da Revista Java Magazine.
http://www.devmedia.com.br/post-8737-ArtigoJava-Magazine-18-Colecoes-de-ponta-a-ponta.html
Artigo Colees de ponta a ponta, escrito por
Osvaldo Pinali Doederlein e publicado na
edio nmero 18 da Revista Java Magazine.

Minha primeira aplicao


web com JSF
Luiz Sanches

tecnologia Java considerada


sinnimo de robustez, segurana,
estabilidade e velocidade no que
se refere ao desenvolvimento de aplicaes
web. No entanto, para alguns desenvolvedores vindos do mundo desktop um
pouco complicado, de incio, compreender
as tecnologias envolvidas, frameworks
utilizados e principalmente o fluxo de uma
aplicao web.
Para melhorar o entendimento de como
funciona a tecnologia Java neste contexto,
vamos aplicar os conceitos do framework
JSF 2.0 em um cadastro de currculos, bem
simples, para que o leitor possa compreender com clareza o uso desse framework.

O que JSF?
JavaServer Faces um framework Java,
criado para tratar da camada de apresentao das aplicaes web. Ele possui um
grupo de tags prprias que, em substituio s tags HTML, supre o desenvolvedor
nas suas necessidades de formatao e
padronizao de cdigo. A verso 2.0 trs
mudanas significativas como: integrao
com Ajax, suporte nativo a XHTML, recursos, templates, entre outros.
Neste artigo, conheceremos o funcionamento bsico do framework, apresentando
noes fundamentais para a construo de
suas primeiras aplicaes. Para obter informaes mais avanadas sobre o assunto,
recomendamos a leitura do artigo Aprendendo JSF 2.0 com ScrumToys, publicado
na Edio 78 da Java Magazine.

A aplicao
Hoje em dia se espalham na Internet
servios de armazenamento de currculos,
alguns de graa outros no. As empresas
adotam formulrios para preenchimento
e armazenagem em banco de dados, evitando a necessidade de envio de arquivos

Resumo DevMan
De que se trata o artigo:
Neste artigo veremos a construo de uma pequena aplicao Java para web baseada no JavaServer
Faces 2.0. A finalidade da aplicao criar um cadastro com dados pessoais, contando com a verificao
dos campos, que resulta na impresso em tela dos dados captados no formulrio.

Para que serve:


Introduzir desenvolvedores que ainda no tiveram contato com JSF no desenvolvimento de aplicaes
para a web com Java.

Em que situao o tema til:


Este artigo til para mostrar a desenvolvedores iniciantes, vindos de tecnologias JSP ou Desktop, como
desenvolver aplicaes em Java para web com interfaces de usurio orientadas a componentes, de fcil
compreenso e desenvolvimento focado no framework JSF 2.

para o e-mail da mesma. Dessa forma, a


filtragem dos dados sem dvida mais
rpida para quem trabalha no setor de
Recursos Humanos, podendo cruzar
informaes at chegar ao perfil mais
adequado vaga. So com esses objetivos
que iremos trabalhar.
A primeira etapa consiste na criao de
uma interface para incluso dos dados
cadastrais do usurio. No ocorrer integrao com a base de dados devido ao
escopo do artigo estar no desenvolvimento
de nossa primeira aplicao com JSF. Ser
exemplificada a construo de um formulrio com campos do tipo texto contendo:
validaes dos campos com exibio de
mensagens e submisso do formulrio
para impresso, na tela, dos dados cadastrais do usurio.
Para este artigo, foi utilizado no ambiente
de desenvolvimento o JDK 6, Eclipse IDE
for Java EE Developers 3.6 (Helios) e o
Apache Tomcat 7.

seo Links, de acordo com seu sistema


operacional. Depois de instalados, inicie
o Eclipse para configurar o Tomcat 7. Para
que voc possa visualizar as configuraes
de servidores, mude para a perspectiva Java EE (acessando Window | Open
Perspective > Other). Na aba Servers, crie
um servidor (New > Server) a Figura 1
ilustra a seleo do servidor. Em seguida
clique no boto Next para visualizar a tela
da Figura 2, adicione o diretrio onde se
encontra instalado o Tomcat 7 e clique
em Finish.

Preparando o terreno
Obtenha o Eclipse 3.6, Tomcat 7 e JSF
2.0 a partir dos endereos disponveis na

Edio 03 Easy Java Magazine

11

Minha primeira aplicao web com JSF

Figura 1. Configurao do Tomcat 7 no Eclipse

Figura 2. Seleo do diretrio da instalao do Tomcat 7


- necessrio mudar uma opo na configurao do
servidor Tomcat para que ele funcione corretamente.
Para isso, na aba Servers d um duplo clique em
Tomcat v7.0. Em Server Locations selecione a opo
Use Tomcat installation (takes control of Tomcat
installation). Com isso, ser utilizado o diretrio de
instalao do Tomcat (/home/luiz/java/apachetomcat-7), como em nosso exemplo na Figura 2, para
que ele assuma a publicao das aplicaes. Salve e
feche a tela de configurao.

Feito isso, no Eclipse, crie um projeto


Web (File | New > Dynamic Web Project)
com o nome CurriculosJSF2. Selecione

12 Easy Java Magazine Edio 03

na rea Target runtime a opo


Apache Tomcat v7.0 e em Configuration a opo JavaServer
Faces v2.0 Project, para que
seu projeto tenha suporte do
Eclipse a JSF. Clique em Next
at chegar ltima tela do
assistente. Na opo JSF implementation Library selecione
Disable Library Configuration.
Escolhemos essa opo para
configurar as bibliotecas manualmente em nosso projeto.
O artigo segue esse caminho,
mas existem outras formas
de se configurar bibliotecas no Eclipse. Clique em
Finish.
Como o Tomcat 7 no vem
com suporte ao JSF, voc
deve obter a biblioteca do
projeto Mojarra (ver seo
Links), que se trata da implementao da SUN para
a especificao JSF. Extraia
o arquivo mojarra-2.0.x-FCSbinary.zip, depois entre no
diretrio criado para copiar
do subdiretrio lib os arquivos jsf-api.jar e jsf-impl.jar,
que so responsveis pela
implementao do JSF para
que seu projeto utilize os recursos do framework. Volte ao
Eclipse, selecione o diretrio
WebContent/WEB-INF/lib do
projeto e cole as bibliotecas.
Agora voc deve adicionar seu projeto ao servidor.
Deste modo, na aba Servers, clique com o
boto direito do mouse em Tomcat v7.0 Server e selecione a opo Add and Remove....
Na rea Available, clique no seu projeto,
adicione-o (Add >) na rea Configured e
depois finalize a tela.

hora de co dificar
A seo anterior, para quem ainda no
est acostumado, foi apenas um aperitivo
para comearmos a diverso. A seguir,
vamos tratar da edio do arquivo web.
xml, criao da classe Curriculo (Curriculo.
java) e do formulrio incluirCurriculo.xhtml,

para que possamos configurar o ambiente


bsico da aplicao e entender a interao
entre a classe Curriculo e o formulrio de
cadastro.

Edio do arquivo web.xml


O arquivo WebContent/WEB-INF/web.xml,
exibido na Listagem 1, foi criado automaticamente pelo Eclipse. Ele conhecido
como deployment descriptor e serve para
guardar informaes de configuraes da
aplicao como o mapeamento de Servlets,
por exemplo. Seu contedo foi editado
para conter o necessrio para o funcionamento de nossa aplicao. Dessa forma,
na tag <servlet-class> est sendo invocada
a classe FacesServlet, que atuar como controladora da aplicao. FacesServlet roteia as
requisies HTTP do formulrio incluirCurriculo.xhtml, direcionando-as para a
classe Curriculo, conhecida como Managed
Bean, devido a mesma ser responsvel por
gerenciar os dados disponveis na pgina
incluirCurriculo.xhtml.
A tag <url-pattern> informa que as URLs
que terminam com o padro .jsf sero encaminhadas para o servlet FacesServlet. Esse
mapeamento aciona e renderiza o arquivo
equivalente que possuir a extenso .xhtml,
no caso o incluirCurriculo.xhtml. Podemos
colocar na tag <url-pattern> outro padro,
como *.faces por exemplo. Com isso, nosso
formulrio ser acionado pela chamada
URL terminando com incluirCurriculo.
jsf. Em seguida, sero realizadas pelo
framework JSF verificaes de sintaxe no
arquivo incluirCurriculo.xhtml. Neste momento, cada tag JSF analisada para construir a rvore de componentes no servidor,
que depois envia a pgina em HTML para
renderizao no navegador.

Criao da classe Curriculo


A Listagem 2 mostra a classe Curriculo.
Observe que foi adicionada a anotao
@ManagedBean(name = curriculoBean) para
indicar que a classe ser um bean gerenciado. Ela foi nomeada de curriculoBean. Esse
nome ser utilizado como referncia na
chamada de mtodos a partir da pgina
incluirCurriculo.xhtml. Voc pode alter-lo
ou remover o parmetro name da anotao
@ManagedBean para usar o nome da classe

como referncia na pgina incluirCurriculo.


xhtml.
A classe tambm possui a anotao
@RequestScoped, que define o bean com escopo de requisio, onde um novo objeto
criado a cada requisio realizada pelo
usurio. Assim, os dados so utilizados
somente para a pgina que os requisitou.
As informaes se perdero caso haja
navegao para outras pginas.
Note que na Listagem 2 a maioria dos
mtodos getters e setters dos atributos foram omitidos. Voc

deve cri-los acessando Source | Generate Getters and Setters....


Na caixa de dilogo, selecione todos os
atributos (Select All) e clique no boto OK.
Assim, voc no ter problemas quando
chamar os mtodos da classe a partir do
arquivo incluirCurriculo.xhtml.
O mtodo exibirResultado() ser invocado
no pressionamento do boto Gravar do
formulrio. Caso no ocorra nenhum erro
de verificao, ele definir a varivel exibir
como verdadeira, para logo depois ser
exibida a tela com o resumo do currculo
do usurio.

Criando o formulrio de incluso


Agora vamos criar a pgina que vai interagir com o Managed Bean. Para isso, v
at a raiz do diretrio WebContent e crie
o arquivo incluirCurriculo.xhtml (New >
HTML File). Clique em Next, deixe marcada
a opo Use HTML Template e selecione o
primeiro template New Facelet Composition
Page. Depois clique em Finish.
Como no vamos trabalhar ainda com
Componentes Compostos, apague a tag
<ui:composition> com todo seu contedo
para inserir o cdigo da Listagem 3, que
analisaremos agora.
Observe logo no incio da Listagem 3
que dentro da tag <html> foram adicionados alguns parmetros iniciados como
na sintaxe xmlns:h=http://java.sun.com/jsf/
html. Esses parmetros so declaraes
em XML namespace que servem para embutir as bibliotecas de tag em sua aplicao.
Assim podemos utilizar a tag especial de
JSF <h:inputText> na pgina para construir
campos de entrada de dados com mais
recursos do que a tag <input> do HTML,
como verificao por exemplo.

Listagem 1. Arquivo web.xml (deployment descriptor) com as configuraes necessrias para o funcionamento com JSF

<?xml version=1.0 encoding=UTF-8?>


<web-app xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns=http://java.sun.com/xml/ns/
javaee xmlns:web=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd xsi:schemaLocation=http://
java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd id=WebApp_ID
version=3.0>
<display-name>CurriculoComJSF2</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
</web-app>

Listagem 2. Classe Curriculo que implementa o


Managed Bean curriculoBean.

Nota do DevMan

package br.com.empresa.controller;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = curriculoBean)
@RequestScoped
public class Curriculo {
private String nome;
private String naturalidade;
private String dataNascimento;
private String endereco;
private String bairro;
private String cep;
private String cidade;
private String telefone;
private String email;
private String objetivo;
private Boolean exibir;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
// os outros mtodos getters e setters foram
omitidos

public void exibirResultado() {


this.setExibir(true);
}

Logo abaixo do cabealho vem o corpo


da pgina com um formulrio que conter seus campos organizados em uma
tabela que est representada pela tag
<h:panelGrid>. No final, depois do campo
objetivo profissional, foi adicionado um
boto de submisso. Estes so os elementos
que sero visualizados no momento em

Managed Bean: Managed Bean uma classe JavaBean,


tambm conhecida como POJO (Plain Old Java Objects), que
segue o padro de criao de possuir atributos privados e
os mtodos getters e setters pblicos. Essas classes atuam
como controladores, disponibilizando dados e mtodos
para pginas web, atravs de chamadas a referncias pela
sintaxe #{controlador.metodo}. Com isso, os dados podem
ser armazenados, recuperados e apresentados na pgina
controlada por ele.

Nota do DevMan
Servlets: Servlets so classes escritas em Java que so
executadas como componentes no lado do servidor, com
a finalidade de processar as requisies vindas do cliente
(browser) para gerar respostas em formato html ou xml para
uma aplicao web.

Nota do DevMan
Bibliotecas de tag: Bibliotecas de tag (taglib) agrupam tags
especiais que so utilizadas na construo de pginas,estendendo
o cdigo HTML padro. As taglibs so classes Java que atravs de
tags especficas automatizam a gerao de contedo dinmico
em pginas web.

que voc chamar o formulrio pela primeira vez, como demonstrado na Figura 3.
A Figura 4 mostra a tela aps o clique no
boto Gravar, exibindo as mensagens de verificao dentro da nica tag <h:messages />,
que fica localizada logo abaixo da primeira
tabela (<h:panelGrid columns=2 border=0>
</h:panelGrid>).

Edio 03 Easy Java Magazine

13

Minha primeira aplicao web com JSF

Figura 3. Formulrio de incluso do currculo

Figura 4. Formulrio de incluso com verificao de campos

Listagem 3. Formulrio de incluso incluirCurriculo.xhtml.

<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN


http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd>
<html xmlns=http://www.w3.org/1999/xhtml
xmlns:ui=http://java.sun.com/jsf/facelets
xmlns:h=http://java.sun.com/jsf/html
xmlns:f=http://java.sun.com/jsf/core>
<h:head>
<title>Incluir Curriculo</title>
</h:head>
<h:body>
<h:form id=form1>
<h:panelGrid columns=2 border=0>
<h:outputLabel for=nome value=Nome: />
<h:inputText id=nome value=#{curriculoBean.nome} size=35
required=true requiredMessage=Informe o seu nome />
<h:outputLabel for=naturalidade value=Naturalidade: />
<h:inputText id=naturalidade value=#{curriculoBean.naturalidade}
required=true requiredMessage=Informe a sua naturalidade />
<h:outputLabel for=dataNascimento value=Data de Nascimento: />
<h:inputText id=dataNascimento value=#{curriculoBean.dataNascimento}
size=10 required=true
requiredMessage=Informe a sua data de nascimento />
<h:outputLabel for=endereco value=Endereo: />
<h:inputText id=endereco value=#{curriculoBean.endereco} size=35
required=true requiredMessage=Informe o seu endereo />
<h:outputLabel for=bairro value=Bairro: />
<h:inputText id=bairro value=#{curriculoBean.bairro}
required=true requiredMessage=Informe o seu bairro />
<h:outputLabel for=cep value=CEP: />
<h:inputText id=cep value=#{curriculoBean.cep}
required=true requiredMessage=Informe o seu CEP />
<h:outputLabel for=cidade value=Cidade: />
<h:inputText id=cidade value=#{curriculoBean.cidade}
required=true requiredMessage=Informe a sua cidade />
<h:outputLabel for=telefone value=Telefone: />

14 Easy Java Magazine Edio 03

<h:inputText id=telefone value=#{curriculoBean.telefone}


required=true requiredMessage=Informe o seu telefone />
<h:outputLabel for=email value=E-mail: />
<h:inputText id=email value=#{curriculoBean.email} size=30
required=true requiredMessage=Informe o seu e-mail />
<h:outputLabel for=objetivo value=Objetivo Profissional: />
<h:inputTextarea id=objetivo value=#{curriculoBean.objetivo}
cols=50 rows=5 required=true
requiredMessage=Informe o seu objetivo profissional>
</h:inputTextarea>
<h:panelGroup></h:panelGroup>
<h:commandButton id=cmdGravar value=Gravar action=
#{curriculoBean.exibirResultado} />
</h:panelGrid>
<h:messages />
<h:panelGrid id=resultado rendered=#{curriculoBean.exibir}>
<h:panelGroup>
<h2><h:outputText value=Curriculo Vitae /></h2>
<hr />
<b><h:outputText value=#{curriculoBean.nome} /></b>
<br />
<h:outputText value=#{curriculoBean.naturalidade} />
<br />
<h:outputText value=#{curriculoBean.endereco} />,
<h:outputText value=#{curriculoBean.bairro} />,
<h:outputText value=#{curriculoBean.cep} />,
<h:outputText value=#{curriculoBean.cidade} />
<br />
<h:outputText value=#{curriculoBean.telefone} />
<br />
<h:outputText value=#{curriculoBean.email} />
<h3><h:outputText value=Objetivo Profissional /></h3>
<h:outputText value=#{curriculoBean.objetivo} />
</h:panelGroup>
</h:panelGrid>
</h:form>
</h:body>
</html>

Construir tabelas e campos de formulrio


com JSF bem mais prtico do que usar
HTML puro. Na Listagem 3 a primeira tag
<h:panelGrid>, que possui o atributo columns=2,
cria uma tabela com duas colunas. Com isso,
cada elemento de rtulo (<h:outputLabel>),
responsvel pela descrio do campo, e caixa de texto (<h:inputText>), responsvel pela
criao do campo, ocuparo cada uma das
clulas da tabela para compor o formulrio
de cadastro. O resultado da disposio dos
campos visto na Figura 3.
Para voc entender, na prtica, a composio da tabela, execute a aplicao no
navegador e analise o cdigo-fonte da
pgina gerada. Perceba que a pgina estar
construda com as tags HTML e dentro do
formulrio (<form>...</form>) se encontra a
tabela (<table>...</table>), rtulos e campos
que foram gerados pelo JSF.
Ainda na Listagem 3, logo aps a criao
da tabela, observe o campo texto que est
identificado como nome e com o valor
contendo a Expression Language #{curriculoBean.nome}. Nessa expresso acontece o vnculo com o Managed Bean Curriculo atravs do
mtodo getNome(). Observe que na Listagem
2 os atributos esto declarados como privados. Em contrapartida os mtodos getters
e setters devem ser pblicos para que haja
a comunicao entre a pgina incluirCurriculo.xhtml e seu Managed Bean. Essa rgida
disciplina em nomear atributos e mtodos
necessria para que voc utilize a Conveno
sobre Configurao que , sem sombra de
dvidas, o que d prazer em desenvolver
aplicaes fceis de manter, com qualidade
e sem a necessidade de gerenciar extensos
arquivos XML.

Verificao de campos
A verificao de campos em JSF facilita
bastante a vida do desenvolvedor devido
possibilidade de verificar o preenchimento
de cada um com parmetros inseridos na tag
de criao do mesmo. Como no exemplo do
campo nome, foi adicionado a ele os atributos
required e requiredMessage, indicando que o seu
preenchimento obrigatrio. Caso ele esteja
vazio e o boto Gravar for pressionado, ser
exibida uma mensagem informando ao
usurio que o campo deve ser preenchido.
A utilizao de requiredMessage permite ao

desenvolvedor personalizar a mensagem


de verificao para o usurio.

Exibindo o resultado
O objetivo da aplicao resulta na impresso, em tela, dos dados do usurio
com uma formatao simples. Deste modo,
depois do preenchimento dos campos do
formulrio basta clicar no boto Gravar
para o resultado ser exibido, como pode
ser visto na Figura 5.
A anlise da Listagem 4 serve para
destacar a comunicao entre a pgina
incluirCurriculo.xhtml e o Managed Bean
curriculoBean. Observe que o boto Gravar
(<h:commandButton>) possui uma ao que est
invocando o mtodo exibirResultado(), que tem
seu contedo destacado na Listagem 2.
Continuando a leitura da Listagem 4,
perceba que logo depois das mensagens
de verificao (<h:messages>) criada uma
outra tabela (<h:panelGrid>), identificada
como resultado, e com o atributo rendered
que recebe o retorno do mtodo getExibir().
Quando o Managed Bean invocado pela
primeira vez, o atributo exibir iniciado com o valor false. Com isso, a tabela
resultado no ser exibida. Quando o
formulrio for preenchido e o boto Gravar
for pressionado, os dados do usurio sero
exibidos por consequncia do mtodo
getExibir() retornar o valor true.
A mgica acontece quando, no momento da submisso do formulrio, no
h erros de verificao e o mtodo exibirResultado() acionado definindo como true o
atributo exibir. Quando acontece o reload da
pgina, o atributo rendered recebe o retorno
do mtodo getExibir() j com o valor true,
que resulta na exibio da tabela com o
currculo formatado para o usurio.
Na exibio do resultado, os textos so
impressos com a tag <h:outputText> passando um valor ao atributo value. Observe
que em algumas tags so passadas, via
Expression Language, referncias aos mtodos getters do Managed Bean curriculoBean.
Os valores dos campos do formulrio
foram vinculados aos atributos da classe
Curriculo atravs de seus mtodos setters.
No momento da submisso, via mtodo
HTTP POST, os dados so armazenados
no servidor para serem acessados pelos

Nota do DevMan
Facelets: Facelets um framework para construo de pginas.
Ele usa uma linguagem de declarao prpria para a modelagem
e exibio das pginas em JSF. Utiliza XHTML em substituio
ao HTML. Foi criada para estender as limitaes do JSP. Atravs
de namespaces apropriados ela converte elementos HTML em
componentes JSF, adicionando-os a uma rvore de componentes
para construir a camada de viso da aplicao. Desde a verso 1.x
de JSF utilizada como preferncia dos desenvolvedores a outros
frameworks de templating como Struts Tiles ou Sitemesh. Agora
est incorporada verso 2.x.

Nota do DevMan
Expression Language: Expression Language (EL) uma
linguagem de scripting, desenvolvida pela Sun, utilizada para
acessar componentes Java (JavaBeans) eliminando parte do
cdigo Java em pginas web. Por exemplo, para imprimir na tela
o retorno do mtodo getNome() com JSP utiliza-se a sintaxe
<%=curriculo.getNome()%>. Mas podemos simplific-la,
atravs de EL, utilizando a sintaxe: ${curriculo.nome}, tornando
assim o cdigo mais legvel. O JSF utiliza o smbolo # para
referenciar o mtodo de um JavaBean, diferente de JSP, que usa
o smbolo $.

Nota do DevMan
Conveno sobre Configurao: Conveno sobre Configurao
(Convention over Configuration CoC) um modelo de
desenvolvimento que d preferncia a convenes ao invs
de configurar extensos arquivos, devendo assumir valores
padro onde existe uma conveno. Em nosso exemplo temos
convencionado que os mtodos da classe Curriculo que retornam o
valor de seus respectivos atributos devem ser escritos da seguinte
forma: getNomeDoAtributo(), como por exemplo, getEndereco().
Com isso, seguimos o padro de um POJO para que o mtodo seja
utilizado no formulrio XHTML declarando apenas seu nome sem
o prefixo get e com inicial minscula. O desenvolvedor obrigado
a seguir as convenes do framework, mas em compensao
ganha clareza no cdigo e facilidade na manuteno da aplicao.

componentes <h:inputText> e <h:outputText>.


Na sequncia retornada a pgina com os
valores dos campos, que foram preenchidos pelos mtodos getters dos atributos
armazenados no Managed Bean, e logo
abaixo do formulrio exibida a tabela
com os dados do usurio formatados.
Terminada a implementao da aplicao, j podemos execut-la para compreender melhor seu funcionamento.

Executando a aplicao
Para testar a aplicao, acesse a aba Servers no Eclipse e inicie o servidor Tomcat.
D ateno para a aba Console, que serve

Edio 03 Easy Java Magazine

15

Minha primeira aplicao web com JSF

Listagem 4. Trecho do arquivo incluirCurriculo.xhtml, com destaque para o resultado da submisso do formulrio.

...

<h:panelGroup></h:panelGroup>
<h:commandButton id=cmdGravar value=Gravar action=#{curriculoBean.exibirResultado} />
</h:panelGrid>
<h:messages />
<h:panelGrid id=resultado rendered=#{curriculoBean.exibir}>
<h:panelGroup>
<h2><h:outputText value=Curriculo Vitae /></h2>
<hr />
<b><h:outputText value=#{curriculoBean.nome} /></b>
...

Concluses
Neste artigo foi criado um
formulrio simples, com poucos elementos, para uma compreenso rpida e fcil da
utilizao do framework JSF
2.0. A implementao de um
controle de currculos pode
ser elevado a nveis bem mais
altos de complexidade (por
exemplo: empregando Ajax,
persistncia em banco de dados, upload de foto, exportao
em PDF, etc.), nos levando com
isso a aprender, aperfeioar o
uso da tecnologia e enriquecer
ainda mais a aplicao.
Atravs do uso de JSF, o desenvolvimento
de aplicaes
Figura 5. Resultado aps submisso, sem erro de verificao, do formulrio
web fica mais compreensvel
para designers e desenvolvedores. O
para analisar o log do Tomcat no intuito
de encontrar possveis erros de digitao,
framework propicia uma harmonia entre a
ausncia de bibliotecas ou configurao
equipe, possibilitando que os profissionais
incorreta do arquivo web.xml. Caso tudo
trabalhem nos mesmos arquivos, cada um
com suas obrigaes. Assim o designer no
ocorra bem, inicie seu navegador e digite
o endereo: http://localhost:8080/Curricuprecisa saber todas as nuances da lingualosJSF2/ incluirCurriculo.jsf.
gem Java e o desenvolvedor no necessita

16 Easy Java Magazine Edio 03

reescrever o cdigo vindo de seus colegas


designers, j que falam a mesma lngua,
ou seja, JSF.
Quem trabalha com Java encontra em JSF
o suporte de uma comunidade e empresas
que trabalham srio para que a construo
de aplicaes no seja to maante, e sim
produtiva. Quem comea a trabalhar com
JSF percebe logo o ganho em velocidade,
clareza, organizao e uniformidade. O
framework ajuda bastante na rdua tarefa
de entregar produtos de qualidade e sem
complicaes entre os envolvidos durante
o desenvolvimento.

Luiz Sanches
luizgrsanches@gmail.com
luizsanches.wordpress.com
Trabalha com desenvolvimento de
software e ensino em informtica a mais
de 10 anos. graduado em Sistemas de
Informao pelo IESAM e ps-graduando em Gesto gil
de Projetos pelo CESAR. Na graduao conheceu Java e a
comunidade T safo! que divulga Desenvolvimento gil e
Software Livre no Estado do Par.

eclipse.org/downloads
Download do Eclipse Helios.
tomcat.apache.org/download-70.cgi
Download do Tomcat 7.
javaserverfaces.dev.java.net
Download e documentos do Projeto
Mojarra (JSF 2.0).
groups.google.com.br/group/javasf
Grupo de JavaServer Faces oficial do Brasil.

Java Database Connectivity (JDBC)


Persistindo dados em Java Parte 2

Paulo Csar Coutinho

a primeira parte do nosso artigo sobre JDBC API Java para


acesso a bases de dados , explicamos seus conceitos e arquitetura geral,
vimos os tipos de drivers suportados, e
mostramos, atravs de pequenos trechos
de cdigo, como obter uma conexo JDBC,
executar um comando SQL no banco de
dados e manipular os resultados. Alm
disso, demos incio construo de uma
agenda de contatos, como exemplo prtico
de projeto.
Nesta segunda parte do artigo, continuaremos o desenvolvimento do nosso
projeto, vendo o restante das funcionalidades, bem como a interface com o
usurio, que ser feita utilizando linha
de comando.

O projeto exemplo: Agenda de Contatos


Como j sabemos, nosso projeto exemplo trata-se de uma Agenda de Contatos.
Vamos apenas relembrar as funcionalidades que nossa aplicao ir fornecer ao
usurio:
C
adastrar nome, telefone e e-mail dos
contatos;
E
ditar as informaes do cadastro;
L
istar os contatos;
O
bter informaes detalhadas de um
contato;
Excluir um contato;
B
uscar contatos pelo nome.
A Figura 1 mostra um diagrama com as
classes da nossa aplicao.
At ento, criamos uma base de dados
chamada test_jdbc em cada um dos SGBDs
que iremos utilizar (MySQL e PostgreSQL)
e a tabela contacts. Alm disso, baixamos
os jars dos drivers JDBC do MySQL e PostgreSQL, e tambm da biblioteca Apache
Commons CLI (ver URLs para download
na seo Links). Por fim, criamos um

Resumo DevMan
De que se trata o artigo:
Neste artigo veremos como utilizar a JDBC de forma prtica. Para isso, construiremos uma aplicao de
Agenda de Contatos que ter uma interface simples no estilo linha de comando, a qual desenvolveremos
utilizando a biblioteca CLI do projeto Apache Commons.

Para que serve:


Os bancos de dados esto presentes em grande parte das aplicaes que desenvolvemos e fundamental saber como criar uma aplicao que utilize essa tecnologia. A JDBC a API que permite construir
aplicaes Java para bancos de dados.

Em que situao o tema til:


O tema til para a criao ou manuteno de aplicaes Java que utilizem bancos de dados. Conhecer
os conceitos bsicos da JDBC tambm ajuda o desenvolvedor a entender como funcionam os frameworks
ORM, como Hibernate, TopLink, etc. que sero abordados em artigos futuros.

projeto no Eclipse, adicionando os jars citados


no Build Path, e definimos
as classes Contact, ConnectionHelper, e ContactJdbcDao,
alm da interface IContactDao.
Como podemos perceber na Listagem 1, a
classe ContactJdbcDao s
est com alguns mtodos
implementados, exatamente como a deixamos
na primeira parte do
artigo. Ainda faltam as
implementaes dos mFigura 1. Diagrama de classes do projeto
todos list(), search(), update()
e delete(). Nas prximas sees, proveremos
uma implementao para cada um desses
Recuperando dados
mtodos e criaremos a classe responsvel
Dando continuidade implementao
pela interface de linha de comando da
dos mtodos da classe ContactJdbcDao, veaplicao.
remos agora como listar todos os contatos
da agenda. A Listagem 2 mostra o mtodo
- O projeto completo, incluindo o modelo de classes
list() atualizado. Nele obtemos a conexo
e script de banco, pode ser baixado diretamente do
JDBC, criamos o Statement com a consulta
site da Easy Java.
SQL SELECT, sem filtros, e invocamos o m-

Edio 03 Easy Java Magazine

17

Java Database Connectivity (JDBC)

todo statement.executeQuery(). Ento iteramos


pelo ResultSet retornado, e para cada registro criamos um novo Contact, configuramos
seus atributos e o adicionamos lista
contacts. Em seguida fechamos o ResultSet e
retornamos a lista de contatos.
A Listagem 3 mostra a implementao do
mtodo ContactJdbcDao.search(), responsvel
por buscar um contato pelo nome. Se repararmos bem, o mtodo search() muito

parecido com o mtodo list(), visto anteriormente. A diferena que esse ltimo
possui o argumento name, utilizado como
filtro na instruo SELECT. Os operadores
LIKE e UPPER tornam a busca mais abrangente, fazendo com que ela funcione mesmo
que apenas parte do nome do contato seja
informada e que sejam ignoradas diferenas de maisculas e minsculas (ex.: se
buscarmos por jo, a consulta retornaria

contatos com nomes como Jos, Marjorie, Maria Joaquina, etc.).

Atualizando dados
Para atualizar os dados, basta utilizar o
comando SQL UPDATE, informando os novos valores para as colunas. A Listagem 4
mostra o mtodo ContactJdbcDao.update() atualizado. Nele, obtemos uma conexo JDBC,
criamos um PreparedStatement com o SQL de

Listagem 1. Classe ContactJbdcDao

package br.com.easyjava.examples.mycontacts.dao.jdbc;

String sql = SELECT * FROM contacts WHERE id = ?;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

statement = connection.prepareStatement(sql);
statement.setLong(1, id);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
contact = new Contact();
contact.setId(resultSet.getLong(id));
contact.setName(resultSet.getString(name));
contact.setEmail(resultSet.getString(email));
contact.setPhone(resultSet.getString(phone));
}

import br.com.easyjava.examples.mycontacts.bean.Contact;
import br.com.easyjava.examples.mycontacts.dao.IContactDao;
public class ContactJdbcDao implements IContactDao {
public Contact insert(Contact contact) {
Connection connection = null;
PreparedStatement statement = null;

resultSet.close();
} catch (Exception e) {
throw new RuntimeException(Error getting contact., e);
} finally {
releaseDatabaseResources(statement, connection);
}

try {
connection = ConnectionHelper.getConnection();
String sql = INSERT INTO contacts (name, email, phone) VALUES (?, ?, ?);
}

statement.executeUpdate();
ResultSet keys = statement.getGeneratedKeys();

public List<Contact> search(String name) {


return null;
}

public List<Contact> list() {


return null;
}

keys.next();
long key = keys.getLong(1);
keys.close();

public void update(Contact contact) {


}

contact.setId(key);
} catch (Exception e) {
throw new RuntimeException(Error inserting contact., e);
} finally {
releaseDatabaseResources(statement, connection);
}
}

return contact;

statement = connection.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
statement.setString(1, contact.getName());
statement.setString(2, contact.getEmail());
statement.setString(3, contact.getPhone());

public void delete(Contact contact) {


}
private void releaseDatabaseResources(Statement statement,
Connection connection) {
try {
statement.close();
} catch (Exception e) {}

return contact;

public Contact get(Long id) {


Contact contact = null;
Connection connection = null;
PreparedStatement statement = null;
try {
connection = ConnectionHelper.getConnection();

18 Easy Java Magazine Edio 03

}
}

try {
connection.close();
} catch (Exception e) {}

Listagem 2. Mtodo ContactJdbcDao.list() atualizado.

public List<Contact> list() {


List<Contact> contacts = new ArrayList<Contact>();
Connection connection = null;
PreparedStatement statement = null;
try {
connection = ConnectionHelper.getConnection();
String sql = SELECT * FROM contacts;
statement = connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
Contact contact = new Contact();
contact.setId(resultSet.getLong(id));
contact.setName(resultSet.getString(name));
contact.setEmail(resultSet.getString(email));
contact.setPhone(resultSet.getString(phone));
contacts.add(contact);
}
resultSet.close();
} catch (Exception e) {
throw new RuntimeException(Error listing contacts., e);
} finally {
releaseDatabaseResources(statement, connection);
}
return contacts;
}

atualizao, configuramos os valores dos parmetros da instruo


SQL e, por fim, invocamos o mtodo statement.executeUpdate().

Excluindo dados
Para excluir um contato, utilizamos o comando SQL DELETE,
informando o ID do contato a ser excludo. A Listagem 5 mostra
o mtodo ContactJdbcDao.delete() atualizado. Nele, obtemos uma
conexo JDBC, criamos o statement com o SQL de excluso e
configuramos o valor do parmetro do SQL. Por fim, invocamos
o mtodo statement.executeUpdate() para executar o comando SQL
no banco.
Dessa forma, finalizamos a implementao da classe ContactJdbcDao, restando agora criar a interface da nossa aplicao.

Interface com o usurio


Como falamos anteriormente, nossa aplicao ter uma interface
de linha de comando simples. E para facilitar nossa vida, utilizaremos a biblioteca CLI (Command Line Interface) do projeto
Listagem 4. Mtodo ContactJdbcDao.update() atualizado.

public void update(Contact contact) {


Connection connection = null;
PreparedStatement statement = null;
try {
connection = ConnectionHelper.getConnection();

Listagem 3. Mtodo ContactJdbcDao.search() atualizado.

String sqlInsert = UPDATE contacts SET name = ?, email = ?,


phone = ? WHERE id = ?;

public List<Contact> search(String name) {


List<Contact> contacts = new ArrayList<Contact>();
Connection connection = null;
PreparedStatement statement = null;

statement = connection.prepareStatement(sqlInsert);
statement.setString(1, contact.getName());
statement.setString(2, contact.getEmail());
statement.setString(3, contact.getPhone());
statement.setLong(4, contact.getId());

try {
connection = ConnectionHelper.getConnection();
String sql = SELECT * FROM contacts WHERE name LIKE ?;
statement = connection.prepareStatement(sql);
statement.setString(1, % + name + %);
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
Contact contact = new Contact();
contact.setId(resultSet.getLong(id));
contact.setName(resultSet.getString(name));
contact.setEmail(resultSet.getString(email));
contact.setPhone(resultSet.getString(phone));

Listagem 5. Mtodo ContactJdbcDao.delete() atualizado.

public void delete(Contact contact) {


Connection connection = null;
PreparedStatement statement = null;
try {
connection = ConnectionHelper.getConnection();

contacts.add(contact);
}

String sqlInsert = DELETE FROM contacts WHERE id = ?;

resultSet.close();
} catch (Exception e) {
throw new RuntimeException(Error listing contacts., e);
} finally {
releaseDatabaseResources(statement, connection);
}

statement = connection.prepareStatement(sqlInsert);
statement.setLong(1, contact.getId());

return contacts;
}

statement.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(Error updating contact., e);
} finally {
releaseDatabaseResources(statement, connection);
}

statement.executeUpdate();
} catch (Exception e) {
throw new RuntimeException(Error deleting contact., e);
} finally {
releaseDatabaseResources(statement, connection);
}

Edio 03 Easy Java Magazine

19

Java Database Connectivity (JDBC)

Commons da Apache. Com ela, possvel


criar aplicaes de linha de comando, de
maneira rpida e fcil.
A Listagem 6 mostra o cdigo da classe
Application, que contm o ponto de entrada da
nossa aplicao. Nela, inicialmente temos as
constantes que representam os comandos
suportados. Temos ento o atributo running, que serve para controlar o tempo de
vida da aplicao, e o atributo options, que
armazenar o conjunto de opes que forneceremos ao usurio e ser utilizado pela
biblioteca CLI. Por fim, temos o atributo
contactDao, que ser utilizado para realizar as
operaes com a base de dados contacts.
No construtor, criamos as opes de
comando da nossa aplicao. Utilizando a
biblioteca CLI, essa uma tarefa bastante
simples. O mtodo Options.addOption() recebe
as informaes do comando como: abreviao, nome, flag indicando se o comando
tem argumentos e a descrio. Tambm
utilizamos a verso sobrecarregada do mtodo Options.addOption(), que recebe um objeto
Option, criado utilizando a classe utilitria
OptionsBuilder, que facilita a criao de opes
com argumentos, como no caso da opo
--delete, que espera o ID do contato.
O mtodo start() exibe o menu de ajuda
da aplicao e inicia o loop de controle que
aguarda os comandos do usurio.
Os mtodos getUserInput() so responsveis
por ler os dados digitados pelo usurio no
console. Para isso, criamos um objeto BufferedReader, que recebe no construtor um
InputStreamReader que, por sua vez, recebe
um InputStream como parmetro. No nosso
caso, utilizamos o InputStream System.in, que
representa os dados digitados no console.
Ento invocamos o mtodo readLine() do
BufferedReader para ler o valor digitado
pelo usurio.

O mtodo processCommand() o responsvel por interpretar os comandos digitados pelo usurio. Aqui veremos como
a biblioteca CLI torna essa tarefa fcil,
visto que no precisamos definir um
formato de entrada de dados (incluindo
passagem, ordem e obrigatoriedade de
parmetros) e muito menos tratar essa
entrada a fim de identificar esses valores
a partir da string fornecida pelo usurio. Deste modo, primeiro criamos um
CommandLineParser do tipo BasicParser que
ser responsvel por fazer o parsing1 dos
dados digitados pelo usurio. Utilizando
o parser criado, construmos um objeto do
tipo CommandLine atravs do mtodo CommandListParser.parse(). Em seguida testamos
se nossa linha de comando possui alguma
das opes definidas, correspondentes
s funcionalidades da aplicao, e, para
cada opo, chamamos o mtodo privado
adequado. Para os casos onde as opes
possuem um argumento, como no mtodo
search(), utilizamos o mtodo CommandLine.
getOptionValue() para recuperar o valor
digitado.
O mtodo readContact() constri um objeto
Contact a partir dos dados informados pelo
usurio. Ele ser utilizado para criao e
edio de contatos.
O mtodo help() exibe a lista de ajuda
da nossa aplicao. Para nos ajudar nesse
sentido, a biblioteca CLI disponibiliza a
classe utilitria HelpFormatter, que atravs
do mtodo printHelp() imprime no console a
lista de comandos e suas descries.
Os mtodos create(), details(), list(), search(),
edit() e remove() correspondem s funcionalidades da aplicao e simplesmente
fazem uso dos mtodos que definimos
na interface IContactDao para manipular os
contatos da agenda.

- A partir da verso 1.6 do Java, podemos ler os


dados digitados no console de forma mais simples,

1 Podemos dizer que o processo de parsing consiste

utilizando a classe java.io.Console. Para isso, basta

em analisar um dado, texto (String) ou binrio (ex.:

chamar o mtodo System.console().readLine()

byte[]), buscando encontrar trechos (elementos)

ou System.console().readPassword(), no caso

de um padro preestabelecido, permitindo assim a

de uma senha. Entretanto, quando estamos desen-

construo de objetos a partir de dados cruz (raw

volvendo e testando no Eclipse, o mtodo System.

data). Um exemplo comum de parser que lidamos no

console() retorna null (https://bugs.eclipse.org/

dia a dia so os parsers de arquivos XML, responsveis

bugs/show_bug.cgi?id=122429). Por isso utilizamos

basicamente por distinguir no texto, o que so as tags,

a maneira antiga no nosso exemplo.

os atributos e os valores.

20 Easy Java Magazine Edio 03

O mtodo quit() apenas configura o atributo running para false, fazendo com que o
loop de controle seja finalizado, encerrando deste modo a aplicao.
Por fim, o mtodo main() cria uma instncia da nossa aplicao e invoca o mtodo
start() na mesma.
Com isso finalizamos a implementao
do nosso projeto exemplo. Agora voc
pode executar a aplicao, cadastrar alguns contatos, listar os dados cadastrados,
fazer buscas, etc. Para criar um contato,
por exemplo, basta digitar -c ou --create e
pressionar Enter, que a aplicao solicitar
o preenchimento do nome, e-mail e telefone, e ento criar o novo contato. Para listar
os contatos existentes, basta usar a opo
-l ou --list. Para ver a lista completa de
opes, use -h ou --help. A Figura 2 mostra
um screen shot da aplicao em execuo no
console do eclipse.

Mudando de base de dados


Vamos agora simular uma situao que
acontece no mundo real e que caso a aplicao no esteja preparada, pode gerar
muito retrabalho e dor de cabea. Estamos
falando da troca de base de dados. Na
preparao do ambiente, apresentada no
primeiro artigo desta srie, criamos duas
bases de dados em dois SGBDs distintos.
Entretanto, at agora s testamos nossa
aplicao no MySQL, conforme configurado na classe ConnectionHelper.
Dessa forma, suponha que um novo
cliente j possui o PostgreSQL rodando
nos seus servidores e no quer instalar um
novo SGBD apenas para nossa aplicao.
Nesse caso, teremos que adaptar a aplicao para o PostgreSQL.
Eis ento a boa notcia: como nossa
aplicao foi construda utilizando a API
JDBC e instrues SQL genricas, visto no
utilizarmos nenhuma instruo ou funo
especfica de um fabricante de SGBD, as
nicas mudanas que precisamos fazer
so: 1) mudar a URL de conexo com a base
de dados; 2) obter o novo driver JDBC (do
PostgreSQL, neste caso), que j havamos
adicionado no classpath do projeto.
A Listagem 7 mostra a classe Connection
Helper alterada para criar conexes com
a base test_jdbc no PostgreSQL, rodando

Listagem 6. Classe Application Ponto de entrada da aplicao exemplo

package br.com.easyjava.examples.mycontacts;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import br.com.easyjava.examples.mycontacts.bean.Contact;
import br.com.easyjava.examples.mycontacts.dao.IContactDao;
import br.com.easyjava.examples.mycontacts.dao.jdbc.ContactJdbcDao;
public class Application {
private static final String COMMAND_HELP = help;
private static final String COMMAND_QUIT = quit;
private static final String COMMAND_SEARCH = search;
private static final String COMMAND_LIST = list;
private static final String COMMAND_REMOVE = remove;
private static final String COMMAND_DETAILS = details;
private static final String COMMAND_EDIT = edit;
private static final String COMMAND_CREATE = create;
private boolean running = true;
private Options options = new Options();
private IContactDao contactDao = new ContactJdbcDao();
public Application() {
options.addOption(h, COMMAND_HELP, false, Shows this list);
options.addOption(q, COMMAND_QUIT, false, Quits the application);
options.addOption(l, COMMAND_LIST, false, Lists all contacts);
options.addOption(c, COMMAND_CREATE, false, Creates a new contact);
options.addOption(OptionBuilder.withArgName(contactId).hasArgs()
.withDescription(Updates the contact specified by <contactId>)
.withLongOpt(COMMAND_EDIT).create(e));
options.addOption(OptionBuilder.withArgName(contactId).hasArgs()
.withDescription(Removes the contact specified by <contactId>)
.withLongOpt(COMMAND_REMOVE).create(r));
options.addOption(OptionBuilder.withArgName(contactId).hasArgs()
.withDescription(Shows the details of the contact specified by <contactId>)
.withLongOpt(COMMAND_DETAILS).create(d));
options.addOption(OptionBuilder.withArgName(searchString).hasArgs()
.withDescription(Searches for contacts containing <searchString>
on their names.)
.withLongOpt(COMMAND_SEARCH).create(s));
}
public void start() {
help();
while (running) {
processCommand(getUserInput().split( ));
}
}
private String getUserInput(String prefix) {
System.out.print(prefix + : );
String result = null;
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
System.in));
result = reader.readLine().trim();
} catch (Exception e) {}
return result;
}

private String getUserInput() {


return getUserInput([My Contacts]);
}
private void processCommand(String[] args) {
CommandLineParser parser = new BasicParser();
try {
CommandLine line = parser.parse(options, args);
if (line.hasOption(COMMAND_HELP)) {
help();
}
if (line.hasOption(COMMAND_QUIT)) {
quit();
}
if (line.hasOption(COMMAND_CREATE)) {
create();
}
if (line.hasOption(COMMAND_EDIT)) {
try {
edit(Long.parseLong(line.getOptionValue(COMMAND_EDIT)));
} catch (NumberFormatException e) {
System.out.println(Invalid ID);
}
}
if (line.hasOption(COMMAND_DETAILS)) {
try {
details(Long.parseLong(line.getOptionValue(COMMAND_DETAILS)));
} catch (NumberFormatException e) {
System.out.println(Invalid ID);
}
}
if (line.hasOption(COMMAND_REMOVE)) {
try {
remove(Long.parseLong(line.getOptionValue(COMMAND_REMOVE)));
} catch (NumberFormatException e) {
System.out.println(Invalid ID);
}
}
if (line.hasOption(COMMAND_LIST)) {
list();
}
if (line.hasOption(COMMAND_SEARCH)) {
search(line.getOptionValue(COMMAND_SEARCH));
}
} catch (ParseException e) {
System.out.println(Unexpected exception: + e.getMessage());
}
}
private Contact readContact() {
Contact contact = new Contact();
contact.setName(getUserInput(Enter name));
contact.setEmail(getUserInput(Enter e-mail));
contact.setPhone(getUserInput(Enter phone));
}

return contact;

private void help() {


HelpFormatter formatter = new HelpFormatter();
formatter.printHelp(My Contacts, options);
}
private void create() {
Contact contact = contactDao.insert(readContact());
System.out.println(Contact created: # + contact.getId());
}

Edio 03 Easy Java Magazine

21

Java Database Connectivity (JDBC)

Continuao: Listagem 6. Classe Application Ponto de entrada da aplicao exemplo

private void details(long id) {


Contact contact = contactDao.get(id);
if (contact != null) {
System.out.println(contact);
} else {
System.out.println(Contact not found.);
}
}

private void edit(long id) {


Contact contact = readContact();
contact.setId(id);
contactDao.update(contact);
System.out.println(Contact # + id + updated.);
}
private void remove(long id) {
Contact contact = new Contact();
contact.setId(id);
contactDao.delete(contact);
System.out.println(Contact # + id + removed.);
}

private void list() {


System.out.println(\nContacts:\n);
for (Contact contact : contactDao.list()) {
System.out.println(# + contact.getId() + - + contact.getName());
}
System.out.println();
}

private void quit() {


System.out.println(Quitting application...);
running = false;
}

private void search(String term) {


System.out.println(\nResults for \ + term + \:\n);
for (Contact contact : contactDao.search(term)) {
System.out.println(# + contact.getId() + - + contact.getName());
}
System.out.println();
}

Listagem 7. Classe ConnectionHelper alterada para utilizar uma base


PostgreSQL.

package br.com.easyjava.examples.mycontacts.dao.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class ConnectionHelper {
public static Connection getConnection() throws SQLException {
String url = jdbc:postgresql://localhost:5432/test_jdbc;
return DriverManager.getConnection(url, postgres, 123456);
}
}

public static void main(String[] args) {


new Application().start();
}
}

na mquina local (localhost),


na porta 5432 (porta padro
do PostgreSQL), utilizando
o usurio postgres e a senha
123456.
- Em uma aplicao real podemos
deixar os parmetros de conexo em
um arquivo de propriedades. Dessa
forma no preciso recompilar o
cdigo.

JDBC e Frameworks de
Mapeamento ObjetoRelacional

Figura 2. Screenshot da aplicao exemplo

22 Easy Java Magazine Edio 03

Com o surgimento dos


frameworks de mapeamento objeto-relacional (ORM),
como Hibernate, TopLink
e a prpria JPA. O uso da
JDBC teve uma queda considervel. Com o uso desses
frameworks, eliminamos
do cdigo das aplicaes
a dependncia direta com
as tabelas das bases de dados. Tambm eliminamos
a necessidade de executar
consultas SQL no cdigo da
aplicao. Utilizando um
framework ORM podemos

simplesmente invocar um mtodo save()


passando um objeto (User, por exemplo) e
o framework capaz de criar uma instruo SQL INSERT mapeando os atributos
desse objeto nos campos da tabela de
forma automtica.
Entretanto entender o funcionamento da
JDBC continua sendo importante, pois os
frameworks ORM utilizam a JDBC para
acessar as bases de dados. Isso fcil de
ser visto nos arquivos de configurao, ou
mesmo nos mtodos de conexo desses
frameworks, que geralmente tm um parmetro para informar a URL de conexo
com a base de dados.
Alm disso, possvel que em algumas
aplicaes seja necessrio o uso da JDBC,
seja por ser uma aplicao legada, por
questes de desempenho ou qualquer
outro motivo.

Concluso
Nesta segunda parte do nosso artigo
sobre JDBC, finalizamos a construo da
Agenda de Contatos mostrando na prtica
como realizar operaes bsicas de manipulao de dados, como criar, editar, listar
e excluir. Para por prova a portabilidade
da JDBC, simulamos uma situao de troca
de base de dados e vimos que uma vez que
a aplicao tenha sido construda de forma

planejada, quase no temos impacto no


que diz respeito a este tipo de mudana.
Vimos ainda o quanto criar uma aplicao
no estilo linha de Comando pode ser
fcil, por meio do uso da biblioteca Apache
Commons CLI.
Portanto, aps a leitura deste artigo o
leitor estar apto para desenvolver aplicaes Java utilizando bancos de dados.
Para concluir, recomendados a leitura do
quadro JDBC e Frameworks de Mapeamento Objeto-Relacional, que mostra um
pequeno resumo da relao entre a JDBC
e os frameworks ORM, to utilizados nas
aplicaes atuais.

Paulo Csar Coutinho


pcmnac@gmail.com
www.pcmnac.com
mestrando em Engenharia de
Software pelo Centro de Estudos e Sistemas Avanados do Recife (C.E.S.A.R).
Atualmente, atua como analista de desenvolvimento de
sistemas no SERPRO. Tem experincia no desenvolvimento e projeto de aplicaes/componentes Java, C/C++ e
Flex. Possui as certificaes SCJP 5 e SCWCD 1.4.

http://java.sun.com/javase/6/docs/
technotes/guides/jdbc/
Documentao Oficial do JDBC.
http://www.mysql.com/downloads/mysql/
Site para download do MySQL Server.
http://www.mysql.com/downloads/workbench/
Site para download do MySQL Workbench.
http://www.mysql.com/downloads/connector/j/
Site para download do driver JDBC do MySQL.
http://www.postgresql.org/download/
Site para download do PostgreSQL.
http://jdbc.postgresql.org/download.html
Site para download do driver JDBC do
PostgreSQL.
http://commons.apache.org/cli/
Site oficial do Apache Commons CLI.

Edio 03 Easy Java Magazine

23

Aprendendo POO e
Explore POO e Java de maneira interativa e visu

as universidades, muitas tentativas so feitas a fim de tornar a


programao orientada a objetos
(POO) menos abstrata e terica. Diferentes
tcnicas e ferramentas tm sido utilizadas
com o propsito de dar ao estudante experincias comprometidas e concretas com
objetos, dentre elas apresenta-se o Greenfoot. Este um ambiente que combina
um framework para criao de cenrios
bidimensionais em Java e um ambiente
de desenvolvimento integrado (IDE, com
class browser, editor, compilador, execuo, etc.) adequado para programadores
iniciantes. Embora o Greenfoot suporte
todas as caractersticas da linguagem
Java, especialmente til para exerccios
de programao que apresentem algum
elemento visual.
As suas caractersticas principais so a
visualizao dos objetos e interao entre
os mesmos. Para aqueles que conhecem a
ferramenta BlueJ1 e algum framework de
micro-mundo como Karel the Robot2 ,
Greenfoot rene o que h de melhor em
cada uma deles: interao entre os objetos
(BlueJ) e visualizao de objetos (micromundos).
O Greenfoot resultado da continuao
do projeto de pesquisa voltado ao aprendizado da Orientao a Objetos (OO) para
alunos de graduao, desenvolvido pela
Deakin University (Austrlia) e University of Kent (Inglaterra), com contribuio
de outros grupos de diferentes pases.
Foi criado por Poul Henriksen e Michael
Klling (responsvel pelo BlueJ) e hoje
um projeto suportado pela Sun Microsystems.

1 Java Magazine Edio 37 (Introduo ao BlueJ).


2 Mais informaes em: http://csis.pace.edu/~bergin/
karel.html.

24 Easy Java Magazine Edio 03

Resumo DevMan
De que se trata o artigo:
Apresentao dos recursos didticos oferecidos pela IDE Greenfoot. Esta ferramenta traz como benefcio
tornar a programao orientada a objetos menos abstrata e terica e incrementar o estudo da linguagem
de programao Java.

Para que serve:


Fornecer a programadores iniciantes uma experincia concreta com objetos atravs de um maior envolvimento nos estudos da linguagem de programao Java e do paradigma orientado a objetos.

Em que situao o tema til:


Alm de ser uma boa alternativa de aprendizado de Java e POO, permite a gerao de problemas para
desenvolvedores inexperientes fazendo uso de cenrios visuais e com grande interatividade.

Aprendendo POO e Java:


Oferecer uma aprendizagem de Java com experincia mais concreta e apresentar o paradigma orientado a objetos sem muita abstrao so os principais benefcios da IDE Greenfoot: um projeto suportado
pela Sun Microsystems e que vem ganhando espao no meio acadmico com pblico-alvo direcionado
a programadores iniciantes.
Atravs de um exemplo simples definido com um cenrio de simulao de trfego rodovirio, permite-se
desenvolver com esta ferramenta objetos que sero os seus atores (veculos e semforos). Tambm sero
destacados neste mesmo cenrio, conhecimentos a cerca de classes, objetos, herana, polimorfismo e
interface. A interatividade e a representao visual dos objetos so os pontos fortes deste ambiente de
programao.

O ambiente Greenfoot
A IDE gratuita, porm no aberta.
Existe a proteo de copyright mantida na
definio do ambiente por seus criadores,
mas todos os cdigos-fonte pertencentes
aos cenrios so abertos e podem ser estendidos. Greenfoot apresenta um tutorial
online e disponibilizado para download
em greenfoot.org. Ainda neste portal so
dispostos instaladores para Windows, Mac
OS X e um JAR executvel para qualquer
outro sistema operacional com a mquina
virtual Java instalada. Para execuo
necessrio ter um JDK na verso 1.5.X ou
1.6.X (no Windows Vista, apenas a partir
desta ltima verso que o Greenfoot tornase compatvel).

No Greenfoot, todo projeto considerado


um cenrio no qual sero inseridos os atores. Este cenrio considerado um mundo

Figura 1. Interface principal do Greenfoot

Java
al com Greenfoot
Ilis Cavalcante de Paula Jnior
para a atuao dos objetos (instncia dos
atores). Ao iniciar o cenrio wombats (j disponvel aps a instalao da IDE) pode-se
observar a disposio dos componentes do
ambiente na sua interface principal (veja a
Figura 1). O Class Browser com as classes
abstratas World e Actor j previamente
definido e vai ampliando de acordo com as
novas classes criadas no cenrio. Usando
de herana, as classes mais recentes so
definidas a partir das iniciais, como no
exemplo: WombatWorld herda da classe World,
enquanto que Wombat e Leaf herdam de Actor.
Os atributos dos objetos podem ser definidos pelo Object Inspector (no presente na
figura) e os mtodos podem ser invocados
atravs de cliques do mouse, inclusive a
instncia de novos objetos com o construtor da classe selecionada.

Criando um cenrio no Greenfoot


Para criar um novo cenrio, deve-se
acessar Scenario>New no menu principal.
Ser apresentado aqui o processo de criao de um novo cenrio a partir de um
estudo de caso que simula um trfego
fictcio com a presena de semforos e
carros que possuem movimentos prdeterminados. Os carros a serem definidos e seus movimentos so especificados
na Figura 2. Sero definidas as classes
TrafegoWorld, Semaforo, Carro, Ambulancia,
CarroAzul, CarroVerde e CarroVermelho, sendo
que a classe Carro ser abstrata para a
modelagem dos elementos comuns s
suas subclasses.
Para inserir uma nova classe no cenrio
existem duas formas, sendo que a mais
direta ao clique na opo Edit>New
Class no menu principal. Uma caixa de
dilogo surge e permitir a descrio
do nome da classe a ser criada. Aps
esta etapa a classe exibida de forma
grfica no Class Browser e posicionada

Figura 2. Comportamento dos atores deste cenrio


no campo Other classes com uma representao da mesma. Com a opo Open
editor ao clicar com o boto direito do
mouse na classe, pode-se ento definir
o cdigo desta ou alterar sua definio
para subclasse de alguma classe j existente no cenrio, ou at a descrio de
uma interface.
A outra maneira de se criar uma classe
melhor direcionada ao conceito de herana em POO: selecione uma das classes
abstratas j descritas no cenrio (World
ou Actor) e, ao clicar com o boto direito
do mouse, acesse a opo New Subclass.
Neste momento apresenta-se uma nova
caixa de dilogo permitindo desta vez a
descrio do nome da classe e uma imagem para represent-la no Class Browser
com os relacionamentos de herana entre
as classes j formatados. So apresentadas aqui sugestes de imagens utilizadas nos cenrios j existentes. Com
isso possvel criar as sete classes da
simulao, como mostrado na Figura 3
(a modelagem das classes com relacionamento de heranas). Algumas das

Figura 3. Modelagem das classes


imagens utilizadas neste novo cenrio j
esto presentes na categoria de imagens
transport do Greenfoot.3
- permitido que se adicione novas imagens ao
cenrio trabalhado. No Greenfoot pode-se trabalhar
com diferentes formatos de imagens. O ideal que
apresentem fundo transparente: os formatos GIF e
PNG so mais adequados.

3 Todas as imagens e o prprio cenrio esto disponveis para download em: http://www.greenfootgallery.org/scenarios/842

Edio 03 Easy Java Magazine

25

Aprendendo POO e Java

Figura 4. Editor do BlueJ

Figura 5. Hierarquia dos atores

As relaes de herana definidas na criao das classes


podem ser modificadas atravs
do cdigo fonte de cada uma.
Para acessar a edio do cdigo,
o Greenfoot faz uso do editor de
cdigo do BlueJ. Neste editor so
definidos os atributos, mtodos,
importaes de pacotes (principalmente a prpria API Greenfoot), compilao, depurao e
a gerao do JavaDoc da classe
tratada (Figura 4). Para isso
existe a sincronizao entre as
duas ferramentas: modificaes
nos cdigos dispostos no editor
do BlueJ sero percebidas na visualizao
do cenrio do Greenfoot.
O cenrio utilizado como exemplo neste
artigo apresenta os atores especificados na
Figura 5. A primeira classe a ser criada ser
Semaforo. O cdigo fonte da mesma est
presente na Listagem 1. Esta classe herda
as caractersticas de Actor e tem os atributos
contador e passagemLivre. O primeiro atributo armazena a passagem do tempo para
mudana da cor do sinal (a cada 20 rodadas
de execuo modifica-se o semforo para sinalizao de aberto ou fechado) e o segundo
indica ao carro, que acessou o semforo, se
este pode passar adiante ou no.

A questo referente s rodadas do


atributo contador est ligada ao mtodo
act() presente nas classes definidas. Este
mtodo obrigatoriamente declarado e
sobrescrito em todas as classes, forando
um polimorfismo de incluso, e executado em todos os atores ao mesmo tempo
em cada momento de execuo. Ou seja,
a ao dos objetos presentes ao cenrio
ocorre com a chamada do mtodo act()
do prprio cenrio e em seguida de todos
os demais objetos dispostos. Essa execuo simultnea dos mtodos de ao por
parte de todos considerada uma rodada
de execuo.
Ainda em Semaforo, o mtodo construtor
da classe inicializa o atributo contador
e define aleatoriamente se o semforo
surgir aberto ou fechado. O mtodo act()
traz o incremento do contador de rodadas
e a mudana do status do semforo. Isso
significa que em cada rodada de execuo
incrementado o contador do semforo e
verificado seu valor para mudana de status aberto para fechado, ou vice-versa.
A Listagem 2 apresenta o cdigo fonte
da classe abstrata Carro. Esta classe especializa Actor e tem os atributos sentido,
carroDireita e carroEsquerda. O primeiro
atributo armazena o sentido assumido pelo
objeto em sua representao no cenrio e os

Listagem 1. Classe Semaforo: representao de um semforo

import greenfoot.*; // importa Actor, World, Greenfoot, GreenfootImage


public class Semaforo extends Actor {
private int contador;
private boolean passagemLivre;

public Semaforo() {
setContador(0);
if(Math.round(Math.random()*1) == 0) {
setPassagemLivre(false);
setImage(semaforo-fechado.gif);
}
else {
setPassagemLivre(true);
setImage(semaforo-aberto.gif);
}
}
public void act() {
setContador(getContador()+1);
if(getContador()%20 == 0) {
if(getPassagemLivre()) {
setPassagemLivre(false);
setImage(semaforo-fechado.gif);
}

26 Easy Java Magazine Edio 03

else {
setPassagemLivre(true);
setImage(semaforo-aberto.gif);
}

public void setContador(int valor) {


this.contador = (valor >= 0 ? valor : 0);
}
public int getContador() {
return this.contador;
}
public void setPassagemLivre(boolean status) {
this.passagemLivre = status;
}

public boolean getPassagemLivre() {


return this.passagemLivre;
}

demais indicam o posicionamento do carro


no sentido da direita e da esquerda, respectivamente. O mtodo construtor da classe
apenas inicializa os atributos. J o mtodo
act() trabalha com todos os demais mtodos
definidos em Carro: em cada rodada de execuo verifica se h um objeto semforo na
mesma clula em que o objeto do carro est
presente, com o mtodo achouSemaforo();
em caso positivo, verifica se o semforo

permite a passagem ou no do carro com


verificaSemaforo(), seno tenta seguir em
frente. Caso o objeto carro possa seguir no
seu caminho h o teste se o objeto encontra
a borda do cenrio com podeMover() e direciona para qual sentido se movimenta o carro a partir do mtodo mover(). No instante
que o objeto em questo no pode se mover
no sentido desejado, gira-se o mesmo em
um sentido aleatrio (com girarRandom()) e

faz-se uma nova verificao do movimento


do carro. De modo geral, em cada rodada de
execuo, o objeto da classe Carro para no
instante em que encontra um sinal vermelho, ou segue adiante (no sentido em que for
possvel na ocorrncia de encontrar borda)
quando o objeto da classe Semaforo indica
sinal verde.
A Listagem 3 exibe a classe Ambulancia,
que especializa Carro. Na sua descrio

Listagem 2. Classe abstrata Carro.

import greenfoot.*;
public abstract class Carro extends Actor {
private static final int LESTE = 0;
private static final int OESTE = 1;
private static final int NORTE = 2;
private static final int SUL = 3;

private int sentido;


private GreenfootImage carroDireita;
private GreenfootImage carroEsquerda;

public boolean podeMover() {


boolean resultado = true;
World myWorld = getWorld();
int x = getX();
int y = getY();
switch(sentido) {
case SUL : y++; break;
case LESTE : x++; break;
case NORTE : y--; break;
case OESTE : x--; break;
}
// testa para borda do cenrio
if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) {
return false;
}
else if (x < 0 || y < 0) {
return false;
}
return resultado;
}

public Carro() {
carroDireita = getImage();
carroEsquerda = new GreenfootImage(getImage());
carroEsquerda.mirrorHorizontally();
setSentido(LESTE);
}
public void act() {
if(achouSemaforo()) {
verificaSemaforo();
}
else
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}

public void girarRandom() {


int giros = Greenfoot.getRandomNumber(4);
for(int i=0; i<giros; i++) {
girarEsquerda();
}
}

public boolean achouSemaforo() {


Actor semaforo = getOneObjectAtOffset(0, 0, Semaforo.class);
if(semaforo != null) {
return true;
}
else {
return false;
}
}

public void girarEsquerda() {


switch(sentido) {
case SUL : setSentido(LESTE); break;
case LESTE : setSentido(NORTE); break;
case NORTE : setSentido(OESTE); break;
case OESTE : setSentido(SUL); break;
}
}

public void verificaSemaforo() {


Actor semaforo = getOneObjectAtOffset(0, 0, Semaforo.class);
if( ((Semaforo) semaforo).getPassagemLivre() ) {
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}
}
public void mover() {
if (!podeMover()) {
return;

}
switch(sentido) {
case SUL : setLocation(getX(), getY() + 1); break;
case LESTE : setLocation(getX() + 1, getY()); break;
case NORTE : setLocation(getX(), getY() - 1); break;
case OESTE : setLocation(getX() - 1, getY()); break;
}

public void setSentido(int sent) {


this.sentido = sent;
switch(sentido) {
case SUL : setImage(carroDireita); setRotation(90); break;
case LESTE : setImage(carroDireita); setRotation(0); break;
case NORTE : setImage(carroEsquerda); setRotation(90); break;
case OESTE : setImage(carroEsquerda); setRotation(0); break;
default : break;
}
}

Edio 03 Easy Java Magazine

27

Aprendendo POO e Java

Listagem 3. Classe Ambulancia: representao de uma


ambulncia

import greenfoot.*;
public class Ambulancia extends Carro {
public Ambulancia() {
}
public void act() {
if(achouSemaforo()) {
verificaSemaforo();
}
else
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}

public void verificaSemaforo() {


// nenhum semforo deve ser considerado!
- prioridade no trfego para ambulncia...
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}

Listagem 4. Classe CarroVermelho: representao de um carro


com cor vermelha

import greenfoot.*;
public class CarroVermelho extends Carro {
public CarroVermelho() {
}

public void act() {


if(achouSemaforo()) {
verificaSemaforo();
}
else
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}
public void verificaSemaforo() {
Actor semaforo = getOneObjectAtOffset
(0, 0, Semaforo.class);
if( ((Semaforo) semaforo).getPassagemLivre() ) {
girarEsquerda();
if(podeMover()) {
mover();
}
else {
girarRandom();
}
}
}

28 Easy Java Magazine Edio 03

apresentam-se apenas os mtodos


act() e verificaSemaforo(). A implementao do mtodo act() se resume
mesma da classe Carro. Como j
mencionado, faz-se obrigatria a
definio deste mtodo em todas
as classes que representam atores.
Isso implica em uma redefinio
do mtodo em todas as subclasses
de Actor. J no mtodo verificaSemaforo() teremos a diferenciao
desta classe para os demais atores
a serem definidos. Diferentemente
da classe Carro, nenhum objeto de
Semaforo verificado. Resumindo,
no importa se o objeto da classe
Semaforo indica sinal vermelho, o
objeto da classe Ambulancia seguir
seu caminho.
A Listagem 4 mostra o cdigo
fonte referente classe CarroVermelho.
Descreve-se para esta especializao de Carro tambm apenas os
mtodos act() e verificaSemaforo().
A implementao do primeiro
mtodo se resume mesma da
superclasse. No segundo mtodo,
verificaSemaforo(), define-se qual o
sentido a ser tomado pelo objeto
desta classe no momento em que
o objeto da classe Semaforo indicar
que a sua passagem est livre.
Para este modelo de carro, o movimento especificado direcionado
para a esquerda. Enfim, o objeto
tratado verifica se permitido
passar adiante quando encontra
um objeto de Semaforo e, em caso
afirmativo, o mesmo rotacionado
para a esquerda e segue em frente
(se possvel).

A implementao das classes CarroVerde


e CarroAzul segue descrio semelhante
classe definida anteriormente. A diferena est no sentido tomado por cada uma
ao encontrar permisso para passar de
um objeto da classe Semaforo. Na classe
CarroVerde, o objeto rotacionado 180 de
tal forma que obriga ao mesmo voltar no
sentido contrrio. Em CarroAzul, o objeto
rotacionado de certa maneira que se posicione para a direita e siga adiante. Estes
comportamentos precisam ser modificados apenas no mtodo verificaSemaforo() de
acordo com os movimentos dispostos na
Figura 6.
O cenrio trabalhado cria um micromundo representativo de um simples
modelo de trfego. A especializao deste
mundo, descrito na classe TrafegoWorld,
especificada na Figura 7. O cdigo fonte da mesma est presente na Listagem
5. No seu construtor implementada
a montagem do cenrio visualizado. A
chamada ao construtor da superclasse
indica, respectivamente, a largura e altura
do cenrio por quantidade de clulas a
serem dispostas e a dimenso de cada
uma destas. Estas clulas so estruturas
oriundas da diviso da tela como uma
matriz: 3x3, 5x5, 9x9, etc. nas quais aplicada a mesma imagem de fundo para cada
uma delas e que geram o background do
cenrio. Para finalizar a implementao
do construtor, apresenta-se a chamada ao
mtodo populate(). Este ltimo mtodo
gera uma populao com nmero fixo de
atores (um objeto da classe CarroVermelho, um de CarroVerde, um de CarroAzul,
um de Ambulancia e nove objetos da
classe Semaforo) no cenrio com os atores
distribudos por toda a sua rea.

Figura 6. Comportamento de um carro ao aplicar o mtodo girarEsquerda() repetidas vezes

Ao final de TrafegoWorld, h ainda a


declarao do mtodo semaforosAleatorios(). A partir de um valor inteiro passado
pelo seu argumento, distribui de maneira
aleatria no cenrio uma quantidade de
objetos de Semaforo. Este mtodo pode ser
invocado com um simples clique no seu
objeto, indicado pelo nome trafegoWorld,
disposto na interface principal quando
esta classe corretamente compilada.
Alm do que foi apresentado, podemos
ainda realizar modificaes depois que
as classes so definidas. Sugere-se aqui a
insero de um enum na classe Carro, nomeado Sentidos, que descarta as constantes
privadas presentes nesta mesma classe e
as torna pblicas. O cdigo fonte pode
ser acompanhado na Listagem 6. Consequentemente a esta mudana, a classe
Carro afetada diretamente de tal maneira
que seu cdigo alterado em muitos de
seus mtodos.

Executando o Cenrio
Para executar o trabalho feito at aqui,
necessrio que todas as classes estejam

compiladas. A interface principal dispe


de um boto Compile all que realiza esse
passo em todas as classes e indicando os
erros existentes nos cdigos e/ou dependncias das mesmas. No editor de cdigo
h a opo de compilao para cada classe
individualmente.
- Por algumas vezes, em cada compilao de um
cdigo presente no editor pode haver a necessidade
de compilao de mais classes do cenrio. Isso ocorre
normalmente quando uma superclasse modificada.
As suas subclasses no so compiladas automaticamente, de tal maneira que necessrio clicar em
Compile all da interface principal para efetuar a
atualizao destas classes. As classes que sofrem

Como exibido atravs da Figura 8, o clique


do mouse torna visvel atravs de um
menu pop-up os mtodos pertinentes
classe selecionada. J na Figura 9, observase a seleo do mtodo construtor de um
dos atores (no caso, a classe Ambulancia). Esta
ao permite instanciar um objeto, que
no Greenfoot representado pela gerao
da imagem correspondente ao ator em
questo. Este objeto pode ser posicionado
em qualquer clula do cenrio. Aqui h a
visualizao do objeto como a representao de uma classe: a partir de uma nica
classe, vrios objetos podem ser instanciados e todos seguiro os comportamentos
definidos pela primeira.

alguma alterao no cdigo, ou ainda no foram


salvas, o Greenfoot marca com linhas diagonais em
sua representao.

Aps esta etapa, possvel instanciar


objetos clicando numa classe com o boto
direito e selecionando um dos construtores
possveis. No exemplo tratado, houve a
definio de apenas um construtor (sem
argumentos) nas classes trabalhadas.

Figura 7. Hierarquia dos mundos

Listagem 5. Classe TrafegoWorld: representao do ambiente de trfego.

import greenfoot.*;

Semaforo s4 = new Semaforo();


addObject(s4, 8, 7);

public class TrafegoWorld extends World {


public TrafegoWorld() {
super(9, 9, 65);
setBackground(sand.jpg);
populate();
}

Semaforo s5 = new Semaforo();


addObject(s5, 4, 1);
Semaforo s6 = new Semaforo();
addObject(s6, 4, 7);

public void gerarPopulacao() {


CarroVermelho cVm = new CarroVermelho();
addObject(cVm, 4, 0);
// posiciona o objeto por [coluna,linha]

Semaforo s7 = new Semaforo();


addObject(s7, 4, 4);
Semaforo s8 = new Semaforo();
addObject(s8, 0, 4);

CarroVerde cVd = new CarroVerde();


addObject(cVd, 4, 8);
CarroAzul cAz = new CarroAzul();
addObject(cAz, 0, 4);

Ambulancia ambulancia = new Ambulancia();


addObject(ambulancia, 4, 4);
Semaforo s1 = new Semaforo();
addObject(s1, 0, 1);
Semaforo s2 = new Semaforo();
addObject(s2, 8, 1);
Semaforo s3 = new Semaforo();
addObject(s3, 0, 7);

Semaforo s9 = new Semaforo();


addObject(s9, 8, 4);

public void semaforosAleatorios


(int numSemaforos) {
for(int i=0; i<numSemaforos; i++) {
Semaforo s = new Semaforo();
int x = Greenfoot.getRandomNumber
(getWidth());
int y = Greenfoot.getRandomNumber
(getHeight());
addObject(s, x, y);
}
}

Edio 03 Easy Java Magazine

29

Aprendendo POO e Java

Listagem 6. Cdigo da nova classe Carro

import greenfoot.*;
public abstract class Carro extends Actor {
. . . //definio dos atributos
private Sentidos sentido;
public enum Sentidos {EAST, WEST, NORTH, SOUTH} //; opcional
public Carro() {
...
setSentido(Sentidos.LESTE);
}

int x = getX();
int y = getY();
switch(sentido) {
case SUL : y++; break;
case LESTE : x++; break;
case NORTE : y--; break;
case OESTE : x--; break;
}
// testa para borda do cenrio
if (x >= myWorld.getWidth() || y >= myWorld.getHeight()) {
return false;
}
else if (x < 0 || y < 0) {
return false;
}
return resultado;

public void act() {


...
}

public boolean achouSemaforo() {


...
}

public void girarRandom() {


...
}

public void verificaSemaforo() {


...
}

public void girarEsquerda() {


switch(sentido) {
case SUL : setSentido(Sentidos.LESTE); break;
case LESTE : setSentido(Sentidos.NORTE); break;
case NORTE : setSentido(Sentidos.OESTE); break;
case OESTE : setSentido(Sentidos.SUL); break;
}
}

public void mover() {


if (!podeMover()) {
return;
}
switch(sentido) {
case SUL : setLocation(getX(), getY() + 1); break;
case LESTE : setLocation(getX() + 1, getY()); break;
case NORTE : setLocation(getX(), getY() - 1); break;
case OESTE : setLocation(getX() - 1, getY()); break;
}
}
public boolean podeMover() {
boolean resultado = true;
World myWorld = getWorld();

public void setSentido(Sentidos sent) {


this.sentido = sent;
switch(sentido) {
case SUL : setImage(carroDireita); setRotation(90); break;
case LESTE : setImage(carroDireita); setRotation(0); break;
case NORTE : setImage(carroEsquerda); setRotation(90); break;
case OESTE : setImage(carroEsquerda); setRotation(0); break;
default : break;
}
}

Figura 8. Executando um mtodo do objeto trafegoWorld


- Na ocorrncia de se trabalhar com um cenrio
desbloqueado, isto quando o(s) autor(es) do cenrio
permite(m) que se interfira na interao dos atores,
permitido instanciar um novo objeto e inseri-lo no
cenrio durante a sua execuo. Caso contrrio, este
procedimento permitido apenas antes do incio da
execuo. Essa caracterstica definida em fase de
projeto e distribuio do cenrio.

Quanto aos mtodos que possuem parmetros, suas descries so apresentadas


quando o mesmo selecionado na classe,

30 Easy Java Magazine Edio 03

sendo exibida uma nova janela ao usurio.


Nesse instante, devem-se informar os
valores que sero assumidos pelos parmetros e confirmar para sua execuo (veja
a Figura 10).
Para execuo do cenrio, deve-se clicar
em Act para efetuar as aes definidas nos
mtodos act() presentes em cada classe. H
a possibilidade de invocar o boto Act por
repetidas vezes a partir de uma velocidade
prevista. Isso acontece com o uso do boto
Run: funciona como a seleo intermitente

Figura 9. Instanciao de um novo objeto a partir do construtor de Ambulancia


do boto Act controlada pela velocidade
na barra Speed. Ainda como boto de ao,
temos o Pause, que surge substituindo
Run quando este clicado e para momentaneamente a execuo, e Reset, que tem
por objetivo o reincio da execuo do
cenrio ao seu momento inicial. Ao efetuar a execuo do cenrio, sero iniciados

Figura 10. Resultado de execuo de um mtodo com


parmetro

Figura 13. Regras de pessoas envolvidas na criao e uso


de micro-mundos. Fonte: Klling, M. e Henriksen, P. Game
Programming in Introductory Courses With Direct State
Manipulation. ITiCSE, 2005.

Figura 11. Quantidade de downloads do BlueJ ao longo


dos anos. Fonte: BlueJ/Greenfoot Day 2009

Figura 12. Quantidade de downloads do Greenfoot ao


longo dos anos. Fonte: BlueJ/Greenfoot Day 2009
os movimentos dos objetos oriundos das
subclasses de Carro e seus comportamentos ao encontrarem as representaes de
semforos ao longo do cenrio.

Concluses
O uso de ferramentas de aprendizagem
de POO vem crescendo nos ltimos anos.
Nota-se, pelo menos com relao aos IDEs
BlueJ e Greenfoot, que a quantidade de

downloads ocorridos s vem aumentando


desde que estes ambientes foram criados.
Em 2009, foi adicionado no evento internacional JavaOne o BlueJ/Greenfoot Day
sua programao geral. Nesta mesma
oportunidade foram apresentados nmeros que confirmam o interesse que estas
IDEs didticas tm gerado. Observa-se nas
Figuras 11 e 12 o incremento no total de
instaladores baixados por clientes destas
ferramentas. A evoluo do Greenfoot
mais abrupta: em trs anos de disponibilizao j superou os 200.000 downloads
em um nico ano.
Alm da excelente documentao, Greenfoot possui um ativo grupo de usurios
que inclui principalmente professores e
alunos que no se limitam apenas aos de
nvel universitrio, incluindo tambm os
de nveis mais bsicos. Em seu site oficial
so disponibilizados tutoriais, artigos, dissertaes e diversos cenrios para estudo
e aplicao em sala de aula. H uma seo
nomeada Geenfoot Gallery que dispe de
cenrios criados por diversos usurios,
de diferentes regies do mundo, sendo

estes cenrios livres (muitos tambm so


abertos) e disponveis para execuo de
diferentes metodologias.
A aplicao do Greenfoot para o estudo
da Programao Orientada a Objetos e
Java segue um roteiro diferente de outras
aplicaes didticas mais conhecidas
como micro-mundos (veja a Figura 13). O
cenrio a ser aplicado durante o estudo
pode se diversificar de acordo com a implementao do professor e, a partir disso,
exerccios distintos podem ser produzidos.
E ainda, a prpria criao de cenrios pode
ser tratada como um exerccio aos alunos
em um nvel mais avanado. A liberdade
permitida pelo Greenfoot na criao de
prticas direcionadas ao paradigma OO
e a nfase na linguagem de programao
Java vm destacando esta ferramenta nos
cursos de programao.
Ilis Cavalcante
ialis@ufc.br
professor do Curso de Engenharia da Computao na UFC
- Campus de Sobral. Tem experincia
na rea de processamento digital de
imagens, atua em disciplinas voltadas programao
de computadores e coordena um grupo de estudos
direcionado s certificaes Java em sua instituio de
ensino.

greenfoot.org
Site oficial do Greenfoot
greenfootgallery.org
Greenfoot Gallery Repositrio de Cenrios
osum.sun.com/group/greenfoot
Comunidade do Greenfoot no OSUM
www.bluej.org/bluej-greenfoot-day
Site oficial do evento BlueJ/Greenfoot Day

Edio 03 Easy Java Magazine

31

Dicas de Produtividade
com IDEs
Ronaldo Caldas da Silva

uitos usurios novos ou experientes tm dvidas sobre


como as IDEs podem ajud-los
a obter um cdigo mais limpo, rpido e
eficiente. Veremos na prtica a utilizao
das diversas ferramentas que auxiliam o
programador nesta tarefa. Muitos conhecem atalhos e completadores de cdigos,
mas os benefcios da utilizao das IDEs
vo muito alm disso. Atualmente as
principais IDEs do mercado, NetBeans e
Eclipse, disponibilizam opes de debugging (depurao), refactoring (refatorao)
e diversas outras funcionalidades como
macros e ferramentas de resoluo de
problemas.

Conhecendo nossas opes


Na Edio 53 da Java Magazine o colega
Osvaldo Pinali demonstrou no artigo
Eclipse X NetBeans diversas caractersticas das verses do Eclipse Europa
e NetBeans 6.0. Foram apresentados os
principais conceitos e forma de trabalho
de cada IDE, analisando desde a filosofia
das empresas que as desenvolvem ao perfil
do programador.
Em projetos de software, variveis como
tempo, custo e produtividade so cada
vez mais importantes em um ramo to
competitivo como o nosso. Alm disso,
o programador no deve se esquecer da
clareza e qualidade do cdigo. Por esses
motivos, torna-se necessria uma busca
constante por novas tcnicas e possibilidades para aumentar a produtividade no
processo de codificao.
Este artigo, assim como o dele, no
tem o intuito de definir qual a melhor
IDE, mas sim demonstrar atravs de diversos atributos qual IDE pode ser mais
interessante ao programador. Para isso,
utilizaremos como IDEs o Eclipse Helios
e o NetBeans 6.9 (veja as Figuras 1 e 2).

32 Easy Java Magazine Edio 03

Resumo DevMan
De que se trata o artigo:
O artigo apresenta um resumo de funcionalidades, ferramentas e dicas de como otimizar o trabalho de
codificao com as principais IDEs Java: NetBeans e Eclipse.

Para que serve:


Diminuir o trabalho com tarefas repetitivas, tornar o cdigo mais limpo e claro, ajudar a encontrar e resolver
problemas mais rapidamente, e possibilitar uma manuteno de cdigo menos complicada.

Em que situao o tema til:


Como as IDEs so as principais ferramentas do programador, o conhecimento de tcnicas de automao
facilita a produo de cdigo com mais clareza e qualidade, diminuindo o trabalho braal e favorecendo
a manuteno posterior.

Mas independente de verso, os conceitos


aqui demonstrados valem para as verses
anteriores das duas IDEs.
Sero abordados temas como atalhos
de teclado, auto-completar de cdigo,
debugging, utilizao de macros e personalizao. Mesmo sendo tpicos bsicos,
muitos usurios mais experientes tambm
podero usufruir de algumas dicas que
podem ser bastante teis no dia-dia do
programador.

Atalhos e auto-complete de cdigo


Os atalhos e a funo de auto-complemento de cdigo so artifcios para construir declaraes sem a necessidade de
nos preocupar com a escrita integral da
sentena ou a utilizao do mouse. Dessa
forma, a codificao torna-se mais rpida e
ganhamos preciosos segundos evitando a
criao (no brao) de algumas estruturas
mais avanadas da linguagem.

NetBeans
Os atalhos no NetBeans podem ser encontrados no menu Ferramentas > Opes
e clicando no cone Mapa de teclas, como
mostra a Figura 3.

possvel verificar quais so os atalhos


utilizados e adicionar outros que desejar.
Assim como, possvel escolher por atalhos de verses anteriores do NetBeans,
como a 5.5, ou at mesmo do Eclipse. Alguns atalhos valem a pena serem destacados, como os de navegao. Ao selecionar o
menu Navegar encontramos vrias opes
de procura por parmetros, escolhendo Ir
para tipo, uma extenso de arquivo pode
ser escrita e o resultado da pesquisa exibe
todos os arquivos desse tipo. Se a pesquisa por determinado mtodo, podemos
escolher Ir para smbolo. Dessa forma o
resultado mostra todas as classes onde o
mtodo chamado. A Figura 4 apresenta
estas opes.
Em todas as opes podem ser utilizados os coringas * e ? e escolher pela
distino entre maiscula e minscula
(case sensitive). Outro atalho nessa linha
o CTRL + TAB, que organiza os arquivos
para o usurio na ordem em que eles foram
visualizados antes, o que facilita a vida
daquele programador que trabalha em
vrias classes diferentes e simplesmente
quer voltar para a ltima classe editada.
O NetBeans possui o recurso de auto-

Figura 1. Tela inicial do NetBeans 6.9

Figura 2. Tela inicial do Eclipse Helios

Figura 3. Tela de mapa de caracteres


completar cdigo para as diversas linguagens suportadas pela IDE. Essa opo
pode ser acionada pelo menu Ferramentas >
Opes e selecionando no item Editor a aba
Auto-completar de cdigo. No NetBeans
tal recurso funciona com o comando CTRL
+ Space. Tambm existe o auto-completar
automtico, que acionado toda vez que o
usurio digita um caractere especial por
default o ponto . (veja a Figura 5).
Tambm possvel adicionar outros caracteres para esta funcionalidade, como: ,
; : ( [ + - = . Assim, quando qualquer um
deles for digitado, um pop-up aparecer
perguntando qual complemento de cdigo
deve ser utilizado.
O NetBeans ainda possui uma ferramenta de modelos de cdigo, que pode ser vista
na Figura 6.
Modelos ou templates de cdigo, so
pequenas abreviaes que ao digitadas
e pressionada a tecla TAB, constroem

uma estrutura mais complexa de cdigo.


Essa estrutura pode ser desde uma simples
declarao de varivel at uma estrutura
de repetio, como for ou while.
O menu de Templates pode ser acionado
em Ferramentas > Opes, selecionando
o item Editor > Modelos de cdigo. Existem vrios exemplos de template na IDE,
possibilitando a alterao dos existentes
ou adio de novos. Vejamos o exemplo
da abreviao pm. Ao digit-lo e pressionar TAB, o editor fornece a seguinte
construo:
private void method() {
}

Analisando o texto expandido da abreviao pm na aba Modelos de cdigo, temos o contedo mostrado na Listagem 1.
Os templates so escritos utilizando variveis que recebem um valor padro que
pode ser modificado quando o modelo

Figura 4. Menu de atalhos de Navegao.


Listagem 1. Texto expandido do template pm.

public ${ret default=void} ${mname


default=method}(${args default=}) {
${cursor}
}

chamado. Neste exemplo, tem como retorno void, e method como nome do mtodo.
O cursor tambm pode ser posicionado
utilizando a declarao ${cursor}.
Para demonstrar este recurso, criaremos um pequeno exemplo para automatizar a criao de variveis do tipo String.
Para isso, atravs do menu de criao
de templates Ferramentas > Opes,
selecione no item Editor a aba Modelos
de cdigo. Em seguida clique no boto

Edio 03 Easy Java Magazine

33

Dicas de Produtividade com IDEs

exibido contendo os atalhos e modelos


de cdigo do NetBeans.

Eclipse

Figura 5. Opes de auto-completar cdigo.

Figura 6. Tela de Modelos de cdigo


Listagem 2. Cdigo para criao do template psv.

private String ${OBJ newVarName default=minhaString


}${cursor};
public ${retorno1 default=String} ${mnome1
default=getString editable=true}(${args default=}){
return this.${OBJ};
}
public ${retorno2 default=void} ${mnome2
default=setString editable=true}(${retorno1
type=String default=minhaString editable=true} ){
this.${OBJ} = ${OBJ};
}

Novo e informe o atalho que vai corresponder ao novo modelo, no nosso caso
psv. Esse atalho vai criar uma varivel
do tipo private String e colocar um nome
default (minhaString) que poder ser

34 Easy Java Magazine Edio 03

editvel. O cursor se posicionar


em m i n haSt ri ng. Seg ui ndo o
padro do pm, adicionamos no
campo Texto expandido o seguinte cdigo:
private String ${OBJ newVarName default=
minhaString}${cursor};

Nesse mesmo local, podemos


avanar e j determinar que sejam
criados os mtodos get e set correspondentes, como pode ser visto na
Listagem 2.
Uma lista completa com todos os modelos pode ser obtida pelo menu Ajuda
> Carto de atalhos do teclado. Ao acessar
esse menu, um arquivo em formato PDF

No Eclipse os atalhos funcionam de forma


um pouco diferente. Nesta IDE eles so
divididos em categorias, ou seja, dependendo de onde voc estiver trabalhando no
editor (especificado na Tabela 1 pela coluna
Quando em), o atalho produzir um resultado diferente. Por exemplo, se executar
o atalho Shift + Alt + R na tela de tarefas
(Task List) o Eclipse marca a tarefa como
lida, caso selecione alguma varivel e faa
a mesma ao na edio de arquivos JSP
ou JavaScript o elemento ser renomeado.
Assim como no NetBeans, no Eclipse tambm existem atalhos que acessam funes
de navegao de algumas funcionalidades
dos menus. Geralmente os mais usados so
os atalhos de edio de cdigo.
Para utiliz-los deve-se verificar a sua
categoria e quando podem ser executados,
e ento pressionar as teclas correspondentes. A lista completa de atalhos pode ser
acessada pelo menu Window > Preferences.
Aps isso, a tela de preferncias ser exibida. Na rvore General escolha o item Key. A
Figura 7 mostra a janela de atalhos.
O Eclipse tambm tem seus modelos/
templates de cdigo, que so acessados pelo
menu Window > Preferences e escolhendo
Editor > Templates na rvore, como mostra
a Figura 8.
No NetBeans, por exemplo, para escrever
a String Ol mundo com System.out.println,
o usurio pode usar o modelo de cdigo
sout e pressionar a tecla TAB. Com o
Eclipse podemos utilizar o assistente de
cdigo para atribuir determinado modelo
a uma parte do cdigo. Por exemplo, digite
a String Ol mundo, selecione-a e use
o atalho CTRL + Space para visualizar
todos os templates disponveis. Pressione
- e ENTER para escolher a ltima opo.
Assim o assistente escrever System.out.
println(String). Tambm possvel ter
o mesmo resultado se escrevermos o
template sysout, posicionar o cursor no
final da palavra, pressionar CTRL + Space
e escolher a primeira opo.
Da mesma forma, estruturas try/catch
podem ser criadas digitando try e uti-

Figura 7. Tela de Atalhos do Eclipse


lizando o assistente de cdigo com CTRL
+ Space. Assim fica fcil pensar na lgica
do problema, escrever o cdigo interno e
utilizar esse recurso para compor o try/catch. Tambm possvel criar rotinas de repetio for/while selecionando o trecho que
deve ser repetido e utilizando o assistente
de cdigo para completar a declarao.
Agora criaremos um novo modelo o
mesmo exemplo que vimos no NetBeans.
Para isso devemos clicar em New e colocar seu nome, contexto, descrio que
ser mostrada ao utilizar o assistente de
cdigo e o Pattern de criao, de acordo
com a Figura 9.
O Eclipse tambm dispe de atalhos que
auxiliam a navegao, e tem a mesmas
funcionalidades apresentadas no NetBeans, possibilitando a busca e navegao de
arquivos facilmente (veja a Figura 10).

Debugger
Debugger ou debugar/depurar cdigo
simplesmente o processo de passar por todo
o cdigo verificando seu comportamento,
o famoso e milenar teste de mesa das
primeiras aulas de programao. Muitos
programadores utilizam do artifcio System.
out.println para imprimir o valor de alguma
varivel teimosa que insiste em no receber o valor que voc quer. Confesso que
por vezes tambm utilizei esse recurso,
mas nem sempre as dvidas que ocorrem

Figura 8. Tela de Templates do Eclipse.


so simplesmente valores de variveis. Um
exemplo disso a necessidade de saber por
onde o programa est
indo, quais mtodos ou
expresses foram chamados e quando foram
executados. Usando o
debugger o programador
pode executar o programa linha por linha Figura 9. Tela de criao de Templates de cdigo do Eclipse.
enquanto examina seu
comportamento.
Vrios usurios no conhecem ou tm
preguia de utilizar o debugger, contudo
certamente essa ferramenta merece ateno especial e pode ajudar o programador
a resolver problemas mais facilmente.

NetBeans
O NetBeans possui uma ferramenta de
debugger muito eficiente com diversas
opes que facilitam o monitoramento
de tudo o que acontece no programa.
Uma dessas opes o uso de pontos de
interrupo (breakpoints) e observadores
de cdigo.
Um ponto de interrupo um local
marcado no cdigo que faz com que o
debugger pare quando encontrar sua ocorrncia. Quando encontrado o ponto de
interrupo, possvel verificar o valor

Figura 10. Menu de atalhos de navegao do Eclipse


Edio 03 Easy Java Magazine

35

Dicas de Produtividade com IDEs

Quando em

Comando

Atalho

Categoria

Cdigo Fonte

Mostrar hierarquia do objeto

Ctrl + T

Edio de cdigo Java

Cdigo Fonte

Adicionar Importao

Shift + Ctrl + M

Edio de cdigo Java

Cdigo Fonte

Adicionar Bloco de Comentrio

Shift + Ctrl + /

Edio de cdigo Java

Cdigo Fonte

Identar Cdigo

Shift + Ctrl + F

Edio de cdigo Java

Cdigo Fonte

Remover Bloco de comentrio

Shift + Ctrl + \

Edio de cdigo JavaScript

Tabela 1. Exemplos de atalhos utilizados no Eclipse.

Figura 11. Exemplo de ponto de interrupo no NetBeans

linha do cdigo. O ponto de interrupo


denotado por um quadrado rosa que
substitui o nmero da linha, como pode
ser visto na Figura 11.
Para remover um ponto de interrupo
simplesmente clique no quadrado novamente, ou clique em Janela > Depurando
e em Pontos de parada. Uma nova aba ser
includa na parte inferior do NetBeans.
Nela podemos ver todos os pontos de
interrupo do cdigo, desabilit-los ou
exclu-los.
Os observadores (watches) funcionam
de forma parecida e em conjunto com
os pontos de interrupo. Com eles
possvel inspecionar uma determinada
varivel ou expresso durante a execuo
do programa.
Uma forma fcil de verificar o valor de
uma varivel passar o mouse sobre ela.
Assim o depurador ir exibir o valor da
varivel perto de onde o cursor estiver posicionado. Para adicionar um observador,
selecione a varivel ou expresso e acesse
o menu Depurar > Novo observador, ou utilize o atalho CTRL + SHIFT + F7. A cada
ponto de interrupo encontrado a janela
de observadores ser atualizada, exibindo
o valor atual da expresso ou da varivel
marcada, como mostra a Figura 12.
Todos os itens que podem ser analisados atravs de depurao, como pontos
de interrupo, variveis, observadores
e threads, podem ser monitorados atravs
do menu Janela > Depurando.

Eclipse

Figura 12. Tela de depurao com o uso de pontos de observao no NetBeans.


das variveis ou continuar a execuo do
programa linha por linha.
Para inserir um ponto de interrupo
primeiro determine a partir de qual linha
quer analisar, aps isso pode-se escolher

36 Easy Java Magazine Edio 03

entre trs maneiras para adicion-lo ao


cdigo. Pelo menu Depurar > Novo ponto
de interrupo, usar o atalho CTRL + SHIFT
+ F8 ou ainda clicar sobre o nmero na
coluna cinza a esquerda correspondente

O Eclipse possui um debugger bastante


intuitivo, e o uso de perspectivas (caracterstica marcante desta IDE) ajuda o programador a identificar erros e analisar mais
facilmente o cdigo. Da mesma maneira
que no NetBeans, o debugger do Eclipse
possibilita a visualizao das variveis em
diferentes pontos do programa e verificar
seu comportamento linha a linha.
Para adicionar um ponto de interrupo
d um duplo clique na margem cinza correspondente linha desejada. No Eclipse os
pontos de interrupo so denotados por um
pequeno crculo azul (veja a Figura 13).
Acessando o menu Run > Debug Configurations possvel criar configuraes,

determinar variveis como verso de JRE,


classpath e criar um ambiente de debugging
personalizado para cada tipo de projeto.
Por exemplo, uma aplicao foi feita com
uma verso atualizada de uma biblioteca
X, porm no servidor as bibliotecas utilizadas so de verses anteriores. Com a
criao de novos parmetros de debugging
o usurio pode simular diversas situaes
para o mesmo projeto, no tendo que
recri-los somente para testar uma nova
verso de biblioteca ou se ele executar
normalmente se usado em um servidor
diferente. A Figura 14 mostra as opes de
configurao disponveis para debug.

Diferenciais de cada IDE


Uma dvida sempre esteve presente
na cabea dos programadores, qual a
melhor IDE: NetBeans ou Eclipse? Como
explicitado no incio, este artigo no tem
a pretenso de apontar a melhor ou pior
alternativa, e sim demonstrar as vrias
particularidades de cada uma, deixando a
cargo do leitor determinar qual se enquadra melhor s suas necessidades.

Figura 13. Perspectiva de Debugging do Eclipse.

NetBeans
O NetBeans possui uma ferramenta de
criao de rotinas repetitivas, as macros.
Elas so um recurso para automatizar
passos que podem ser acionados atravs
de atalhos do teclado. Se no seu cdigo
existe uma ao ou processo repetitivo,
este recurso pode ser empregado para
facilitar esse trabalho duro. Ao criar
uma, o NetBeans observa a srie de passos que foram executados e grava esses
passos. Quando necessria a execuo
do mesmo comportamento em outros
trechos de cdigo, o usurio pressiona
o atalho atribudo macro e ela refaz o
comportamento previamente gravado.
Um exemplo comum de uso para as
macros substituir uma palavra por
outra palavra formatada seguindo determinado padro. Imagine o exemplo de
uma classe DAO que implementa vrias
queries e que no usa preparedStatement.
Deste modo as consultas SQL devem
ser escritas utilizando \ no comeo e
final do nome de coluna da tabela, como
mostra na Listagem 3.

Figura 14. Opes de Debugging do Eclipse


Essa tarefa de substituio tornava-se
cansativa medida que novas consultas
eram implementadas, e dependendo do
tamanho da query, este trabalho ficava
ainda mais difcil e suscetvel a erros. Mesmo utilizando ferramentas como pgAdmin,
que possibilitam a criao de consultas

Listagem 3. Exemplo de consulta SQL formatada.

SELECT \LOGIN_CFFTB001\, \
NIVEL_CFFTB001\, \NOME_CFFTB001\,
\UNIDADE_CFFTB001\
FROM \CFFTB001_USUARIOS\;

Edio 03 Easy Java Magazine

37

Dicas de Produtividade com IDEs

mais facilmente, com recursos grficos de


drag-and-drop, em consultas muito longas
onde so necessrios joins ou sub consultas
em vrias tabelas distintas, cansativo
adicionar a barra para cada elemento da

Figura 15. Boto de gravao de macros no NetBeans

query. Com isso, as macros caram como


uma luva no processo de reescrita de cdigo e fez o processo se tornar mais simples
e automtico.
Nossa macro dever adicionar uma \
depois da primeira aspa e antes
da segunda, conforme o exemplo:
\LOGIN_CFFTB001\.
Para criao da macro devemos
realizar os seguintes passos:
1. Escreva a String LOGIN_CFFTB001, contendo as aspas duplas;
2. Posicione o cursor no fim da
String;
3. Clique no boto de gravar
macro, que representado por
um boto vermelho logo acima do
editor (ver Figura 15);
4. Mova o cursor at o comeo
da String, antes da aspa;
5. Adicione a barra \ antes
da primeira aspa e faa o mesmo
com a segunda;
6. Clique no boto parar gravao.

Figura 16. Exemplo de criao de atalho de macro

Aps esse processo ser solicitado um nome para a macro.


Feito isso, adicione um atalho
para ela, como na Figura 16, que
foi escolhido CTRL + NUMPAD

9. Para utilizar a macro posicione o cursor


no final de qualquer String e aperte o atalho
escolhido.
O NetBeans tambm possui um recurso
muito bom para aquele programador que
gostaria de voltar no tempo e recuperar
o cdigo de uma data ou horrio. Para
isso, selecione o menu Equipe > Histrico
Local. Acessando esse item ser exibida a
janela de histrico com o cdigo atual e o
antigo. As mudanas de um para o outro
so denotadas atravs de setas, conforme
a Figura 17. Esse recurso pode ser usado
para recuperar mudanas em pacotes ou
projetos inteiros.

Eclipse
O uso de perspectivas no Eclipse um
recurso muito interessante. Com ele
possvel mudar a cara da IDE dependendo do tipo de projeto, por exemplo, se
o objetivo for a criao de um projeto web,
novas janelas so apresentadas na IDE,
possibilitando a criao de tags arrastando
e soltando componentes JSF de uma paleta;
o mesmo acontece se a necessidade for
para editar arquivos CSS ou simplesmente
depurao. O Eclipse j vem com algumas
perspectivas instaladas e a adio de novas
feita atravs da instalao de plugins,
criando novas telas, menus e opes customizadas.
As perspectivas do Eclipse podem ser
compreendidas como modificaes na organizao dos elementos da interface para
facilitar o trabalho em cada etapa do desenvolvimento (seja para web, desktop, mobile,
depurao, entre outros). Na Figura 18
o visual do Eclipse muda totalmente, personalizando o layout para projetos Seam
com o plugin do JBoss Tools. Com essa
perspectiva possvel fazer a edio visual
de paginas web e a criao de componentes
do RichFaces, Facelets e Seam. Na Figura 19
temos o exemplo de outra perspectiva;
dessa vez, voltada para o desenvolvimento
de aplicaes Android.

Concluses

Figura 17. Recuperando o histrico das mudanas do cdigo no NetBeans

38 Easy Java Magazine Edio 03

claro que essas duas IDEs possuem


pontos negativos. Podemos citar, por
exemplo, a necessidade de um hardware
melhor para a execuo do NetBeans. J o

Eclipse, apesar de ser mais leve, tem como


desvantagem o fato de vir mais cru que
seu concorrente. Muitas vezes necessria
a instalao de plugins para realizar determinadas tarefas, o que acaba se tornando
uma dificuldade para novos usurios.
O NetBeans, por vir mais completo e
ser mais fcil adicionar plugins, facilita a
iniciao do programador que quer um
ambiente mais amigvel. J o Eclipse,
por ser mais aberto, tem mais opes de
plugins e ferramentas de terceiros, o que
o torna mais dinmico e possibilita uma
maior customizao da IDE, sendo esta
uma das principais caractersticas desde
a sua criao em 2001.
Como vimos, NetBeans e Eclipse tm
timas opes de funcionalidades para
que o programador codifique mais rpido,
tornando seu cdigo mais claro e evitando
retrabalho. Com isso tambm ganha-se
em manuteno, pois com o cdigo mais
limpo mais fcil identificar e resolver
problemas.

Figura 18. Perspectiva para projetos Seam com o plugin JBoss Tools do Eclipse.

Ronaldo Caldas da Silva


ronaldocaldas@gmail.com.br
javaelinux.wordpress.com
bacharel em Cincia da Computao pela Universidade Estadual do
Centro-Oeste no Paran, e atualmente
desenvolvedor Java Web trabalhando com JSF e RichFaces em aplicaes bancrias na Teledata Tecnologia em
Conectividade.

http://netbeans.org/kb/index.htm
Site que contm diversos tutoriais e
documentao sobre o NetBeans
http://www.eclipse.org/documentation/
Possui vasta documentao sobre todas as
verses do Eclipse.

Figura 19. Perspectiva para projetos Android com o plugin ADT do Eclipse.

Livros
Desenvolvendo Aplicaes WEB com NetBeans
IDE, Edson Gonalves, Cincia Moderna, 2008
Aborda diversos temas como JSP, Servlets, JSF,
JSTL e padres de desenvolvimento utilizando
NetBeans.

Edio 03 Easy Java Magazine

39

Dicas de Produtividade com IDEs

40 Easy Java Magazine Edio 03