easy java 0033453453578

Upload: mauro-ferreira-de-lima

Post on 07-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 Easy Java 0033453453578

    1/40

  • 8/18/2019 Easy Java 0033453453578

    2/40

  • 8/18/2019 Easy Java 0033453453578

    3/40

    Sumário

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

    [Core] Técnicas Server-side, ferramentas, IDEs, e outros assuntosque fogem às demais categorias.

    [Banco de Dados/Persistência] Artigo sobre o universo depersistência de dados.

    [Web] Artigos sobre ou que envolvam técnicas de desenvolvimen-

    to para WEB.

    Olá, eu sou o DevMan! Desta página em diante, eu estarei lhe

    ajudando a compreender com ainda mais facilidade o conteúdo

    desta edição. Será um prazer contar com sua companhia!

    Confira abaixo o que teremos nesta revista:

    [Minicurso] Série de artigos apresentando o desenvolvimentode aplicações e/ou o ensinamento de tecnologias Java.

    Banco de Dados/Per-

    sistência, Minicurso

    17 – Java Database Connectivity (JDBC)Persistindo dados em Java – Parte 2[ Paulo César Coutinho ]

    Tutorial, Core 24 – Aprendendo POO e JavaExplore POO e Java de maneira interativa e visual com Greenfoot[ Iális Cavalcante ]

    Boas Práticas, Tutorial32 – Dicas de Produtividade com IDEsComo aproveitar as funcionalidades do NetBeans e Eclipse[ Ronaldo Caldas da Silva ]

    Core, Web11 – Minha primeira aplicação web com JSFComo utilizar JSF 2 em uma aplicação Java para web[ Luiz Sanches ]

    Tutorial, Core 05 – Revisando Estruturas de RepetiçãoConheça as principais estruturas de repetição do Java[  Mauro Pichiliani  ]

  • 8/18/2019 Easy Java 0033453453578

    4/40

    Editorial

    EdiçãoEditor

    Eduardo Spínola ([email protected])

    Arte

    Capa e Diagramação Romulo Araujo ([email protected])

    ProduçãoGerência de Marketing Kaline Dolabella ([email protected])

     Jornalista Responsável Kaline Dolabella - JP24185

    Revisão e Supervisão Thiago Vincenzo ([email protected])

    Coordenação Geral Daniella Costa ([email protected])

    Atendimento ao leitorA DevMedia possui uma Central de Atendimento on-line, onde você podetirar suas dúvidas sobre serviços, enviar críticas e sugestões e falar com um denossos atendentes. Através da nossa central também é possível alterar dadoscadastrais, consultar o status de assinaturas e conferir a data de envio de suasrevistas. Acesse www.devmedia.com.br/central, ou se preferir entre em

    contato conosco através do telefone 21 3382-5038.

    PublicidadeCristiany Queiroz

     [email protected]   – 21 3382-5038

    Anúncios – Anunciando nas publicações e nos sites do Grupo DevMedia, vocêdivulga sua marca ou produto para mais de 100 mil desenvolvedores de todo oBrasil, em mais de 200 cidades. Solicite nossos Media Kits, com detalhes sobrepreços e formatos de anúncios.

    Ano I • Edição 03 • 2010

    Fale com o Editor!

    É muito importante para a equipe saber oque você está achando da revista: que tipode artigo você gostaria de ler,que artigo vocêmais gostou e qual artigo você menos gostou.Fique a vontade para entrar em contato comos editores e dar a sua sugestão!Se você estiver interessado em publicar

    um artigo na revista ou no site Easy JavaMagazine, entre em contato com o editor,informando o título e mini-resumo do temaque você gostaria de publicar:

    Eduardo Spínola - Editor da [email protected]

    Após as duas primeiras edições, avançaremos um pouco mais na linguageme apresentaremos o primeiro artigo sobre uma das grandes forças do Java, o

    desenvolvimento web. Antigamente, tudo que um desenvolvedor iniciante

    gostaria de fazer, era criar sua primeira aplicação desktop. Hoje, o principal objetivo é

    implementar a primeira aplicação voltada para a web.

    Neste contexto, Minha primeira aplicação web com JSF  expõe, de forma simples,

    como encarar o desafio de criar sistemas que possam ser acessados de qualquer lugar do

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

    Faces. Para enriquecer o conteúdo abordado, veja o vídeo desta matéria, que ensina os

    primeiros passos no desenvolvimento web com a IDE NetBeans.

    Na Easy Java Magazine de número 2, iniciamos um minicurso sobre JDBC, e agora

    vamos concluí-lo. Assim, você conhecerá praticamente tudo o que precisa saber sobre estetema que representa uma base tão importante para os mecanismos de persistência. Em

    Java Database Connectivity – Parte 2, criaremos as últimas funcionalidades e a interface

    com o usuário da nossa agenda de contatos. Além disso, na vídeo aula, demonstraremos

    como tirar proveito de statements pré-definidos para parametrizar nossas queries e evitar

    SQL Injection.

    Agora, que tal conhecer as estruturas de repetição? Revisando Estruturas de Repetição

    destaca outro ponto indispensável a qualquer programador. O domínio sobre este tema

    possibilitará a codificação de sistemas evitando a repetição de código. No vídeo deste

    artigo veremos, na prática, como usar as principais opções que a linguagem oferece.

    Um assunto ainda pouco comentado em nossas páginas digitais é o ambiente de

    desenvolvimento. Se para iniciarmos os estudos é recomendado por as mãos na massa

    em ferramentas que não forneçam tantas funcionalidades, para alcançar desempenho

    e qualidade em nossos códigos, uma IDE robusta é fundamental. E foi pensando nisso

    que elaboramos o conteúdo Dicas de Produtividade com IDEs , onde veremos como

    aproveitar alguns recursos do NetBeans e do Eclipse.

    A última matéria, Aprendendo POO e Java , nos ensina como estudar a Programação

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

    ambiente que mais vem sendo utilizado para isso. Se você não se sente a vontade com

    termos como abstração, herança, interface, polimorfismo, entre outros, após conhecer

    esta ferramenta, programar se tornará muito mais simples e divertido.

    Deste modo, chegamos ao final da terceira edição da Easy Java.

    Boa leitura e até a próxima!

    Eduardo Oliveira Spínola

    [email protected]

    twitter.com/Java_Magazine

  • 8/18/2019 Easy Java 0033453453578

    5/40Edição 03 • Easy Java Magazine  5

    MAURO PICHILIANI

    Revisando Estruturas de

    Repetição

    De que se trata o artigo: 

    Apresenta uma discussão de diversos aspectos relacionados à utilização de estruturas de repetição para

    quem está começando a trabalhar com Java.

    Para que serve: 

    O conteúdo apresentado neste artigo serve como um guia para auxiliar tanto professores de progra-mação como alunos iniciantes.

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

    O tema é útil para aqueles que estão ministrando ou participando de um curso introdutório de Java e

    desejam revisar o conceito de estruturas de repetição.

    Resumo DevManAprogramação de computadoresnormalmente requer que o pro-fissional seja capaz de manipularcom precisão diversas estruturas, coman-dos e recursos específicos das linguagensde programação. Dentre os diversos co-mandos disponíveis é preciso conhecer e

    saber manipular bem aqueles que alteramo fluxo de execução dos programas, sen-do as estruturas de repetição o principalrecurso para o programador reaproveitardiversas linhas do seu código fonte.

    Este artigo tem como objetivo apresentaruma revisão das principais estruturas derepetição do Java para quem está começan-do a programar nesta linguagem de pro-gramação e ainda está se familiarizandocom a forma de estruturar logicamente umprograma. O artigo discute o conceito das

    estruturas, seus usos, implicações, riscos etambém detalhes específicos das sintaxesdestas estruturas no Java.

    Estruturas de repetiçãoAntes de começar a tratar sobre as

    estruturas de repetição é importantecompreender corretamente um conceitofundamental para qualquer profissionalque deseja trabalhar com a linguagem deprogramação Java: o conceito de fluxo deexecução.

    O fluxo de execução é abordado logono início dos cursos de introdução à pro-gramação ou de lógica de programação.A compreensão correta deste conceito émuito importante, pois uma vez que oaluno saiba bem como o programa seráexecutado ele deve ser capaz de estru-turar seus algoritmos baseados em umasequência lógica de passos. Normalmentea apresentação de algoritmos, fluxos deexecução e sequência de passos são rea-lizados por meio de soluções sistemáticas

    para problemas do dia a dia, como trocar

    um pneu de um carro, tarefas aserem realizadas após acordar,preparação de uma receita culi-nária, etc. A Figura 1 mostra um

    exemplo inicial de algoritmo emlinguagem natural que descreveos passos para a realização de umaligação telefônica em um telefonepúblico.

    O algoritmo apresentado naFigura 1  apresenta três tipos im-portantes de controle de fluxo: a)sequencial, representado pelos passos de1 a 4; b) desvio condicional, representadopelos passos 5 e 6; e c) Repetição, represen-tado pelo passo 6.1.

    A partir do conceito de fluxo de execu-ção e de passos lógicos é possível montardiversos algoritmos para resolver umproblema. Como pode ser visto pelas setasda Figura 1 , o fluxo de execução sequen-cial pode ser alterado por uma estruturade desvio, como o passo 5, ou por umaestrutura de repetição. Em geral, os trêstipos de fluxo de execução mais comuns(sequencial, desvio e repetição) encontra-dos em um algoritmo são mostrados naFigura 2 , onde os fluxos são representados

    por setas.

    Figura 1. Exemplo de algoritmo e fluxo de execução

    Apesar de existirem variações, comoas execuções simultâneas de mais deum fluxo encontradas em algoritmos deprogramação concorrente, as três setas

    apresentadas na Figura 2  demonstramcomo os passos de um algoritmo podemser executados. Obviamente, é possível

  • 8/18/2019 Easy Java 0033453453578

    6/40

    Revisando Estruturas de Repetição

    6 Easy Java Magazine • Edição 03

    combinar e encadear os três tipos de fluxo,porém neste artigo nos concentraremos

    apenas no fluxo repetitivo de execução.Quando falamos sobre programas é natu-

    ral implementar a lógica definida do algo-ritmo em uma linguagem de programaçãoe isso vale também para a forma de con-trolar o fluxo de execução. As linguagensde programação mais utilizadas, como o

     Java, contam com estruturas de repetiçãopara permitir ao desenvolvedor reutilizarlinhas de código por meio da repetiçãodo fluxo de execução do programa. É co-mum utilizar o termo loop para se referir

    a uma estrutura de repetição genérica enão entrar nos seus detalhes internos defuncionamento, como o uso de variáveiscontadoras, limites, etc. A propósito, o usodo termo loop é uma referência à estruturade uma montanha russa que faz com queseus ocupantes percorram um círculocompleto, ou seja, 360º, como mostradona Figura 3.

    Cada linguagem de programação possuiestruturas de controle implementadas pormeio de comandos específicos ou palavras

    chaves da linguagem como, por exemplo,

    Figura 2. Três tipos possíveis de fluxo de execução em umalgoritmo

    loop , while ,  for , do , do while , etc. Antes decomeçar a falar especificamente sobre oscomandos do Java para implementar estru-turas de repetição é importante tirar um

    pouco as mãos do teclado e refletir sobre aimportância, implicações e consequênciasdo uso de estruturas de repetição.

    A principal importância é a reutilizaçãodo código. Com estruturas de repetiçãopode-se executar a mesma linha de pro-gramação mais de uma vez. Isso é algo co-mum desde a linguagem de máquina mais

     básica, como o assembly, até as linguagens(ou outras maneiras de se programar ocomputador) mais recentes. Além disso,também é possível executar diversas ve-

    zes a mesma linha de programação comuma pequena variação em cada execuçãoque indique qual é o número ‘da vez’ quese está executando. Este recurso é muitopoderoso e, sob um ponto de vista fun-damental, as ínfimas velocidades com asquais os processadores mais atuais conse-guem executar instruções é o que permiteao computador realizar o trabalho ‘braçal’de repetição e nos auxiliar em todas astarefas que realizamos por meio do usode um software.

    Porém aqui vale o velho ditado: “comgrandes poderes vêm grandes responsa-

     bilidades”. Se o programador não souberutilizar com responsabilidade o ‘poder’de uma estrutura de repetição ele podesofrer graves consequências. Talvez aconsequência mais comum decorrente douso incorreto de uma estrutura de repe-tição é conhecida como loop  infinito, ouseja, o programador não especificou nema quantidade máxima de repetições naestrutura de repetição e nem uma condição

    possível para que o loop seja terminado.Deste modo o programa, em teoria, ficarárepetindo o mesmo conjunto de instruçõesindefinidamente. Nos tempos primordiaisda programação de computadores issorealmente era um problema. Hoje em diaexistem diversos meios, tanto do sistemaoperacional como do ambiente de execuçãodo programa, para que um programa queesteja em um loop  infinito não consumatodos os recursos disponíveis (memória,processamento, etc.) e possa ser interrom-

    pido por um processo externo.

    Figura 3. Um loop 360º de uma montanha russa

    As implicações do uso de estruturas derepetição acabam envolvendo uma áreamuito importante da computação teórica:a análise de algoritmos, ou seja, o estudo

    dos algoritmos e o consumo de recursosassociado ao desempenho dos algorit-mos. As estruturas de repetição afetamdiretamente o consumo de recursos docomputador, sejam eles relacionados àmemória, processamento, ou armazena-mento em disco. Atualmente já existemmuitas teorias e estudos que abordamtanto classificações de algoritmos (quadrá-tico, exponencial, NP: não determinísticopolinomial, etc.) quanto técnicas para queos algoritmos consumam menos recursos

    (dividir e conquistar, programação dinâ-mica, algoritmos probabilísticos, etc.). Dequalquer forma, o uso correto de estru-turas de repetição pode fazer a diferençaentre um programa que é executado empoucos segundos e um programa quedemora dias, semanas ou meses parafinalizar a sua execução.

    Vale a pena mencionar também que autilização de uma estrutura de repetiçãogeralmente é acompanhada de uma estru-tura de dados como uma lista, matriz, array,

    arraylist, vetor, ou outra estrutura internada linguagem de programação que permitea manipulação de diversos tipos de dadosagrupados. É muito comum utilizar umaestrutura de repetição para percorrer oselementos da estrutura de dados ou para re-alizar alguma operação para cada elementotais como leituras ou gravações dos valoresarmazenados. Estruturas de repetição tam-

     bém permitem a criação de blocos de códigodelimitados e quase sempre são utilizadas

     junto com as estruturas condicionais, seja

    para especificar a quantidade máxima derepetições ou para indicar que após certonúmero de repetições é preciso fazer algumconjunto de instruções de forma diferente.O termo iteração é utilizado para indicarcada ciclo da estrutura de repetição, visan-do enumerar a quantidade de vezes que o

     bloco dentro da estrutura já foi utilizado.Por exemplo, se o fluxo do programa estána iteração cinco isso quer dizer que o

     bloco de instruções dentro da estrutura jáfoi executado quatro vezes e esta é a quinta

    execução do bloco.

  • 8/18/2019 Easy Java 0033453453578

    7/40Edição 03 • Easy Java Magazine  7

    Estruturas de repetição em JavaApós conhecer a teoria das estruturas de

    repetição, veremos quais são os principaiscomandos em Java que implementam este

    recurso. Existem diversas variações dasestruturas de repetição, porém uma dasmais simples é representada pelo comandowhile. Este comando requer uma expressão

     booleana que será verificada antes de cadaiteração ser iniciada. Note que o comandowhile não possui nenhum tipo de contadorassociado e se o programador necessitarde um contador ele deve implementá-lopor meio de uma variável adequada. AListagem 1 apresenta um exemplo de umprograma em Java que faz uso de um co-

    mando while. Este programa gera númerosaleatórios entre 0 e 4 e os imprime na telaenquanto os números aleatórios geradosforem diferentes de 0.

    No exemplo apresentado pela Listagem 1 a expressão booleana utilizada no coman-do while  é verificada antes do fluxo deexecução entrar na primeira iteração demodo que, dependendo do valor geradopela expressão colocada na variável valor ,é possível que nenhuma iteração seja reali-zada. Nota-se que este exemplo não utiliza

    uma variável contadora e que a quantidadede iterações efetivamente realizada peloprograma é incerta até o momento daexecução. Existem variações do coman-do while que permitem a execução de aomenos uma iteração, pois a verificaçãoda expressão booleana é colocada após o

     bloco de instruções.Para situações onde a quantidade de ite-

    rações da estrutura de repetição é conheci-da, ou pelo menos se tem uma noção destaquantidade, é recomendada a utilização

    da estrutura de repetição for , que possuiuma variável contadora associada. Deve-seindicar uma inicialização desta variável,a expressão booleana que será verificadaantes do início de cada iteração e tambémo passo que atualiza a variável contadora.É comum utilizar no passo um incrementoou decremento representados pelos ope-radores unários ++ e -- , respectivamente,colocados junto à variável contadora. AListagem 2  contém um exemplo de umprograma que utiliza um contador for da

    seguinte maneira: quando a quantidade

    Listagem 1. Exemplo simples do comando whileem 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. Demonstração simples do comandofor  em Java

    public class ExemploFor{  public static void main(String[] args)

      {

      if (args.length > 0 )  {  for(int j=0; j

  • 8/18/2019 Easy Java 0033453453578

    8/40

    Revisando Estruturas de Repetição

    8 Easy Java Magazine • Edição 03

    Listagem 4. Uso do comando for  para percorrer objetos noestilo foreach

    public class ExemploForeach{  public static void main(String[] args){

      String[] nomes = { “Altrano”, “Beltrano”,“Celtrano”, “Deltrano” };

      // Percorrendo os elementos do tipo Stringarmazenados

     // no vetor nomes  for( String s : nomes )

    {  System.out.println(s);  }  }}

    Listagem 5. Trecho de código que exemplifica o uso dopadrão de projetos Iterator .

    …ObjectGroup groupOfObjects = new ObjectGroup ();Iterator it = Iterator.iteratorFor ( groupOfObjects ) ;

     // O método hasMore() retorna verdadeiro se houvermais elementos ou

     // falso caso contráriowhile ( it.hasMore() ){ // O método current() retorna um objeto genérico, que

    precisa ser convertido // para o objeto que compõe os membros da coleção  Object obj = it.current();…

    }

    N o t a d o D e v M a n

    Padrão de Projeto: Padrões de projeto de software oupadrões de design de software, também muito conhecido pelotermo original em inglês: Design Patterns, descrevem soluçõespara problemas recorrentes no desenvolvimento de sistemas desoftware orientados a objetos. Um padrão de projeto estabeleceum nome e define o problema, a solução, quando aplicar estasolução e suas consequências. Os padrões de projeto visamfacilitar a reutilização de soluções de design – isto é, soluçõesna fase de projeto do software, sem considerar reutilização decódigo. Também acarretam um vocabulário comum de design,facilitando a comunicação, documentação e aprendizado dossistemas de software.

    iterações do loop. A Listagem 5 apresentaum trecho de código que mostra como opadrão de projeto Iterator pode ser utiliza-do. Este código é apenas um trecho de um

    exemplo incompleto, porém o conjunto declasses do Java está recheado de estruturasde dados que implementam o padrão deprojeto Iterator. O leitor que se interessarmais por este assunto pode encontrar maisinformações em um dos artigos da seçãode referências.

    Outro recurso da linguagem relacionadoao uso de loops que apresenta dificuldadepara programadores que estão iniciandoem Java é o uso de genéricos. Este recursofoi adicionado recentemente ao Java e está

    diretamente relacionado com o tipo dedados de uma coleção e o que é precisofazer para percorrer esta coleção comuma estrutura de repetição. A principalmotivação para o uso de genéricos é anecessidade de se realizar casting no tipode dados da estrutura quando era preci-so recuperar os dados da coleção. Destamaneira havia uma probabilidade muito

    grande do programador cometer umerro, uma vez que o compilador do

     Java não faz verif icação dos t ipos de

    dados na compilação quando se utilizao casting. Com o uso de genéricos ascoleções devem ser tipadas, ou seja,deve-se utilizar estruturas de dados

    N o t a d o D e v M a n

    Casting: Casting é a conversão de objetos ou tipos primitivosde um tipo para outro tipo. Ao se tratar casting, considera-sea necessidade de conversão explícita entre tipos – o que,potencialmente, pode causar perdas de informação. Valeressaltar que não é obrigatório fazer casting de um valor deum dado tipo primitivo para um tipo primitivo maior, pois estacategoria de conversão é sempre permitida. Salienta-se que,em Java, o casting de tipos primitivos é aplicável a todos, excetoao tipo boolean (para o qual, não se pode fazer casting de umboolean para qualquer outro tipo e vice-versa)

    que não sejam genéricas e sim que jácontenham o tipo correto. A Listagem 6 mostra um trecho de código de exemploonde se utiliza genéricos para percorrer

    uma estrutura de dados. Novamente, o lei-tor que deseja se aprofundar em genéricospode encontrar mais informações em umdos artigos da seção de referências.

    For fim, vale a pena lembrar que o uso deuma estrutura de repetição também podeser representada dentro de um diagramade sequência da UML. Por exemplo, aFigura 4 mostra como um loop que per-corre todos os elementos de uma estruturade dados é representado no diagrama desequência. O objeto chamado render é da

    classe e  OpenGLRender e, de acordo com odiagrama, durante o seu ciclo de vida épreciso percorrer todos os elementos re-tornados pela chamada do método models().Este loop está numerado como 2: foreachmodels() no diagrama e é representadopor uma seta que sai do fluxo de execuçãodo objeto render e volta para ele mesmo.Nota-se também que a especificação doloop no ciclo de vida do objeto adiciona umnovo retângulo que é colocado ao lado di-reito do retângulo original que representa

    o fluxo do ciclo de vida do objeto.A Figura 5  mostra outro diagrama de

    sequência que contém uma referência aum loop. Desta vez o objeto aCustomer , que

    Figura 4. Exemplo de representação de um loop em um diagrama de sequência

  • 8/18/2019 Easy Java 0033453453578

    9/40Edição 03 • Easy Java Magazine  9

    Listagem 6. Trecho de código que exemplifica o uso de genéricos

     // Obtém a coleção Fazendeiro que é dono de galinhas

    Fazendeiro ze=new Fazendeiro(fazenda);

     // Obtém o objeto galinhas da interface Iterator já tipado para o objeto

    Galinha

    Iterator galinhas =ze.pegarGalinhas();

     // O método hasNext() retorna verdadeiro se houver mais elementos ou

     // falso caso contrário

    while(galinhas.hasNext())

    {

      // O método next() retorna um objeto já tipado da classe galinhas

      Galinha galinha=galinhas.next(); // sem fazer casting

      …

    }

    …Figura 5. Segundo exemplo de representação de um loop em um diagrama de sequência

    Dígito Deve-se multiplicar por

    a x10

    b x9

    c x8

    d x7

    e x6

    f x5

    g x4

    h x3

    i x2

    Tabela 1. Valores multiplicativos de acordo com cada dígitopara o verificador j

    representa um cliente em um modelo devídeo locadora, deve fazer um loop paraobter todos os itens que estão alugadospelo cliente em algum momento do ciclode vida do objeto aCustomer. O loop é repre-sentado no diagrama pela seta que apontapara o próprio fluxo de execução e pelotexto * [for all rentals]. Notem que nosexemplos dos diagramas das Figuras 4 e 5 nenhuma indicação é fornecida a respeito

    de qual comando, contador, objeto ou tipode dados deve ser utilizado, pois os diagra-mas da UML são utilizados em um nívelde abstração maior. Os detalhes técnicosutilizados para implementar o loop em Javaque correspondam ao que foi modelado nodiagrama devem ser tratados diretamentepor quem foi realizar a codificação.

    Exercícios de fixaçãoPara auxiliar o leitor que está começando

    a programar em Java, este artigo apresenta

    três exercícios de fixação do conteúdo deestruturas de repetição. Recomenda-seque durante a resolução destes exercícioso leitor primeiro organize mentalmentecomo o algoritmo deve ser implementadoantes de efetivamente criar o programaem Java. Obviamente, existem diversasmaneiras para resolver um mesmo pro-

     blema, e o objetivo dos exercícios aqui écolocar em prática a habilidade de mani-pular estruturas de repetição assim comooutras habilidades necessárias para um

    programador Java.

    1) Monte um programa em Java que verifi-que se um número de CPF fornecido é válidoou não. A regra é a seguinte: o número de umCPF tem exatamente nove algarismos emsua raiz e mais dois dígitos verificadores quesão indicados por último. Portanto, um CPFtem 11 algarismos. O número do CPF é es-crito na forma abcdefghi-jk ou diretamentecomo abcdefghijk , onde os algarismos nãopodem ser todos iguais entre si. Também é

    comum colocar pontos e traços no CPF destamaneira: abc.def.ghi-jk, onde o númerorepresentado pela letra j é chamado 1° dígitoverificador do número do CPF e o númerorepresentado pela letra k é chamado 2° dígitoverificador do número do CPF.

     Regra de cálculo do dígito verificador j:

    Para calcular o valor de j devemos multi-plicar os dígitos a, b, c, d, e, f, g, h e i pelasconstantes correspondentes de acordo coma Tabela 1.

    O resultado da soma, S1 = 10a + 9b + 8c +7d + 6e + 5f + 4g + 3h + 2i é dividido por 11.Em seguida obtém-se o RESTO da divisãode S1 por 11 e verifica-se o seguinte:• O dígito verificador j será igual a zero,se RESTO for igual a 0 ou 1;• O dígito verificador j será igual ao resul-tado da expressão numérica 11– RESTO ,se o valor de RESTO for igual a 2, 3, 4, 5, 6,7, 8, 9 ou 10.

    Regra de cálculo do dígito verificador k:

    Para calcular o valor de k devemos multi-

    plicar os dígitos a, b, c, d, e, f, g, h e i pelasconstantes correspondentes de acordo coma Tabela 2.

    Note que para calcular o dígito verifica-dor k é preciso primeiro calcular o dígitoverificador j. O resultado da soma, S2 = 11a+ 10b + 9c + 8d + 7e + 6f + 5g + 4h + 3i + 2jé dividido por 11. Em seguida obtém-se o

    RESTO da divisão de S2 por 11 e verifica-se o seguinte:• O dígito verificador k será igual a zero,se RESTO for igual a 0 ou 1;• O dígito verificador k será igual ao resul-tado da expressão numérica 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 CPF491.122.534-30 é válido. Nota: este númeronão é o CPF do autor deste artigo! Para o

    cálculo de j temos:

  • 8/18/2019 Easy Java 0033453453578

    10/40

    Revisando Estruturas de Repetição

    10 Easy Java Magazine • Edição 03

    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 oRESTO 8 e, para este RESTO o dígito j é oresultado de [11 - RESTO], portanto, j = 3.Para o cálculo 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 RES-

    TO 1 e, para este RESTO o dígito k é o 0,portanto k = 0.

    Dígito Deve-se multiplicar por

    a x11b x10

    c x9

    d x8

    e x7

    f x6

    g x5

    h x4

    i x3

     j x2

    Tabela 2. Valores multiplicativos de acordo com cada dígitopara o verificador k

    Como o número de CPF fornecido foi:491.122.534-30 e, pelos cálculos, j=3 e k=0temos que este CPF é válido. Dica: Utilize ooperador de módulo (%) para o cálculo do

    resto da divisão e teste seu algoritmo comos valores de diversos CPFs existentes.

    2)  Um número triangular, proposto porGauss em 1788 quando ele tinha somente10 anos de idade, é um número natural quepode ser representado na forma de triân-gulo equilátero. Para encontrar o n-ésimonúmero triangular a partir de um númerotriangular anterior basta somar-lhe n uni-dades de acordo com a Figura 6.

    Baseado nestas informações desenvolva

    um programa em Java que recebe comoparâmetro o valor de n e mostre na tela doconsole a representação gráfica do núme-ro triangular. Faça um loop que coloqueo caractere . (ponto) para representar otriângulo como se fossem as bolinhasvermelhas da Figura 6.

    3) Faça um programa em Java que capten valores do teclado (podem ser numé-ricos ou não). Além disso, obtenha peloteclado um número k. O seu programa

    deve imprimir na tela todas as possíveiscombinações dos n valores organizadosem grupos com k elementos, ou seja:

     

      

     

    n  que quer dizer a combinação de todos os nelementos em grupos de k elementos. Porexemplo: se forem digitados os valores: a ,b e c (n = 3) e se for digitado o valor 3 parak, o programa deve imprimir todas ascombinações dos valores a, b e c com trêselementos em cada grupo sem repetiçõesde 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 resolução dos exercícios de fixação vaifornecer ao leitor uma oportunidade paratestar suas habilidades de programaçãocom as estruturas de repetição do Java.Para auxiliar aqueles que sentirem dificul-dade, o código fonte com uma sugestão desolução para cada um dos três exercícios

    será disponibilizado no site da Easy Java.

    Figura 6. Exemplos de números triangulares e fórmula parao cálculo de elementos do n-ésimo número triangular

    ConclusãoEste artigo apresentou uma pequena

    revisão dos conceitos relacionados àsestruturas de repetição de um algoritmo

    e de um programa. O foco principal doartigo foi apresentar os conceitos portrás das repetições no fluxo de execuçãode algoritmos, seguido pela explicação edetalhamento de alguns comandos em

     Java que implementam as estruturas derepetição. O artigo também abordou asconsequências e implicações do uso de es-truturas de repetição, e foi finalizado coma apresentação de três exercícios de fixaçãodo conteúdo abordado com o objetivo deauxiliar os leitores que estão começando

    a programar em Java.

    Mauro Pichiliani [email protected] 

    É bacharel em Ciência da Com-putação, mestre e doutorandopelo ITA (Instituto Tecnológico deAeronáutica) e MCP, MCDBA e MCTS.

    Trabalha há mais de 9 anos utilizando diversos bancosde dados e linguagens de programação. É escritor darevista SQL Magazine e colunista do web site iMasters.(http://www.imasters.com.br).

    www.devmedia.com.br/post-9668-Artigo-

     Java-Magazine-16-Gen ericos-no-J2S E-5-0.

    html 

    Artigo Genéricos no J2SE 5.0, escritopor Osvaldo Pinali Doederlein e publicado naedição número 16 da Revista Java Magazine.

    http://www.devmedia.com.br/post-9639-Artigo-

     Java-Magazine-26-Numeros-em-Java.html 

    Artigo Números em Java, escrito porFernando Lozano e publicado na edição

    número 26 da Revista Java Magazine.http://www.devmedia.com.br/post-8737-Artigo-

     Java-Magazine-18-Colecoes-de-ponta-a-ponta.html 

    Artigo Coleções de ponta a ponta, escrito porOsvaldo Pinali Doederlein e publicado naedição número 18 da Revista Java Magazine.

  • 8/18/2019 Easy Java 0033453453578

    11/40

    LUIZ SANCHES

    Minha primeira aplicação

    web com JSF

    Edição 03 • Easy Java Magazine  11

    De que se trata o artigo: 

    Neste artigo veremos a construção de uma pequena aplicação Java para web baseada no JavaServer

    Faces 2.0. A finalidade da aplicação é criar um cadastro com dados pessoais, contando com a verificação

    dos campos, que resulta na impressão em tela dos dados captados no formulário.

    Para que serve: Introduzir desenvolvedores que ainda não tiveram contato com JSF no desenvolvimento de aplicações

    para a web com Java.

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

    Este artigo é útil para mostrar a desenvolvedores iniciantes, vindos de tecnologias JSP ou Desktop, como

    desenvolver aplicações em Java para web com interfaces de usuário orientadas a componentes, de fácil

    compreensão e desenvolvimento focado no framework JSF 2.

    Resumo DevManAtecnologia Java é consideradasinônimo de robustez, segurança,estabilidade e velocidade no quese refere ao desenvolvimento de aplicaçõesweb. No entanto, para alguns desenvol-vedores vindos do mundo desktop é umpouco complicado, de início, compreender

    as tecnologias envolvidas, frameworksutilizados e principalmente o fluxo de umaaplicação web.

    Para melhorar o entendimento de comofunciona a tecnologia Java neste contexto,vamos aplicar os conceitos do framework

     JSF 2.0 em um cadastro de currículos, bemsimples, para que o leitor possa compreen-der com clareza o uso desse framework.

    O que é JSF? JavaServer Faces é um framework Java,

    criado para tratar da camada de apresen-tação das aplicações web. Ele possui umgrupo de tags próprias que, em substitui-ção às tags HTML, supre o desenvolvedornas suas necessidades de formatação epadronização de código. A versão 2.0 trásmudanças significativas como: integraçãocom Ajax, suporte nativo a XHTML, recur-sos, templates, entre outros.

    Neste artigo, conheceremos o funciona-mento básico do framework, apresentandonoções fundamentais para a construção de

    suas primeiras aplicações. Para obter infor-mações mais avançadas sobre o assunto,recomendamos a leitura do artigo “Apren-dendo JSF 2.0 com ScrumToys”, publicadona Edição 78 da Java Magazine.

    A aplicaçãoHoje em dia se espalham na Internet

    serviços de armazenamento de currículos,alguns de graça outros não. As empresasadotam formulários para preenchimentoe armazenagem em banco de dados, evi-

    tando a necessidade de envio de arquivos

    para o e-mail da mesma. Dessa forma, afiltragem dos dados é sem dúvida mais

    rápida para quem trabalha no setor deRecursos Humanos, podendo cruzarinformações até chegar ao perfil maisadequado à vaga. São com esses objetivosque iremos trabalhar.

    A primeira etapa consiste na criação deuma interface para inclusão dos dadoscadastrais do usuário. Não ocorrerá in-tegração com a base de dados devido aoescopo do artigo estar no desenvolvimentode nossa primeira aplicação com JSF. Seráexemplificada a construção de um formu-

    lário com campos do tipo texto contendo:validações dos campos com exibição demensagens e submissão do formuláriopara impressão, na tela, dos dados cadas-trais do usuário.

    Para este artigo, foi utilizado no ambientede desenvolvimento o JDK 6, Eclipse IDEfor Java EE Developers 3.6 (Helios) e oApache Tomcat 7.

    Preparando o terreno

    Obtenha o Eclipse 3.6, Tomcat 7 e JSF

    2.0 a partir dos endereços disponíveis na

    seção Links , de acordo com seu sistemaoperacional. Depois de instalados, inicie

    o Eclipse para configurar o Tomcat 7. Paraque você possa visualizar as configuraçõesde servidores, mude para a perspecti-va Java EE (acessando Window | OpenPerspective > Other). Na aba Servers , crieum servidor (New > Server) – a Figura 1 ilustra a seleção do servidor. Em seguidaclique no botão Next para visualizar a telada Figura 2 , adicione o diretório onde seencontra instalado o Tomcat 7 e cliqueem Finish.

  • 8/18/2019 Easy Java 0033453453578

    12/40

    Minha primeira aplicação web com JSF

    12 Easy Java Magazine • Edição 03

    - É necessário mudar uma opção na configuração 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 opção

    “Use Tomcat installation (takes control of Tomcat

    installation)”. Com isso, será utilizado o diretório de

    instalação do Tomcat (/home/luiz/java/apache-

    tomcat-7), como em nosso exemplo na Figura 2, para

    que ele assuma a publicação das aplicações. Salve e

    feche a tela de configuração.

    Feito isso, no Eclipse, crie um projetoWeb (File | New > Dynamic Web Project)

    com o nome “CurriculosJSF2”. Selecione

    Figura 1. Configuração do Tomcat 7 no Eclipse

    Figura 2. Seleção do diretório da instalação do Tomcat 7

    na área Target runtime a opção Apache Tomcat v7.0 e em Con- figuration a opção  JavaServerFaces v2.0 Project , para que

    seu projeto tenha suporte doEclipse a JSF. Clique em Next até chegar à última tela doassistente. Na opção JSF im-

     plementation Library selecioneDisable Library Configuration.Escolhemos essa opção paraconfigurar as bibliotecas ma-nualmente em nosso projeto.O artigo segue esse caminho,mas existem outras formasde se configurar bibliote-

    cas no Eclipse. Clique emFinish.

    Como o Tomcat 7 não vemcom suporte ao JSF, vocêdeve obter a biblioteca doprojeto Mojarra (ver seçãoLinks), que se trata da im-plementação da SUN paraa especificação JSF. Extraiao arquivo mojarra-2.0.x-FCS-binary.zip , depois entre nodiretório criado para copiar

    do subdiretório lib os arqui-vos  jsf-api .jar   e  jsf- impl.jar ,que são responsáveis pelaimplementação do JSF paraque seu projeto utilize os re-cursos do framework . Volte aoEclipse, selecione o diretórioWebContent/WEB-INF/lib  doprojeto e cole as bibliotecas.

    Agora você deve adicio-nar seu projeto ao servidor.

    Deste modo, na aba Servers , clique com o

     botão direito do mouse em Tomcat v7.0 Ser-ver e selecione a opção Add and Remove....Na área  Available , clique no seu projeto,adicione-o ( Add >) na área Configured  edepois finalize a tela.

    É hora de co dificarA seção anterior, para quem ainda não

    está acostumado, foi apenas um aperitivopara começarmos a diversão. A seguir,vamos tratar da edição do arquivo web.xml , criação da classe Curriculo  (Curriculo.

     java) e do formulário incluirCurriculo.xhtml ,

    para que possamos configurar o ambiente básico da aplicação e entender a interaçãoentre a classe Curriculo  e o formulário decadastro.

    Edição do arquivo web.xml 

    O arquivo WebContent/WEB-INF/web.xml ,exibido na Listagem 1 , foi criado automa-ticamente pelo Eclipse. Ele é conhecidocomo deployment descriptor e serve paraguardar informações de configurações daaplicação como o mapeamento de Servlets ,por exemplo. Seu conteúdo foi editadopara conter o necessário para o funciona-mento de nossa aplicação. Dessa forma,na tag  está sendo invocada

    a classe FacesServlet , que atuará como con-troladora da aplicação. FacesServlet roteia asrequisições HTTP do formulário incluir-Curriculo.xhtml , direcionando-as para aclasse Curriculo , conhecida como  ManagedBean , devido a mesma ser responsável porgerenciar os dados disponíveis na páginaincluirCurriculo.xhtml.

    A tag  informa que as URLsque terminam com o padrão .jsf serão en-caminhadas para o servlet FacesServlet. Essemapeamento aciona e renderiza o arquivo

    equivalente que possuir a extensão .xhtml,no caso o incluirCurriculo.xhtml. Podemoscolocar na tag  outro padrão,como *.faces por exemplo. Com isso, nossoformulário será acionado pela chamadaà URL terminando com incluirCurriculo.

     jsf . Em seguida, serão realizadas pelo framework   JSF verificações de sintaxe noarquivo incluirCurriculo.xhtml. Neste mo-mento, cada tag JSF é analisada para cons-truir a árvore de componentes no servidor,que depois envia a página em HTML para

    renderização no navegador.

    Criação da classe Curriculo

    A Listagem 2 mostra a classe Curriculo.Observe que foi adicionada a anotação@ManagedBean(name = “curriculoBean”)  paraindicar que a classe será um bean geren-ciado. Ela foi nomeada de curriculoBean. Essenome será utilizado como referência nachamada de métodos a partir da páginaincluirCurriculo.xhtml. Você pode alterá-loou remover o parâmetro name da anotação

    @ManagedBean para usar o nome da classe

  • 8/18/2019 Easy Java 0033453453578

    13/40Edição 03 • Easy Java Magazine  13

    N o t a d o D e v M a n

    Servlets:  Servlets são classes escritas em Java que sãoexecutadas como componentes no lado do servidor, coma finalidade de processar as requisições vindas do cliente(browser) para gerar respostas em formato html ou xml parauma aplicação web.

    N o t a d o D e v M a n

    Bibliotecas de tag: Bibliotecas de tag (taglib) agrupam tagsespeciais que são utilizadas na construção de páginas, estendendo

    o código HTML padrão.As taglibs são classes Java que através detags específicas automatizam a geração de conteúdo dinâmicoem páginas web.

    N o t a d o D e v M a nManaged Bean:  Managed Bean é uma classe JavaBean,também conhecida como POJO (Plain Old Java Objects), quesegue o padrão de criação de possuir atributos privados eos métodos getters e setters públicos. Essas classes atuamcomo controladores, disponibilizando dados e métodospara páginas web, através de chamadas a referências pelasintaxe #{controlador.metodo}. Com isso, os dados podemser armazenados, recuperados e apresentados na páginacontrolada por ele.

    Listagem 1. Arquivo web.xml  (deployment descriptor ) com as configurações necessárias para o funcionamento com JSF

      CurriculoComJSF2    Faces Servlet  javax.faces.webapp.FacesServlet      Faces Servlet  *.jsf 

    Listagem 2. Classe Curriculo que implementa oManaged Bean curriculoBean.

    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 métodos getters e setters foramomitidos

      public void exibirResultado() {  this.setExibir(true);

      }

    }

    como referência na página incluirCurriculo.xhtml.

    A classe também possui a anotação@RequestScoped , que define o bean com es-

    copo de requisição, onde um novo objetoé criado a cada requisição realizada pelousuário. Assim, os dados são utilizadossomente para a página que os requisitou.As informações se perderão caso hajanavegação para outras páginas.

    Note que na Listagem 2 a maioria dosmétodos getters e setters dos atributos fo-ram omitidos. Você deve criá-los acessan-Você deve criá-los acessan-do Source | Generate Getters and Setters....Na caixa de diálogo, selecione todos osatributos (Select All) e clique no botão OK. 

    Assim, você não terá problemas quandochamar os métodos da classe a partir doarquivo incluirCurriculo.xhtml.

    O método exibirResultado() será invocadono pressionamento do botão Gravar  doformulário. Caso não ocorra nenhum errode verificação, ele definirá a variável exibir como verdadeira, para logo depois serexibida a tela com o resumo do currículodo usuário.

    Criando o formulário de inclusão

    Agora vamos criar a página que vai in-teragir com o Managed Bean. Para isso, váaté a raiz do diretório WebContent  e crieo arquivo incluirCurriculo.xhtml  (New >

     HTML File). Clique em Next , deixe marcadaa opção Use HTML Template e selecione oprimeiro template New Facelet CompositionPage. Depois clique em Finish.

    Como não vamos trabalhar ainda comComponentes Compostos, apague a tag   com todo seu conteúdopara inserir o código da Listagem 3 , que

    analisaremos agora.Observe logo no início da Listagem 3 

    que dentro da tag   foram adicio-nados alguns parâmetros iniciados comona sintaxe xmlns:h=“http://java.sun.com/jsf/ html”.  Esses parâmetros são declaraçõesem XML namespace que servem para em-

     butir as bibliotecas de tag em sua aplicação.Assim podemos utilizar a tag especial de

     JSF  na página para construircampos de entrada de dados com maisrecursos do que a tag  do HTML,

    como verificação por exemplo.

    Logo abaixo do cabeçalho vem o corpoda página com um formulário que con-terá seus campos organizados em umatabela que está representada pela tag. No final, depois do campoobjetivo profissional, foi adicionado um

     botão de submissão. Estes são os elementos

    que serão visualizados no momento em

    que você chamar o formulário pela primei-ra vez, como demonstrado na Figura 3.

    A Figura 4 mostra a tela após o clique no botãoGravar , exibindo as mensagens de ve-rificação dentro da única tag  ,que fica localizada logo abaixo da primeiratabela (

    ).

  • 8/18/2019 Easy Java 0033453453578

    14/40

    Minha primeira aplicação web com JSF

    14 Easy Java Magazine • Edição 03

        Incluir Curriculo 

             

       

       

       

       

       

       

     

     

       

         

                       
       
      ,

    ,,

     
       
                 

    Listagem 3. Formulário de inclusão – incluirCurriculo.xhtml.

    Figura 3. Formulário de inclusão do currículo Figura 4. Formulário de inclusão com verificação de campos

  • 8/18/2019 Easy Java 0033453453578

    15/40Edição 03 • Easy Java Magazine  15

    N o t a d o D e v M a n

    Facelets: Facelets é um framework para construção de páginas.Ele usa uma linguagem de declaração própria para a modelageme exibição das páginas em JSF. Utiliza XHTML em substituiçãoao HTML. Foi criada para estender as limitações do JSP. Atravésde namespaces apropriados ela converte elementos HTML emcomponentes JSF, adicionando-os a uma árvore de componentespara construir a camada de visão da aplicação.Desde a versão 1.xde JSF é utilizada como preferência dos desenvolvedores a outrosframeworks de templating como Struts Tiles ou Sitemesh.Agoraestá incorporada à versão 2.x.

    Construir tabelas e campos de formuláriocom JSF é bem mais prático do que usarHTML puro. Na Listagem 3 a primeira tag , que possui o atributocolumns=“2” ,

    cria uma tabela com duas colunas. Com isso,cada elemento de rótulo (),responsável pela descrição do campo, e cai-xa de texto (), responsável pelacriação do campo, ocuparão cada uma dascélulas da tabela para compor o formuláriode cadastro. O resultado da disposição doscampos é visto na Figura 3.

    Para você entender, na prática, a com-posição da tabela, execute a aplicação nonavegador e analise o código-fonte dapágina gerada. Perceba que a página estará

    construída com as tags HTML e dentro doformulário (...) se encontra atabela (...), rótulos e camposque foram gerados pelo JSF.

    Ainda na Listagem 3 , logo após a criaçãoda tabela, observe o campo texto que estáidentificado como “nome” e com o valorcontendo a Expression Language #{curriculo-Bean.nome}. Nessa expressão acontece o vín-culo com o Managed Bean Curriculo através dométodo getNome(). Observe que na Listagem2 os atributos estão declarados como priva-

    dos. Em contrapartida os métodos  getters e setters devem ser públicos para que hajaa comunicação entre a página incluirCurri-culo.xhtml e seu Managed Bean. Essa rígidadisciplina em nomear atributos e métodos énecessária para que você utilize a Convençãosobre Configuração que é, sem sombra dedúvidas, o que dá prazer em desenvolveraplicações fáceis de manter, com qualidadee sem a necessidade de gerenciar extensosarquivos XML.

    Verificação de camposA verificação de campos em JSF facilita

     bastante a vida do desenvolvedor devido àpossibilidade de verificar o preenchimentode cada um com parâmetros inseridos na tagde criação do mesmo. Como no exemplo docampo nome , foi adicionado a ele os atributosrequired e requiredMessage , indicando que o seupreenchimento é obrigatório. Caso ele estejavazio e o botão Gravar for pressionado, seráexibida uma mensagem informando aousuário que o campo deve ser preenchido.

    A utilização de requiredMessage  permite ao

    N o t a d o D e v M a n

    Expression Language: Expression Language (EL) é umalinguagem de scripting, desenvolvida pela Sun, utilizada paraacessar componentes Java (JavaBeans) eliminando parte docódigo Java em páginas web.Por exemplo, para imprimir na telao retorno do método getNome() com JSP utiliza-se a sintaxe. Mas podemos simplificá-la,através de EL, utilizando a sintaxe: ${curriculo.nome}, tornandoassim o código mais legível. O JSF utiliza o símbolo # parareferenciar o método de um JavaBean, diferente de JSP, que usao símbolo $.

    N o t a d o D e v M a n

    Convenção sobre Configuração: Convenção sobre Configuração(Convention over Configuration – CoC) é um modelo dedesenvolvimento que dá preferência a convenções ao invésde configurar extensos arquivos,devendo assumir valorespadrão onde existe uma convenção.Em nosso exemplo temosconvencionado que os métodos da classe Curriculo que retornam ovalor de seus respectivos atributos devem ser escritos da seguinteforma:getNomeDoAtributo(),como por exemplo,getEndereco().Com isso,seguimos o padrão de um POJO para que o método sejautilizado no formulário XHTML declarando apenas seu nome semo prefixo “get”e com inicial minúscula.O desenvolvedor é obrigadoa seguir as convenções do framework,mas em compensaçãoganha clareza no código e facilidade na manutenção da aplicação.

    desenvolvedor personalizar a mensagemde verificação para o usuário.

    Exibindo o resultado

    O objetivo da aplicação resulta na im-pressão, em tela, dos dados do usuáriocom uma formatação simples. Deste modo,depois do preenchimento dos campos doformulário basta clicar no botão Gravar para o resultado ser exibido, como podeser visto na Figura 5.

    A análise da Listagem 4 serve paradestacar a comunicação entre a páginaincluirCurriculo.xhtml  e o  Managed BeancurriculoBean. Observe que o botão Gravar () possui uma ação que está

    invocando o método exibirResultado() , que temseu conteúdo destacado na Listagem 2.Continuando a leitura da Listagem 4 ,

    perceba que logo depois das mensagensde verificação () é criada umaoutra tabela (), identificadacomo “resultado”, e com o atributo rendered que recebe o retorno do método getExibir().Quando o Managed Bean é invocado pelaprimeira vez, o atributo exibir  é inicia-do com o valor false. Com isso, a tabela“resultado” não será exibida. Quando o

    formulário for preenchido e o botãoGravar for pressionado, os dados do usuário serãoexibidos por consequência do métodogetExibir() retornar o valor true.

    A “mágica” acontece quando, no mo-mento da submissão do formulário, nãohá erros de verificação e o método exibirRe-sultado() é acionado definindo como true oatributo exibir. Quando acontece o reload dapágina, o atributo rendered recebe o retornodo método getExibir()  já com o valor true ,que resulta na exibição da tabela com o

    currículo formatado para o usuário.Na exibição do resultado, os textos são

    impressos com a tag   pas-sando um valor ao atributo value. Observeque em algumas tags são passadas, viaExpression Language , referências aos mé-todos getters do Managed Bean curriculoBean.Os valores dos campos do formulárioforam vinculados aos atributos da classeCurriculo através de seus métodos setters.No momento da submissão, via métodoHTTP POST, os dados são armazenados

    no servidor para serem acessados pelos

    componentes  e .Na sequência é retornada a página com os

    valores dos campos, que foram preenchi-dos pelos métodos  getters dos atributosarmazenados no  Managed Bean , e logoabaixo do formulário é exibida a tabelacom os dados do usuário formatados.

    Terminada a implementação da aplica-ção, já podemos executá-la para compre-ender melhor seu funcionamento.

    Executando a aplicaçãoPara testar a aplicação, acesse a aba Ser-

    vers no Eclipse e inicie o servidor Tomcat.

    Dê atenção para a aba Console , que serve

  • 8/18/2019 Easy Java 0033453453578

    16/40

    Minha primeira aplicação web com JSF

    16 Easy Java Magazine • Edição 03

    Luiz [email protected]

    luizsanches.wordpress.com

    Trabalha com desenvolvimento desoftware e ensino em informática a maisde 10 anos. É graduado em Sistemas de

    Informação pelo IESAM e pós-graduando em Gestão Ágilde Projetos pelo CESAR. Na graduação conheceu Java e acomunidade Tá safo! que divulga Desenvolvimento Ágil eSoftware Livre no Estado do Pará.

    eclipse.org/downloadsDownload do Eclipse Helios.

    tomcat.apache.org/download-70.cgi 

    Download do Tomcat 7.

     javaserverfaces. dev.java.net 

    Download e documentos do ProjetoMojarra (JSF 2.0).

     groups.google.com .br/group/java sf 

    Grupo de JavaServer Faces oficial do Brasil.

    para analisar o log do Tomcat no intuitode encontrar possíveis erros de digitação,ausência de bibliotecas ou configuraçãoincorreta do arquivo web.xml. Caso tudoocorra bem, inicie seu navegador e digiteo endereço: http://localhost:8080/Curricu-losJSF2/ incluirCurriculo.jsf .

    Listagem 4. Trecho do arquivo incluirCurriculo.xhtml, com destaque para o resultado da submissão do formulário.

    ...   

                 ...

    Figura 5. Resultado após submissão, sem erro de verificação, do formulário

    ConclusõesNeste artigo foi criado um

    formulário simples, com pou-cos elementos, para uma com-

    preensão rápida e fácil dautilização do  framework   JSF2.0. A implementação de umcontrole de currículos podeser elevado a níveis bem maisaltos de complexidade (porexemplo: empregando Ajax,persistência em banco de da-dos, upload de foto, exportaçãoem PDF, etc.), nos levando comisso a aprender, aperfeiçoar ouso da tecnologia e enriquecer

    ainda mais a aplicação.Através do uso de JSF, o de-

    senvolvimento de aplicaçõesweb fica mais compreensível

    para designers e desenvolvedores. Oframework propicia uma harmonia entre aequipe, possibilitando que os profissionaistrabalhem nos mesmos arquivos, cada umcom suas obrigações. Assim o designer nãoprecisa saber todas as nuances da lingua-gem Java e o desenvolvedor não necessita

    reescrever o código vindo de seus colegasdesigners, já que “falam” a mesma língua,ou seja, JSF.

    Quem trabalha com Java encontra em JSF

    o suporte de uma comunidade e empresasque trabalham sério para que a construçãode aplicações não seja tão maçante, e simprodutiva. Quem começa a trabalhar com

     JSF percebe logo o ganho em velocidade,clareza, organização e uniformidade. Oframework ajuda bastante na árdua tarefade entregar produtos de qualidade e semcomplicações entre os envolvidos duranteo desenvolvimento.

  • 8/18/2019 Easy Java 0033453453578

    17/40

    PAULO CÉSAR COUTINHO

    Java Database Connectivity (JDBC)Persistindo dados em Java – Parte 2

    Edição 03 • Easy Java Magazine  17

    De que se trata o artigo: 

    Neste artigo veremos como utilizar a JDBC de forma prática. Para isso, construiremos uma aplicação 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 estão presentes em grande parte das aplicações que desenvolvemos e é funda-

    mental saber como criar uma aplicação que utilize essa tecnologia. A JDBC é a API que permite construir

    aplicações Java para bancos de dados.

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

    O tema é útil para a criação ou manutenção de aplicações Java que utilizem bancos de dados. Conhecer

    os conceitos básicos da JDBC também ajuda o desenvolvedor a entender como funcionam os frameworks

    ORM, como Hibernate, TopLink, etc. que serão abordados em artigos futuros.

    Resumo DevManNa primeira parte do nosso arti-go sobre JDBC – API Java paraacesso a bases de dados –, expli-camos seus conceitos e arquitetura geral,vimos os tipos de drivers suportados, emostramos, através de pequenos trechosde código, como obter uma conexão JDBC,

    executar um comando SQL no banco dedados e manipular os resultados. Alémdisso, demos início à construção de umaagenda de contatos, como exemplo práticode projeto.

    Nesta segunda parte do artigo, conti-nuaremos o desenvolvimento do nossoprojeto, vendo o restante das funcio-nalidades, bem como a interface com ousuário, que será feita utilizando linhade comando.

    O projeto exemplo: Agenda de ContatosComo já sabemos, nosso projeto exem-plo trata-se de uma Agenda de Contatos.Vamos apenas relembrar as funcionali-dades que nossa aplicação irá fornecer aousuário:• Cadastrar nome, telefone e e-mail doscontatos;• Editar as informações do cadastro;• Listar os contatos;• Obter informações detalhadas de umcontato;• Excluir um contato;• Buscar contatos pelo nome.

    A Figura 1 mostra um diagrama com asclasses da nossa aplicação.

    Até então, criamos uma base de dadoschamada test_jdbc em cada um dos SGBDsque iremos utilizar (MySQL e PostgreSQL)e a tabela contacts. Além disso, baixamosos jars dos drivers JDBC do MySQL e Pos-tgreSQL, e também da biblioteca ApacheCommons CLI (ver URLs para download

    na seção Links). Por fim, criamos um

    Figura 1. Diagrama de classes do projeto

    projeto no Eclipse, adi-

    cionando os jars citadosno Build Path , e definimosas classes Contact , Connec-tionHelper , e ContactJdbcDao ,além da interface ICon-tactDao.

    Como podemos per-ceber na Listagem 1 , aclasse ContactJdbcDao  sóestá com alguns métodosimplementados, exata-mente como a deixamos

    na primeira parte doartigo. Ainda faltam asimplementações dos mé-todos list() , search() , update() e delete(). Nas próximas seções, proveremosuma implementação para cada um dessesmétodos e criaremos a classe responsávelpela interface de linha de comando daaplicação.

    - O projeto completo, incluindo o modelo de classes

    e script de banco, pode ser baixado diretamente do

    site da Easy Java.

    Recuperando dados

    Dando continuidade à implementaçãodos métodos da classe ContactJdbcDao , ve-remos agora como listar todos os contatosda agenda. A Listagem 2 mostra o métodolist() atualizado. Nele obtemos a conexão

     JDBC, criamos o Statement com a consulta

    SQL SELECT , sem filtros, e invocamos o mé-

  • 8/18/2019 Easy Java 0033453453578

    18/40

    Java Database Connectivity (JDBC)

    18 Easy Java Magazine • Edição 03

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

    import java.sql.Connection;import java.sql.PreparedStatement;

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

    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;

      try {  connection = ConnectionHelper.getConnection();

      String sql = “INSERT INTO contacts (name, email, phone) VALUES (?, ?, ?)”;

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

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

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

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

      return contact;  }

      public Contact get(Long id) {  Contact contact = null;  Connection connection = null;  PreparedStatement statement = null;

      try {  connection = ConnectionHelper.getConnection();

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

      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”));  }

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

      }

      return contact;  }

      public List list() {  return null;  }

      public List search(String name) {  return null;  }

      public void update(Contact contact) {  }

      public void delete(Contact contact) {  }

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

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

    }

    Listagem 1. Classe ContactJbdcDao

    todo statement.executeQuery(). Então iteramospelo ResultSet retornado, e para cada regis-tro criamos um novo Contact , configuramosseus atributos e o adicionamos à lista

    contacts. Em seguida fechamos o ResultSet eretornamos a lista de contatos.A Listagem 3 mostra a implementação do

    método ContactJdbcDao.search() , responsávelpor buscar um contato pelo nome. Se re-pararmos bem, o método search() é muito

    parecido com o método list() , visto ante-riormente. A diferença é que esse últimopossui o argumento name , utilizado comofiltro na instrução SELECT. Os operadores

    LIKE eUPPER tornam a busca mais abrangen-te, fazendo com que ela funcione mesmoque apenas parte do nome do contato sejainformada e que sejam ignoradas diferen-ças de maiúsculas e minúsculas (ex.: se

     buscarmos por “jo”, a consulta retornaria

    contatos com nomes como “José”, “Marjo-rie”, “Maria Joaquina”, etc.).

     Atualizando dados

    Para atualizar os dados, basta utilizar ocomando SQL UPDATE , informando os no-vos valores para as colunas. A Listagem 4 mostra o método ContactJdbcDao.update()  atu-alizado. Nele, obtemos uma conexão JDBC,criamos um PreparedStatement com o SQL de

  • 8/18/2019 Easy Java 0033453453578

    19/40Edição 03 • Easy Java Magazine  19

    Listagem 2. Método ContactJdbcDao.list() atualizado.

    public List list() {  List contacts = new ArrayList();  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;}

    Listagem 3. Método ContactJdbcDao.search() atualizado.

    public List search(String name) {

      List contacts = new ArrayList();

      Connection connection = null;

      PreparedStatement statement = null;

      try {

      connection = ConnectionHelper.getConnection();

      String sql = “SELECT * FROM contacts WHERE name LIKE ?”;

      statement = connection.prepareStatement(sql);  statement.setStr ing(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”));

      contacts.add(contact);  }

      resultSet.close();  } catch (Exception e) {

      throw new RuntimeException(“Error listing contacts.”, e);

      } finally {

      releaseDatabaseResources(statement, connection);  }

     return contacts;

    }

    Listagem 4. Método ContactJdbcDao.update() atualizado.

    public void update(Contact contact) {  Connection connection = null;  PreparedStatement statement = null;

      try {  connection = ConnectionHelper.getConnection();

      String sqlInsert = “UPDATE contacts SET name = ?, email = ?,phone = ? WHERE id = ?”;

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

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

    Listagem 5. Método ContactJdbcDao.delete() atualizado.

    public void delete(Contact contact) {

      Connection connection = null;  PreparedStatement statement = null;

      try {  connection = ConnectionHelper.getConnection();

      String sqlInsert = “DELETE FROM contacts WHERE id = ?”;

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

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

    }

    atualização, configuramos os valores dos parâmetros da instruçãoSQL e, por fim, invocamos o método statement.executeUpdate().

    Excluindo dados

    Para excluir um contato, utilizamos o comando SQL  DELETE ,informando o ID do contato a ser excluído. A Listagem 5 mostrao método ContactJdbcDao.delete()  atualizado. Nele, obtemos umaconexão JDBC, criamos o statement  com o SQL de exclusão econfiguramos o valor do parâmetro do SQL. Por fim, invocamoso método statement.executeUpdate() para executar o comando SQLno banco.

    Dessa forma, finalizamos a implementação da classe ContactJdb-cDao , restando agora criar a interface da nossa aplicação.

    Interface com o usuárioComo falamos anteriormente, nossa aplicação terá uma interface

    de linha de comando simples. E para facilitar nossa vida, uti-lizaremos a biblioteca CLI (Command Line Interface) do projeto

  • 8/18/2019 Easy Java 0033453453578

    20/40

    Java Database Connectivity (JDBC)

    20 Easy Java Magazine • Edição 03

    Commons da  Apache. Com ela, é possívelcriar aplicações de linha de comando, demaneira rápida e fácil.

    A Listagem 6 mostra o código da classe

    Application , que contém o ponto de entrada danossa aplicação. Nela, inicialmente temos asconstantes que representam os comandossuportados. Temos então o atributo run-ning , que serve para controlar o tempo devida da aplicação, e o atributo options , quearmazenará o conjunto de opções que for-neceremos ao usuário e será utilizado pela

     biblioteca CLI. Por fim, temos o atributocontactDao , que será utilizado para realizar asoperações com a base de dados contacts.

    No construtor, criamos as opções de

    comando da nossa aplicação. Utilizando a biblioteca CLI, essa é uma tarefa bastantesimples. O método Options.addOption() recebeas informações do comando como: abre-viação, nome, flag indicando se o comandotem argumentos e a descrição. Tambémutilizamos a versão sobrecarregada do mé-todo Options.addOption() , que recebe um objetoOption , criado utilizando a classe utilitáriaOptionsBuilder , que facilita a criação de opçõescom argumentos, como no caso da opção--delete , que espera o ID do contato.

    O método start() exibe o menu de ajudada aplicação e inicia o loop de controle queaguarda os comandos do usuário.

    Os métodos getUserInput() são responsáveispor ler os dados digitados pelo usuário noconsole. Para isso, criamos um objeto Bu-fferedReader , que recebe no construtor umInputStreamReader que, por sua vez, recebeum InputStream como parâmetro. No nossocaso, utilizamos o InputStream System.in , querepresenta os dados digitados no console.Então invocamos o método readLine()  do

    BufferedReader  para ler o valor digitadopelo usuário.

    - A partir da versão 1.6 do Java, podemos ler os

    dados digitados no console de forma mais simples,

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

    chamar o método System.console().readLine() 

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

    de uma senha. Entretanto, quando estamos desen-

    volvendo e testando no Eclipse, o método System.

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

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

    a maneira antiga no nosso exemplo.

    O método processCommand()   é o respon-sável por interpretar os comandos digi-tados pelo usuário. Aqui veremos comoa biblioteca CLI torna essa tarefa fácil,

    visto que não precisamos definir umformato de entrada de dados (incluindopassagem, ordem e obrigatoriedade deparâmetros) e muito menos tratar essaentrada a fim de identificar esses valoresa partir da string fornecida pelo usuá-rio. Deste modo, primeiro criamos umCommandLineParser  do tipo BasicParser  queserá responsável por fazer o parsing1 dosdados digitados pelo usuário. Utilizandoo parser criado, construímos um objeto dotipo CommandLine através do método Com-

    mandListParser.parse(). Em seguida testamosse nossa linha de comando possui algumadas opções definidas, correspondentesàs funcionalidades da aplicação, e, paracada opção, chamamos o método privadoadequado. Para os casos onde as opçõespossuem um argumento, como no métodosearch() , utilizamos o método CommandLine.getOptionValue()  para recuperar o valordigitado.

    O método readContact() constrói um objetoContact a partir dos dados informados pelo

    usuário. Ele será utilizado para criação eedição de contatos.

    O método help()  exibe a lista de ajudada nossa aplicação. Para nos ajudar nessesentido, a biblioteca CLI disponibiliza aclasse utilitária HelpFormatter , que atravésdo método printHelp() imprime no console alista de comandos e suas descrições.

    Os métodos create() , details() , list() , search() ,edit()  e remove() correspondem às funcio-nalidades da aplicação e simplesmentefazem uso dos métodos que definimos

    na interface IContactDao para manipular oscontatos da agenda.

    1 Podemos dizer que o processo de parsing consiste

    em analisar um dado, texto (String) ou binário (ex.:

    byte[]), buscando encontrar trechos (elementos)

    de um padrão preestabelecido, permitindo assim a

    construção de objetos a partir de dados cruz (raw

    data). Um exemplo comum de parser que lidamos no

    dia a dia são os parsers de arquivos XML, responsáveis

    basicamente por distinguir no texto, o que são as tags,

    os atributos e os valores.

    O método quit() apenas configura o atri- buto running para false , fazendo com que oloop de controle seja finalizado, encerran-do deste modo a aplicação.

    Por fim, o método main() cria uma instân-cia da nossa aplicação e invoca o métodostart() na mesma.

    Com isso finalizamos a implementaçãodo nosso projeto exemplo. Agora vocêpode executar a aplicação, cadastrar al-guns contatos, listar os dados cadastrados,fazer buscas, etc. Para criar um contato,por exemplo, basta digitar -c ou --create epressionar Enter , que a aplicação solicitaráo preenchimento do nome, e-mail e telefo-ne, e então criará o novo contato. Para listar

    os contatos existentes, basta usar a opção-l  ou --list. Para ver a lista completa deopções, use -h ou --help. AFigura 2 mostraum screen shot da aplicação em execução noconsole do eclipse.

    Mudando de base de dadosVamos agora simular uma situação que

    acontece no mundo real e que caso a apli-cação não esteja preparada, pode gerarmuito retrabalho e dor de cabeça. Estamosfalando da troca de base de dados. Na

    preparação do ambiente, apresentada noprimeiro artigo desta série, criamos duas

     bases de dados em dois SGBDs distintos.Entretanto, até agora só testamos nossaaplicação no MySQL, conforme configu-rado na classe ConnectionHelper.

    Dessa forma, suponha que um novocliente já possui o PostgreSQL rodandonos seus servidores e não quer instalar umnovo SGBD apenas para nossa aplicação.Nesse caso, teremos que adaptar a aplica-ção para o PostgreSQL.

    Eis então a boa notícia: como nossaaplicação foi construída utilizando a API

     JDBC e instruções SQL genéricas, visto nãoutilizarmos nenhuma instrução ou funçãoespecífica de um fabricante de SGBD, asúnicas mudanças que precisamos fazersão: 1) mudar a URL de conexão com a basede dados; 2) obter o novo driver JDBC (doPostgreSQL, neste caso), que já havíamosadicionado no classpath do projeto.

    A Listagem 7 mostra a classe ConnectionHelper  alterada para criar conexões com

    a base test_jdbc no PostgreSQL, rodando

  • 8/18/2019 Easy Java 0033453453578

    21/40Edição 03 • Easy Java Magazine  21

    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 ”)  .withLongOpt(COMMAND_EDIT).create(“e”));  options.addOption(OptionBuilder.withArgName(“contactId”).hasArgs()  .withDescription(“Removes the contact specified by ”)  .withLongOpt(COMMAND_REMOVE).create(“r”));  options.addOption(OptionBuilder.withArgName(“contactId”).hasArgs()  .withDescription(“Shows the details of the contact specified by ”)  .withLongOpt(COMMAND_DETAILS).create(“d”));  options.addOption(OptionBuilder.withArgName(“searchString”).hasArgs()  .withDescription(“Searches for contacts containing

    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());  }

    Listagem 6. Classe Application – Ponto de entrada da aplicação exemplo

  • 8/18/2019 Easy Java 0033453453578

    22/40

    Java Database Connectivity (JDBC)

    22 Easy Java Magazine • Edição 03

      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 list() {  System.out.println(“\nContacts:\n”);  for (Contact contact : contactDao.list()) {  System.out.println(“#” + contact.getId() + “ - “ + contact.getName());  }  System.out.println();  }

      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();  }

      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 quit() {  System.out.println(“Quitting application...”);  running = false;  }

      public static void main(String[] args) {

      new Application().start();  }

    }

    Continuação: Listagem 6. Classe Application – Ponto de entrada da aplicação exemplo

    Figura 2. Screenshot da aplicação exemplo

    na máquina local (localhost),na porta 5432 (porta padrãodo PostgreSQL), utilizandoo usuário postgres e a senha123456.

    - Em uma aplicação real podemosdeixar os parâmetros de conexão em

    um arquivo de propriedades. Dessa

    forma não é preciso recompilar o

    código.

     JDBC e Frameworks deMapeamento Objeto-Relacional

    Com o surgimento dosframeworks de mapeamen-to objeto-relacional (ORM),

    como Hibernate, TopLinke a própria JPA. O uso da

     JDBC teve uma queda con-siderável. Com o uso dessesframeworks, eliminamosdo código das aplicaçõesa dependência direta comas tabelas das bases de da-dos. Também eliminamosa necessidade de executarconsultas SQL no código daaplicação. Utilizando um

    framework ORM podemos

    Listagem 7. Classe ConnectionHelper alterada para utilizar uma basePostgreSQL.

    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”);}

    }

    simplesmente invocar um método save() passando um objeto (User , por exemplo) eo framework é capaz de criar uma instru-ção SQL INSERT mapeando os atributosdesse objeto nos campos da tabela deforma automática.

    Entretanto entender o funcionamento da JDBC continua sendo importante, pois osframeworks ORM utilizam a JDBC paraacessar as bases de dados. Isso é fácil deser visto nos arquivos de configuração, oumesmo nos métodos de conexão dessesframeworks, que geralmente têm um pa-râmetro para informar a URL de conexãocom a base de dados.

    Além disso, é possível que em algumasaplicações seja necessário o uso da JDBC,seja por ser uma aplicação legada, por

    questões de desempenho ou qualqueroutro motivo.

    ConclusãoNesta segunda parte do nosso artigo

    sobre JDBC, finalizamos a construção daAgenda de Contatos mostrando na práticacomo realizar operações básicas de mani-pulação de dados, como criar, editar, listare excluir. Para por à prova a portabilidadeda JDBC, simulamos uma situação de trocade base de dados e vimos que uma vez que

    a aplicação tenha sido construída de forma

  • 8/18/2019 Easy Java 0033453453578

    23/40Edição 03 • Easy Java Magazine  23

    planejada, quase não temos impacto noque diz respeito a este tipo de mudança.Vimos ainda o quanto criar uma aplicaçãono estilo “linha de Comando” pode ser

    fácil, por meio do uso da biblioteca ApacheCommons CLI.Portanto, após a leitura deste artigo o

    leitor estará apto para desenvolver apli-cações Java utilizando bancos de dados.Para concluir, recomendados a leitura doquadro “JDBC e Frameworks de Mapea-mento Objeto-Relacional”, que mostra umpequeno resumo da relação entre a JDBCe os frameworks ORM, tão utilizados nasaplicações atuais.

    Paulo César Coutinho [email protected]

    www.pcmnac.com

    É mestrando em Engenharia deSoftware pelo Centro de Estudos e Sis-temas Avançados do Recife (C.E.S.A.R).

    Atualmente, atua como analista de desenvolvimento desistemas no SERPRO. Tem experiência no desenvolvimen-to e projeto de aplicações/componentes Java, C/C++ eFlex. Possui as certificações SCJP 5 e SCWCD 1.4.

    http://java.sun.com/javase/6/docs/ 

    technotes/guides/jdbc/ 

    Documentação 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 doPostgreSQL.

    http://commons.apache.org/cli/ 

    Site oficial do Apache Commons CLI.

  • 8/18/2019 Easy Java 0033453453578

    24/4024 Easy Java Magazine • Edição 03

    Explore POO e Java de maneira interativa e visu

    Aprendendo POO e

    De que se trata o artigo: 

    Apresentação dos recursos didáticos oferecidos pela IDE Greenfoot. Esta ferramenta traz como benefício

    tornar a programação orientada a objetos menos abstrata e teórica e incrementar o estudo da linguagem

    de programação Java.

    Para que serve: Fornecer a programadores iniciantes uma experiência concreta com objetos através de um maior envol-

    vimento nos estudos da linguagem de programação Java e do paradigma orientado a objetos.

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

    Além de ser uma boa alternativa de aprendizado de Java e POO, permite a geração de problemas para

    desenvolvedores inexperientes fazendo uso de cenários visuais e com grande interatividade.

     Aprendendo POO e Java: 

    Oferecer uma aprendizagem de Java com experiência mais concreta e apresentar o paradigma orien-

    tado a objetos sem muita abstração são os principais benefícios da IDE Greenfoot: um projeto suportado

    pela Sun Microsystems e que vem ganhando espaço no meio acadêmico com público-alvo direcionado

    a programadores iniciantes.Através de um exemplo simples definido com um cenário de simulação de tráfego rodoviário, permite-se

    desenvolver com esta ferramenta objetos que serão os seus atores (veículos e semáforos). Também serão

    destacados neste mesmo cenário, conhecimentos a cerca de classes, objetos, herança, polimorfismo e

    interface. A interatividade e a representação visual dos objetos s