Java Magazine 51.pdf

66

Transcript of Java Magazine 51.pdf

  • Conhea nossos frameworks open-source

    O framework genesis garante uma maior produtividade no desenvolvimento de aplicaes desktop, permitindo a utilizao de Swing, SWT e Thinlet de forma declarativa e com suporte a anotaes como forma de evitar as complexidades e particularidades de cada API grfi ca. Seu modelo de integrao entre interface e camada de negcios possibilita que aplicaes locais, implementadas de forma simples e facilmente testvel, possam ser posteriormente dis-ponibilizadas em arquitetura rich-client distribuda, simplesmente reconfi gurando-se sua lgica de negcios para execuo remota em servidores Java EE. Alm de open-source e gratuito, o genesis possui extensa documentao (em ingls e portugus) e uma ativa comunidade de desenvolvedores.

    Uma empresa premiadaEntre os projetos que j contaram com a consul-

    toria da Summa Technologies, incluem-se os trs nicos sistemas brasileiros premiados com o Duke

    Award, conferido anualmente durante o JavaOne Conference: Carto Nacional de Sade do Datasus

    (2003); IRPF Multiplataforma da Receita Federal e Serpro (2004); e Sistema Integrado de Agenda-

    mento de Pacientes da Secretaria de Sade da Prefeitura de So Paulo (2005).

    E m b u s c a d e n o v o s d e s a f i o s e m s u a c a r r e i r a ? E n v i e s e u c u r r c u l o p a r a : c u r r i c u l o @ s u m m a - t e c h . c o m

    O DevWare um ambiente virtual completo de desenvolvimento j insta-lado e confi gurado, composto exclusivamente por produtos open source. Inclui controle de issues e de verso, automao de buid, frum, wiki corporativa, servidores web, email e ftp, repositrio maven2, servidor ldap para controle de usurios, console administrativo, entre outros. Com baixo consumo de re-cursos e baseado em tecnologia de virtualizao, o DevWare foi projetado especialmente para facilitar tarefas administrativas como backup e migrao entre mquinas. Consulte-nos para saber como o DevWare, combinado com boas prticas de desenvolvimento, pode aumentar a qualidade e produtividade de seus projetos Java.

    Os frameworks genesis e DevWare foram criados pela Summa Technologies, disponibilizados de forma livre e gratuita (licena open source LGPL).

    Para maiores informaes, downloads edocumentaes consulte os sites: https://genesis.dev.java.net/https://devware.dev.java.net/

    Uma nova marca, a confi abilidade de sempre.

    DevWare

    genesis

    Consultoria . Arquitetura . Mentoring . Treinamento . Framework . Componentes

    Summa Technologies do Brasil . +55.11.3055.2060 . www.summa-tech.com

  • Espe

    cial NO MUNDO DA INTERNACIONALIZAOFERNANDO LOZANO

    Entendendo e usando os recursos da plataforma Java para a construo de aplicaes inter-nacionalizveis, de sistemas console a aplicaes desktop e web

    08

    Mob

    ile e

    Web

    PORTLETS COM JBOSS PORTALEDGAR SILVA

    Saiba como construir de forma simples portlets para portais corporativos em Java, utilizando APIs padres de mercado e o container de portlets da JBoss

    60

    WIRELESS UPDATE: MIDP 2.1MARLON LUZ

    Conhecendo mudanas na verso fi nal mais recente do perfi l MIDP, que s agora est chegando aos celulares do mercado mundial e brasileiro

    30

    Core

    Qual

    idad

    e

    40LAYOUTS EFICAZES COM SITEMESHDANIEL CICERO AMADEI

    Tcnicas para manter um look-and-feel e uma estrutura consistentes entre todas as pginas de suas aplicaes web, usando o framework livre da OpenSymphony

    18JAVA EE NO ECLIPSE COM WTP 2.0OSVALDO DOEDERLEIN

    Domine a nova verso do projeto da Fundao Eclipse para desenvolvimento de aplica-es corporativas em Java, e crie exemplos para web e Java EE 5

    34JAVAFX SCRIPT ATRAVS DE EXEMPLOSJORGE DIZ & YARA SENGER

    Conhea a nova linguagem JavaFX Script, que permite criar interfaces grfi cas ricas mais facilmente, com cdigo parecido estrutura dos componentes visuais

    52SISTEMAS MULTIAGENTESRICARDO MARQUES PORTO

    Usando a tecnologia de agentes inteligentes e o framework open source JADE para criar aplicaes dinmicas e altamente distribudas

    48TRATAMENTO DE EXCEES NA PRTICAANDR DINIZ

    Entendendo conceitos de excees do Java, usando boas prticas e evitando armadi-lhas, para tornar suas aplicaes mais robustas e organizar a manipulao de erros

    Contedo

  • Retornamos mais uma vez ao assunto de desenvolvimento web e Java EE, mas nesta edio com um toque especial de modernidade. Voc vai ver, por exemplo, como criar uma aplicao com acesso a banco de dados usando o novo JavaFX Script. O conjunto de tecnologias JavaFX, que inclui alm do JavaFX Script, o JavaFX Mobile (para dispositivos mveis de alta capacida-de) foi lanado no incio desse ano e possibilita a criao de interfaces ricas com recursos similares ao Flash, porm com a vantagem do acesso s APIs do Java, sem adaptaes foradas. Com o suporte crescente a ferramentas, o JavaFX est se tornando uma soluo eficaz para a criao de aplicaes com GUIs interativas e ricas.

    A esperada verso 2.0 do Web Tools Project coloca o Eclipse de volta na disputa pela liderana no desenvolvimento Java EE 5, trazendo muitos novos recursos e mais robustez. Nos exemplos criados no artigo sobre o WTP, so exercitadas as principais facilidades do projeto. Voc ver como desenvolver passo a passo uma aplicao Java EE fazendo uso de JSF, EJB 3.0, JPA e Apache Derby.

    Ainda dentro dos destaques de capa, trazemos um artigo aprofundado sobre o Sitemesh, um framework que compete de frente com o Apache Tiles (discutido nas duas edies anteriores) e oferece vantagens em certos aspectos. Voc poder enten-der o funcionamento interno do Sitemesh, alm de como us-lo da melhor forma em suas aplicaes web, para padronizar e organizar o layout das pginas.

    Com a expanso das empresas nacionais no exterior e o inexorvel cresci-mento da web, vem se tornando ainda mais importante a criao de aplica-es internacionalizveis: prontas para serem traduzidas e adaptadas para novos idiomas e culturas. Um artigo especial nesta edio esmia o assunto, mostrando como usar os muitos recursos que o Java oferece para i18n, tanto para aplicaes console como para as Swing e web.

    Veja ainda como criar portlets e rod-los no JBoss Portal; conhea as novi-dades do MIDP 2.1 na nossa coluna sobre tecnologias wireless, e confira um artigo para iniciantes voltado ao tratamento de excees. Tambm no perca a matria sobre o uso de agentes inteligentes com Java, que demonstra como tcnicas antes exploradas apenas no meio acadmico j esto sendo usadas com sucesso em aplicaes comerciais e como voc pode aproveit-las em suas aplicaes.

    Boa leitura!

    Leonardo Galvo

    Carta ao LeitorDireoDiretor de Marketing Gladstone Matos

    EdioPublisher e Editor-Chefe

    Leonardo Galvo ([email protected])

    Editores adjuntos

    Osvaldo Doederlein ([email protected])

    Fernando Lozano ([email protected])

    Colaboraram nesta edioAndr Diniz, Daniel Cicero Amadei, Fernando Lozano, Jorge Diz, Marlon Luz, Osvaldo Doederlein, Ricardo Marques Porto, Yara Senger

    ArteDiagramao Vinicius O. Andrade

    Ilustraes e Capa: Antonio Xavier

    ProduoGerncia de Marketing Kaline Dolabella

    DistribuioFernando Chinaglia Distribuidora S.A.

    Rua Teodoro da Silva, 907, Graja - RJ

    CEP 20563-900, (21) 3879-7766 - (21) 2577-6362

    Atendimento ao leitorA 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 2283-9012.

    Edies anterioresAdquira as edies anteriores da revista Java Magazine ou de qualquer outra publicao do Grupo DevMedia de forma prtica e segura, em www.devmedia.com.br/anteriores.

    [email protected], 21 2213-0940

    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.

    Reprints Editoriais Se foi publicado na Java Magazine um artigo que possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a reimpresso da matria junto com a capa da edio em que saiu, e distribua esse reprint personalizado entre seus clientes.

    Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD com uma amostra de seus produtos na Java Magazine e atinja um pblico segmentado e formador de opinio.

    Java, o logotipo da xcara de caf Java e todas as marcas e logotipos baseados em ou referentes a Java so marcas comerciais ou marcas registradas da Sun Microsystems, Inc. nos Estados Unidos e em outros pases.

    Ano VI Edio 50 2007 ISSN 1676-8361

    ApoioRealizao

  • Padres de Projeto em JavaApresentando diversos design patterns, e aplicando-os na

    prtica usando a linguagem e as plataformas Java.

    http://www.devmedia.com.br/cursos/saibamais.asp?curso=25

    Introduo ao desenvolvimento para celulares com Java MEApresentando tcnicas, APIs e ferramentas para a criao de

    aplicaes com a tecnologia Java Micro Edition.

    http://www.devmedia.com.br/cursos/saibamais.asp?curso=17

    www.devmedia.com.br/javaplus .

    6 Java Magazine Edio 50

    Caro leitor, como voc j sabe, o conceito de assinatura da revista Java Magazine mudou. O novo assinante da revista Java Magazine possui uma Assinatura de Contedo Java Plus:

    Java Plus = Revista impressa + Vdeo-aulas + Cursos online

    O pacote Java Plus inclui:

    Recebimento mensal da revista Java Magazine (12 edies)

    Acesso, durante um ano, ao portal JavaPlus, contendo vdeo-

    aulas e cursos online.

    Continuamos estendendo o portal com vdeo-aulas voltadas ao

    desenvolvedor Java e para iniciantes na tecnologia. J so mais de

    200 aulas, alm de dois cursos online. Acesse o portal JavaPlus e

    saiba como obter esse novo benefcio em sua assinatura!

    Na compra desta edio, tenha acesso a 10 aulas sobre a criao de relatrios em Java com o iReport:

    1. Configurao do ambiente e viso geral2. Criando um relatrio diretamente, sem o assistente3. Manipulao de classes e realizao de clculos4. Agrupamentos e parmetros5. Quebras e Bookmarks6. Relatrios com cores alternadas (zebrados)7. Relatrios CrossTab bsico8. Relatrios CrossTab avanados9. Grficos de piizza 3D10. Grficos em linhas

    Para visualizar, acesse o link:w w w.d e v m e d ia.co m . b r/a r t i c l e s / l i s tco m p. a s p?ke y wo r d = j m 51& co d i g o b a n c a = m e t r o j a v a

    Na DevMedia, o leitor de banca tambm ganha!

    Conhea a assinatura Java Magazine Plus mais contedo

    Java com mais de 200 vdeo-aulas para voc e dois Cursos Online.

    Novidades recentes em vdeo-aulas Cursos OnlineTipos enumerados: coisas que talvez voc no soubesse que pudesse fazer com eles Nesta vdeo-aula, so apresentados os tipos enumerados, presentes na linguagem Java a partir da verso 5, desmistificando a viso

    comum a diversos desenvolvedores de que os enums no passam

    de valores numricos glorificados.

    Web Services e XML - DOM Partes 1, 2 e 3Nestas aulas, veja uma introduo ao uso de XML via DOM, bem como uma anlise dessas tecnologias no contexto de web services

    Persistncia Flexvel com BoxSQL Partes 1 a 4 Como criar uma camada de persistncia flexvel utilizando o framework

    BoxSQL, Generics e Reflection. Na primeira aula, estruturamos o projeto e apresentamos o BoxSQL. Depois construda a interface DAO e a classe

    GenericBoxDAO, buscando a utilizao com diversos beans. Construmos

    ento os templates SQL, explicando a forma como os parmetros so

    mapeados. Na quarta parte, vemos como construir a classe de testes unitrios para o DAO genrico que criamos.

    Ruby on Rails Partes 1 a 6O Ruby on Rails j foi concorrente direto do Java, mas hoje a

    JVM e ferramentas como o NetBeans so ambientes excelen-tes para execuo de aplicaes e o desenvolvimento com o

    RoR. Veja nesta srie de artigos como desenvolver com Ruby

    e o framework Rails. O curso comea com uma viso geral

    do Rails, passa ao Scaf fold e IRB e depois entra na discusso

    do Active Record e recursos de validao. A quarta aula trata

    da associao de entidades. Em seguida, voc v como usar

    o console do Rails, em duas aulas.

  • Edio 46 Java Magazine 7 Edio 50 Java Magazine 7

  • 8 Java Magazine Edio 51

    Construindo aplicaes para vrios idiomas e culturas

    No Mundo da Internaci onalizao

    Uma aplicao internacionalizvel tem seu cdigo escrito de modo que seja adaptvel a diferentes idiomas e a diferentes culturas, sem que para isso seja necessrio modificar os fontes ou mesmo re-compilar a aplicao. Muitas vezes a palavra internacionalizao abreviada para i18n, que vem do termo ingls internationalization (representando a primeira e ltima letra, com 18 caracteres entre elas).

    No mundo globalizado, onde vrias em-presas brasileiras atuam fortemente em pases diversos, importante desenvolver desde o incio aplicaes internacionali-zveis. Tambm comum que sistemas inicialmente desenvolvidos internamente por filiais no Brasil de empresas multina-cionais sejam posteriormente adotados em outras filiais e at mesmo pela matriz. Por isso fundamental saber como desenvol-ver aplicaes i18n.

    A plataforma Java foi o primeiro am-biente de desenvolvimento de uso amplo a trazer funcionalidades voltadas para a

    matao de datas para exibio assumam as configuraes corretas, sem interveno do usurio ou do programador.

    Em uma avaliao superficial, o processo de internacionalizao2 de uma aplicao pode parecer trivial, o que pode levar o desenvolvedor a no valorizar tanto as facilidades embutidas na plataforma Java. Afinal, bastaria fazer coisas simples como trocar arquivo por file em todo o cdigo, ou exibir datas em formato ms/dia/ano em vez de dia/ms/ano, para se ter uma aplicao internacionalizvel. Entretanto, ao se levar em conta problemas como a correta ordenao de strings acen-tuadas, diferenas gramaticais e mscaras para entrada de dados, a questo deixa de ser simples. Por exemplo, ma deve vir antes ou depois de maca? Ou ento, as mensagens devem seguir a forma verbo-quantificador-substantivo, por exemplo encontrados 3 registros, ou devem seguir a forma quantificador-substantivo-verbo como em 3 records found)?

    Muitas dessas questes so resolvidas pela plataforma Java sem interveno do programa-dor (simplesmente funciona!). Mesmo assim, o programador deve fazer sua parte para criar aplicaes 100% internacionalizveis. Por isso este artigo apresenta as principais funcionali-dades para internacionalizao oferecidas pelas plataformas Java SE e Java EE, exemplificando seu uso em aplicaes Swing e web.

    Sobre os exemplosOs exemplos iniciais deste artigo sero

    compilados e executados diretamente pela linha de comando do sistema operacional, utilizando os comandos fornecidos com o

    2 importante no confundir o processo de internacio-nalizao, que responsabilidade do programador, com o processo de localizao. Este ltimo a traduo de uma aplicao para um idioma e uma regio especfi cos que em geral realizado por profi ssionais sem conheci-mentos de programao de computadores.

    internacionalizao de aplicaes. Estas funcionalidades tm vrias formas, sendo duas de interesse especial para o desenvol-vedor de aplicaes:

    1- A possibilidade de se obter automati-camente verses especficas de recursos (arquivos de dados) para as configura-es regionais1 do usurio, em tempo de execuo.

    2- A capacidade de vrias classes da biblioteca padro do Java SE modificar seu comportamento de acordo com as configuraes regionais do usurio.

    A primeira funcionalidade torna fcil exibir mensagens (strings) diferentes de acordo com o idioma do usurio. J a segunda faz com que operaes como for-

    1 Estamos usando o termo confi guraes regionais para indicar as preferncias do usurio em relao a idio-ma, fuso horrio, formato de datas, nmeros e quaisquer outras caractersticas culturais que possam ser confi gu-radas pelos mecanismos padres do sistema operacional nativo ou pelo navegador web.

  • Edio 51 Java Magazine 9

    Construindo aplicaes para vrios idiomas e culturas

    No Mundo da Internaci onalizaoConhea os recursos da plataforma Java para a

    construo de aplicaes internacionalizveis de sistemas console a

    aplicaes desktop e web

    Fernando Lozano

    JDK. J os exemplos mais complexos sero compilados e executados (ou, no caso da-queles para web, deployados) por meio de um buildfile do Ant. Todos os exemplos fo-ram testados com o JDK 1.5.0 e o Tomcat 5.5, mas devem funcionar sem modificaes em verses mais recentes do Java e em outros containers web aderentes s especificaes Servlets 2.4 e JSP 2.0 ou superiores.

    Localidades, idiomas e pasesAs funcionalidades para internacionali-

    zao do Java so baseadas no conceito de locale, ou localidade. Mais especificamente, um java.util.Locale representa a combinao de um idioma e uma regio geogrfica (sendo esta ltima opcional). O idioma e a regio de um locale so identificados por cdigos de duas letras padronizados pela ISO, por exemplo o familiar pt_BR para o portugus brasileiro ou en_GB para o ingls da Gr-Bretanha.

    A classe Locale em si quase no tem inteligncia. Ela basicamente agrupa os dois identificadores, junto a um terceiro identificador para a variante (tambm opcional). Esta serve apenas para acomo-dar dialetos regionais3 e para compatibili-dade retroativa com o comportamento de verses antigas dos sistemas operacionais nativos. A funcionalidade de internaciona-lizao em si fornecida por vrias classes que aceitam uma instncia de Locale como parmetro, por exemplo java.util.Calendar, java.util.Currency e java.text.NumberFormat.

    Se o leitor nunca precisou se preocupar com objetos Locale, porque a JVM fornece um Locale default, que instanciado na ini-cializao da JVM de acordo com as confi-

    3 Certamente nenhum desenvolvedor julgaria neces-srio ter uma verso especfica de uma aplicao para o portugus da Bahia ou para o portugus gacho, mas em vrios pases da Europa e da sia os dialetos regionais dentro de um mesmo pas so to ou mais diversos em termos de vocabulrio, e at de variaes gramaticais, quanto o portugus do Brasil e o de Portugal.

    guraes regionais do usurio. Para deixar evidente a presena do Locale na JVM, as Listagens 1 e 2 apresentam dois exem-plos, VerLocalidade.java e ListaLocalidades.java, que permitem consultar a localidade padro ou obter informaes sobre as lo-calidades disponveis na JVM. As mesmas listagens apresentam exemplos de utiliza-

    o destes dois programas pela linha de comando do sistema operacional.

    A localidade default da JVM pode ser mo-dificada pela chamada a Locale.setDefault(), embora o mais comum seja manter qual-quer que seja a localidade selecionada pela prpria JVM em sua inicializao. O programa na Listagem 3 demonstra a

    Listagem 1. Exemplo de manipulao de Locales

    VerLocalidade.java

    import java.util.*;

    public class VerLocalidade { public static void main(String[] args) { Locale localidade = null; if (args.length == 0) { localidade = Locale.getDefault(); System.out.println(A localidade padro do usurio : + localidade); } else { if (args.length == 1) localidade = new Locale(args[0]); else if (args.length == 2) localidade = new Locale(args[0], args[1]); else if (args.length == 3) localidade = new Locale(args[0], args[1], args[2]); System.out.println(A localidade requisitada : + localidade); } System.out.println(Idioma: + localidade.getDisplayLanguage()); System.out.println(Pas: + localidade.getDisplayCountry()); System.out.println(Variante: + localidade.getDisplayVariant()); }}Exemplos de execuo de VerLocalidade

    $ java VerLocalidadeA localidade padro do usurio : pt_BRIdioma: portugusPas: BrasilVariante:

    $ java VerLocalidade ptA localidade requisitada : ptIdioma: portugusPas: Variante:

    $ java VerLocalidade en GBA localidade requisitada : en_GBIdioma: EnglishPas: United KingdomVariante:

    $ java VerLocalidade no NO NYA localidade requisitada : no_NO_NYIdioma: NorwegianPas: NorwayVariante: Nynorsk

  • 10 Java Magazine Edio 51

    No Mundo da Internacionalizao

    Listagem 2. Exemplo de como relacionar as localidades reconhecidas pela JVM

    ListaLocalidades.java

    import java.util.*;public class ListaLocalidades { public static void main(String[] args) { Locale[] localidades = Locale.getAvailableLocales(); System.out.println(Esto disponveis na JVM + localidades.length + localidades:); for (Locale localidade : localidades) { System.out.print(localidade + \t); System.out.print(( + localidade.getDisplayLanguage()); System.out.print(, + localidade.getDisplayCountry()); System.out.println(, + localidade.getDisplayVariant() + )); } }}

    Execuo de ListaLocalidade$ java ListaLocalidadesEsto disponveis na JVM 132 localidades:ar (Arabic, , )ar_AE (Arabic, United Arab Emirates, )ar_BH (Arabic, Bahrain, )ar_DZ (Arabic, Algeria, )ar_EG (Arabic, Egypt, )ar_IQ (Arabic, Iraq, )... restante da listagem omitida para poupar espao

    Listagem 3. Exemplo de configurao explcita de Locale

    MudaLocalidade.javaimport java.util.*;import java.text.*;

    public class MudaLocalidade { public static void main(String[] args) { //... instanciao do locale igual ao Exemplo 1 da listatem 1 Locale.setDefault(localidade); DateFormat df = DateFormat.getDateInstance(); Date agora = new Date(); System.out.println(Data corrente na localidade + localidade + : + df.format(agora)); }}

    Exemplo de MudaLocalidade$ java MudaLocalidadeData corrente na localidade pt_BR: 11/09/2007$ java MudaLocalidade en USData corrente na localidade en_US: Sep 11, 2007$ java MudaLocalidade en GBData corrente na localidade en_GB: 11-Sep-2007

    Listagem 4. Faixas.java

    import java.util.*;import java.text.*;public class Faixas { public static void main(String[] args) { double[] limites = { 0, 1, ChoiceFormat.nextDouble(1) }; String[] mensagens = { No foi encontrado nenhum registro, Foi encontrado um nico registro, Foram encontrados vrios registros }; ChoiceFormat resultado = new ChoiceFormat(limites, mensagens); int numero = Integer.parseInt(args[0]); System.out.println(resultado.format(numero)); }}

    Execuo de Faixas$ java Faixas 0No foi encontrado nenhum registro$ java Faixas 1Foi encontrado um nico registro$ java Faixas 2Foram encontrados vrios registros

    mudana de localidade, e tambm como o formato padro para exibio de datas modificado de acordo com a localidade default configurada para a JVM.

    Na verdade, no necessrio mudar a localidade para a JVM como um todo, pois todos os mtodos cujo comportamento seja afetado pela localidade possuem tambm uma sobrecarga que recebe um java.util.Locale como argumento. Ento estas duas linhas:

    Locale.setDefault(localidade);DateFormat df = DateFormat.getDateInstance();

    Poderiam ser substitudas por:

    DateFormat df = DateFormat.getDateInstance( DateFormat.DEFAULT, localidade);

    E o exemplo da Listagem 3 funcionaria exatamente da mesma forma.

    Formatao de mensagensAs classes java.text.DateFormat e java.text.

    NumberFormat so de utilizao bem direta, como foi demonstrado pelo exemplo da Listagem 3. Entretanto, o pacote java.text fornece ainda duas classes que so muito teis para aplicaes internacionalizveis, e que curiosamente no so afetadas dire-tamente pela localidade default da JVM. Elas so ChoiceFormat e MessageFormat.

    ChoiceFormat retorna mensagens diferentes de acordo com faixas de valores para um argumento numrico. Sua maior utilidade em lidar com plurais, permitindo gerar mensagens gramaticalmente corretas, como mostra o exemplo da Listagem 4.

    O exemplo define trs faixas de valores: zero; maior que zero e menor ou igual a um; e maior que um. Os limites para cada faixa so valores decimais (double), mas como no exemplo estamos utilizando apenas valores inteiros, as faixas so na verdade: zero, um e maior que um.

    Observe o uso do mtodo nextDouble() para que o limite final seja aberto ou infini-to, de modo que qualquer valor maior que um caia na terceira faixa. Dessa forma, o ChoiceFormat seleciona a mensagem correta, substituindo um conjunto de comandos if...else if...else.

    Mensagens com valoresJ a classe MessageFormat permite compor

    mensagens reunindo variveis e texto

  • Edio 51 Java Magazine 11

    Listagem 5. Uso de MessageFormat

    Mensagem.java

    //... imports omitidospublic class Mensagem { public static void main(String[] args) { int numero = Integer.parseInt(args[0]); System.out.println(MessageFormat.format( Foram encontrados {0,number} registros,numero)); }}

    Execuo de Mensagem

    $ java Mensagem 1Foram encontrados 1 registros$ java Mensagem 2Foram encontrados 2 registros

    Listagem 6. Uso conjugado de ChoiceFormat e MessageFormat

    MensagemComFaixas.java (destacadas em negrito as diferenas entre este e o exemplo da Listagem 4)

    //... imports omitidospublic class MensagemComFaixas { public static void main(String[] args) { double[] limites = { 0, 1, ChoiceFormat.nextDouble(1) }; String[] mensagens = { No foi encontrado nenhum registro, Foi encontrado um nico registro, Foram encontrados {0,number} registros }; ChoiceFormat resultado = new ChoiceFormat(limites, mensagens); System.out.println(MessageFormat.format(resultado.format(numero), numero)); }}

    Execuo de MensagemComFaixas

    $ java MensagemComFaixas 1Foi encontrado um nico registro$ java MensagemComFaixas 2Foram encontrados 2 registros

    MensagemComFaixas.java (segunda verso)

    //... imports omitidospublic class MensagemComFaixas { public static void main(String[] args) { String mensagem = {0,choice, + 0#no foi encontrado nenhum registro| + 1#foi encontrado um nico registro| + 1

  • 12 Java Magazine Edio 51

    No Mundo da Internacionalizao

    usurio, com poucas linhas de cdigo. A mensagem retornada pelo ChoiceFormat utilizada como string de formatao por um MessageFormat. Nas faixas limitadas por zero e um, a mensagem retornada por ChoiceFormat fixa. J para valores maiores que um, a mensagem retornada por ChoiceFormat contm uma mscara para a insero do nmero de registros, que ento processada pelo MessageFormat.

    possvel simplificar o cdigo utilizando o ChoiceFormat implicitamente, como uma mscara de formatao de um MessageFormat, tal qual foi feito com o NumberFormat. possvel ainda aninhar mscaras de for-matao dentro de uma string de padro do MessageFormat, outra coisa que no seria possvel fazer com printf().

    A Listagem 6 apresenta tambm uma segunda verso de MensagemComFaixas.java usando mscaras aninhadas. Mais especificamente, temos uma mscara {0,choice} que aninha uma mscara {0,number} em uma string de padro do MessageFormat. Esta segunda verso funcionalmente

    equivalente primeira, mas o cdigo bem mais conciso.

    A sintaxe para se aninhar um ChoiceFormat dentro de um padro para MessageFormat pode ser um tanto confusa nos seus pri-meiros usos. Ento vamos desmontar o terceiro exemplo, passo a passo:

    1. A notao {0,choice,...} indica que o primeiro argumento (zero) utilizar um ChoiceFormat;

    2. O primeiro limite e a mensagem corres-pondente so indicados por 0#no foi..., onde o caractere jogo-da-velha separa o valor do limite da mensagem correspondente;

    3. Uma barra vertical (ou pipe) in-dica o final da primeira mensagem em ...registro|1#foi encontrado... Depois vem o segundo limite, e novamente um sinal de jogo-da-velha separa o segundo limite da segunda mensagem;

    4. Mais uma vez, temos uma barra ver-tical para finalizar a segunda mensagem em ...registro|1

  • Edio 51 Java Magazine 13

    como sendo um arquivo de propriedades e encapsulado em uma instncia de java.util.PropertyResourceBundle4.

    O exemplo da Listagem 7 demonstra como usar recursos da JVM para obter a string a ser utilizada como padro para MessageFormat. Neste exemplo, a string mensagens, passada para o mtodo getBundle(), a base para o nome do arqui-vo de recursos a ser localizado. O nome construdo pela adio de um ou mais su-fixos correspondentes aos identificadores de idioma, pas e variante armazenados no Locale. J a string resultado_busca passada para o mtodo getString() a chave para a entrada no arquivo que retorna a

    4 Na verdade, a classe ResourceBundle ainda mais pode-rosa, fornecendo um mecanismo genrico para a obten-o de recursos, os quais podem envolver outras coisas que no arquivos de propriedades. Entretanto as alternati-vas no so to utilizadas quanto o PropertyResourceBundle e, na maioria dos casos, exigem a definio de uma espe-cializao de ResourceBundle; por isso no sero apresen-tadas neste artigo.

    mensagem desejada.Fazem parte do exemplo dois arquivos de

    propriedades: mensagens_pt_BR.properties e mensagens_en.properties. Note que se ResourceBundle no encontrar um arquivo de propriedades correspondente localidade desejada, como no caso en_US, ele des-carta a variante e o pas e tenta localizar um arquivo que corresponda apenas ao idioma da localidade. Neste caso encontrado mensagens_en.properties. Por outro lado, o ResourceBundle no ir tentar usar arquivos do mesmo idioma mas com pas diferente; por isso mensagens_pt_BR.properties no foi localizado para a localidade pt.

    No sendo encontrado um arquivo de pro-

    priedades correspondente localidade desejada,

    ResourceBundle utiliza o arquivo disponvel para en ou en_US. Ou seja, para qualquer localidade

    ainda no suportada pela aplicao (como no

    caso de es espanhol no exemplo) sero utili-

    zados os recursos para o idioma ingls.

    Usurios de sistemas Unix, como o Linux e o MacOS X, podero fazer como no exemplo de execuo da Listagem 7, utilizando na linha de comando a notao LANG=localidade para executar a classe Recurso sob uma localidade diferente da es-pecificada nas configuraes regionais do usurio corrente. J usurios de sistemas Windows tero de mudar a localidade pelo Painel de Controle, ou ento modificar o programa para forar uma localidade diferente (com Locale.setDefault()).

    Excees e internacionalizaoA apresentao da classe ResourceBundle

    encerra nosso estudo sobre os recursos ge-rais para internacionalizao de aplicaes Java. Agora podemos tratar de considera-es especficas para aplicaes grficas (Swing) e web. Mas, antes de entrar nos exemplos de aplicaes mais elaboradas, vale chamar a ateno para um erro concei-tual s vezes cometido por iniciantes.

  • 14 Java Magazine Edio 51

    No Mundo da Internacionalizao

    Muitos desenvolvedores se questionam porque a classe java.lang.Throwable e suas subclasses, ou seja, as excees do Java, no so internacionalizveis. Eles sugerem que uma instncia de Throwable poderia ser inicializada contendo vrias mensagens, uma para cada localidade suportada pela aplicao. Outros se do ao trabalho de obter, via programao, as mensagens de erro a serem embutidas nas suas excees, a partir de ResourceBundles.

    O erro conceitual aqui exibir para o usurio a mensagem de erro embutida em uma exceo, quando esta mensagem na verdade serve para consulta por um desenvolvedor (que est depurando um erro de cdigo, por exemplo), ou para o suporte tcnico, que veria a mensagem de erro e o stack trace da exceo registrados em um arquivo de log.

    A questo que, na maioria dos casos, a mensagem de erro de uma exceo muito tcnica para um usurio final. A situao se complica ainda mais se levarmos em conta que excees de negcio podero aninhar excees de mais baixo nvel, por exemplo erros de rede, como suas causas. Alm disso, uma exceo geralmente no

    Listagem 8. Aplicao Swing localizada para portugus e ingls

    package localidades;//... imports omitidospublic class Janela extends JFrame { public Janela() { initComponents(); setLocationRelativeTo(null); localidade.setSelectedItem(getLocale().toString()); } private void initComponents() { //... algumas inicializaes omitidas ResourceBundle mensagens = ResourceBundle.getBundle( localidades/mensagens, getLocale()); FormListener formListener = new FormListener(); setTitle(mensagens.getString(titulo)); rotuloLocalidade.setLabelFor(localidade); rotuloLocalidade.setText(mensagens.getString(rotuloLocalidade)); dataCorrente.setValue(new Date()); localidade.setModel(new DefaultComboBoxModel( new String[] { pt_BR, en_US })); localidade.addItemListener(formListener); rotuloDataCorrente.setText(mensagens.getString(rotuloData)); //... outras inicializaes omitidas pack(); } private class FormListener implements ItemListener { public void itemStateChanged(ItemEvent evt) { if (evt.getSource() == localidade) { Janela.this.mudaLocalidade(evt); } } } private void mudaLocalidade(ItemEvent evt) { if (evt.getStateChange() == evt.SELECTED) { Locale novaLocalidade = null; String[] ids = ((String)evt.getItem()).split(_); if (ids.length == 1) novaLocalidade = new Locale(ids[0]); else if (ids.length == 2) novaLocalidade = new Locale(ids[0], ids[1]); if (novaLocalidade.equals(getLocale())) return; this.setVisible(false); Locale.setDefault(novaLocalidade); JComponent.setDefaultLocale(novaLocalidade); Janela janela = new Janela(); janela.setVisible(true); this.dispose(); } } private JFormattedTextField dataCorrente; private JComboBox localidade; private JLabel rotuloDataCorrente; private JLabel rotuloLocalidade;

    public static void main(String[] args) { new Janela().setVisible(true); } }

    Figura 1. A mesma aplicao Swing, em dois idiomas

    Figura 2. Servlet Internacionalizado

  • Edio 51 Java Magazine 15

    tem conhecimento do contexto em que foi gerada, ou seja, de quais mtodos de ne-gcio a provocaram. Isto limita seriamente a possibilidade de se gerar uma mensagem inteligvel para o usurio e ao mesmo tem-po preservar o isolamento entre as classes de diferentes camadas da aplicao.

    A prtica correta utilizar o tipo da exceo, ou seja, sua classe, para gerar na camada de apresentao uma men-sagem de erro contextualizada. Dessa maneira, em vez de informar ao usurio caminho de rede no encontrado, sem rota para o host, fornecemos algo como No foi possvel realizar a consulta, tente novamente mais tarde. A sim, o cdigo da camada de apresentao utilizar re-cursos para obter a mensagem localizada para o idioma do usurio.

    Em caso de dvida, lembre que formata-o e traduo de mensagens responsabi-lidade da camada de apresentao. Ento classes de negcios, DAOs e outros tipos

    de objetos fora da camada de apresentao no precisam e nem devem ser localiz-veis (com o sentido de serem traduzveis para outros idiomas).

    No queremos dizer que classes de negcio no so internacionalizveis, mas apenas que devemos prestar es-pecial ateno s responsabilidades de cada camada. Por exemplo, a exibio do indicador de moeda R$ ou US$ responsabilidade da camada de apresen-tao mas saber se um valor especi-ficado em reais ou dlares americanos responsabilidade da camada de negcios. No mesmo exemplo, tambm com a ca-mada de negcio manter o valor da taxa de cmbio, caso seja necessrio fazer a converso entre valores armazenados em diferentes moedas. Por outro lado, decidir se deve ser utilizado vrgula ou ponto decimal claramente responsabilidade da camada de apresentao (e j previsto pela classe NumberFormat).

    Localizando aplicaes SwingO desenvolvedor de aplicaes desktop

    poder se surpreender com a aparente falta de suporte internacionalizao na biblioteca de componentes visuais padro do Java SE, o Swing. Com exceo da superclasse comum de todos os compo-nentes Swing/AWT, java.awt.Component, que define uma propriedade locale5 (mtodos getLocale() e setLocale()), praticamente no se encontram mtodos relacionados com localidades.

    Todo componente Swing especializa javax.swing.JComponent (por sua vez uma sub-classe de java.awt.Component), que acrescenta a propriedade esttica defaultLocale. Ela fornece o valor default para a propriedade locale utilizado na instanciao de compo-

    5 A maioria dos IDEs visuais, por exemplo o NetBeans, no exibe a propriedade locale na janela de proprieda-des do componente selecionado, pois no faz sentido na maioria dos casos haver componentes em localidades diferentes dentro do mesmo formulrio.

    C

    M

    Y

    CM

    MY

    CY

    CMY

    K

    caelum-novoanuncio-meiapagina.aiPage 1 21/09/2007 12:33:17

  • 16 Java Magazine Edio 51

    No Mundo da Internacionalizao

    nentes Swing.Mas o fato que a maioria dos compo-

    nentes Swing no utiliza para nada a sua prpria configurao de localidade. Por exemplo, no possvel inicializar um JLabel com valores especficos para a pro-priedade text de acordo com a localidade, e deixar que o prprio componente escolha qual valor exibir em tempo de execuo.

    Alguns componentes Swing realizam trabalho diretamente relacionado com

    Listagem 9. Servlet internacionalizvel e localizado para portugus e ingls

    package localidades;//... imports omitidos

    public class Hoje extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { Locale localidade = request.getLocale(); PropertyResourceBundle mensagens = (PropertyResourceBundle) ResourceBundle.getBundle(localidades/mensagens, localidade); DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, localidade); PrintWriter out = response.getWriter(); out.println(); out.println( + mensagens.getString(titulo) + ); out.println( + mensagens.getString(textoData)); out.println(df.format(new java.util.Date())); out.println( + mensagens.getString(textoLocalidade)); out.println(localidade.getDisplayName()); out.println(); } }

    Listagem 10. Pgina JSP internacionalizvel e localizada para portugus e ingls

    hoje.jsp: Pgina JSP localizada com uso do JSTL

    [ pt_BR | en ]

    Modificaes sobre o descritor web.xml necessrios para o funcionamento correto da pgina JSP

    javax.servlet.jsp.jstl.fmt.localizationContext localidades/mensagens

    internacionalizao por baixo dos panos, por exemplo, suportando diferentes mto-dos de entrada para digitao de texto (j parou para pensar como deve ser digitar um texto em japons?).

    Os recursos gerais de internacionaliza-o j apresentados sero suficientes para a maioria das situaes. Afinal, no h necessidade de se onerar um simples JLabel com vrias strings localizadas. Seria mais eficiente, em termos de uso de memria,

    obter a string correta para a propriedade text na instanciao do componente, utili-zando para isso um ResourceBundle.

    Ento o cdigo que inicializa um componente Swing poderia utilizar seu atributo locale para instanciar um PropertyResourceBundle e da inicializar propriedades como Window.title e Label.text. Caso o usurio deseje mudar o idioma da aplicao, basta modificar a localidade padro da classe JComponent e ento re-instanciar todos os componentes visuais. Esta a abordagem utilizada pelo exemplo da Listagem 8.

    Esse um exemplo minimalista de aplicao Swing internacionalizvel (veja-a em funcionamento na Figura 1). H poucos componentes: dois JLabels, um JFormattedTextField, pr-inicalizado para a data corrente, e um JComboBox que permite modificar a localidade da aplicao e ver imediatamente o resultado. Esto inclusos tambm arquivos de propriedades para portugus e ingls, mas convidamos o leitor a experimentar incluindo outros arquivos, por exemplo para espanhol.

    Uma possvel surpresa para o desen-volvedor que no basta modificar a propriedade esttica defaultLocale de JComponent. Afinal, as classes do Java SE externas ao Swing no tm a menor idia do que seja localidade configurada para um dado componente Swing. Infelizmente alguns componentes Swing, por exemplo JFormatedTextField falham em repassar sua prpria localidade para outras classes uti-lizadas internamente (no caso DateFormat, utilizada para formatar a data exibida pelo componente).

    Por isto necessrio manter em sincronia as localidades default configuradas para JComponent e para a JVM. Alguns IDEs (e desenvolvedores) Swing optam por ignorar completamente a localidade do componente, utilizando apenas a locali-dade da JVM.

    Testando o exemplo SwingO exemplo Swing traz um buildfile do

    Ant com os alvos limpar, compilar, empacotar e rodar. Tambm inclui o alvo tudo, que executa os outros quatro alvos na ordem apresentada. Este buildfile demonstra como os arquivos de propriedades uti-

  • Edio 51 Java Magazine 17

    java.sun.com/javase/technologies/core/basic/intl/Guia de internacionalizao do Java SE

    java.sun.com/developer/technicalArticles/Intl/MultilingualJSP/index.htmlDescreve estratgias para a construo de pginas JSP internacionalizadas

    jakarta.apache.org/taglibsImplementao do JSTL e outros taglibs da Apache Software Foundation

    www.loc.gov/standards/iso639-2/Cdigos de idiomas no padro ISO

    www.iso.org/iso/country_codes.htmCdigos de pases no padro ISO

    Fernando Lozano ([email protected], www.lozano.eti.br) trabalha h mais de 10 anos com desenvolvi-mento de sistemas de informaes e

    integrao de redes, sendo um dos pioneiros do uso do Software Livre no Brasil. Dentro da comunidade, atua como Conselheiro do LPI Brasil, Webmaster da FSF e Community Manager do Java.net. Atualmente consul-tor associado Neki Technologies (www.neki.com.br).

    lizados por um ResourceBundle podem ser convenientemente empacotados dentro do JAR de uma aplicao.

    Localizando aplicaes webAplicaes web representam um problema

    um pouco diferente do enfrentado nas apli-caes desktop. Enquanto que uma aplicao desktop em geral tem uma JVM inteiramen-te dedicada a um nico usurio, aplicaes web tm, claro, que atender a vrios usurios simultaneamente com a mesma JVM e cada usurio pode preferir operar a aplicao em um idioma diferente.

    O protocolo HTTP ajuda a resolver a questo com o cabealho Accept-Language, que especifica um ou mais identificadores de localidades, na ordem de preferncia do usurio. No Firefox, os valores enviados por este cabealho so configurados na aba Avanado da janela de preferncias, clicando-se no boto Selecionar, dentro do grupo Idioma.

    A classe javax.servlet.ServletRequest expe o cabealho HTTP Accept-Language, j traduzi-do para objetos java.util.Locale, atravs dos mtodos getLocale() e getLocales(). Ento fica fcil para um servlet ou pgina JSP sele-cionar mensagens em um ResourceBundle, ou instanciar formatadores com a confi-gurao correta, conforme o exemplo da Listagem 9.

    A Figura 2 apresenta o aspecto da pgina gerada pelo servlet. Para ver essa pgina em um idioma diferente, modifique as preferncias de idioma do seu navegador web, ou ento passe na URL parmetros correspondentes aos cdigos de idioma e de pas da localidade desejada; por exemplo:

    http://127.0.0.1:8080/localidades/dataDeHoje?idioma=en&pais=GB

    As mesmas APIs (mtodo ServletRequest.getLocale() e a classe ResourceBundle) so utili-zadas por frameworks web como o Struts, ou bibliotecas de tags como o JSTL, as quais oferecem suporte internacionalizao. O exemplo da Listagem 10 apresenta uma pgina JSP mais ou menos equivalente ao servlet do exemplo na listagem anterior.

    A pgina utiliza os tags do JSTL, e o nome do arquivo de propriedades configurado no descritor web.xml da

    aplicao, como um parmetro de con-texto (). So utilizados os mesmos arquivos de propriedades pelo serlvet e pela pgina JSP. A diferena que, enquanto que o cdigo do servlet referencia os arquivos explicitamente, os tags JSTL na JSP utilizam o arquivo con-figurado no descritor web.xml. Tambm seria possvel utilizar o tag do JSTL para indicar explicitamente o nome o arquivo de propriedades, dentro da prpria pgina.

    Os tags com prefixo fmt:format so equi-valentes ao uso das classes com no-mes parecidos no pacote java.text, ento baseado em DateFormat, e baseado em MessageFormat. Portanto possvel aplicar aqui as mesmas tcnicas vistas no incio do artigo, como o uso de mscaras {choice} e parmetros po-sicionais, que so indicados na pgina JSP pelo tag . J o tag permite configurar outra localidade (dife-rente da indicada pela requisio HTTP), para uso pelos tags do JSTL dentro da mesma pgina.

    Testando o exemplo webO exemplo web traz um buildfile do Ant

    semelhante ao utilizado para o exemplo Swing. Os alvos tudo, limpar, compilar e empacotar so mais ou menos equivalentes em ambos os exemplos, mas o exem-plo web substitui o alvo rodar pelo alvo instalar. O novo alvo faz o deployment da aplicao em um Tomcat 5.x ou 6.x, cujo caminho de instalao deve ser modifi-cado dentro do prprio buildfile. Ento o usurio pode acessar a aplicao pela URL http://127.0.0.1:8080/localidades e en-to seguir os links na pgina inicial para executar o servlet ou a pgina JSP.

    ConclusesEste artigo apresentou as APIs essenciais

    do Java para lidar com aplicaes interna-cionalizveis, em especial a classe java.util.Locale e o pacote java.text. Vimos tambm dicas para sua utilizao em aplicaes reais, por exemplo evitar a localizao de mensagens de excees Java.

    Em seguida foram apresentados exem-plos da aplicao destas APIs em aplica-es desktop e web, assim como detalhes

    especficos da interao entre as APIs Swing e de servlets e o JSTL, com os re-cursos de internacionalizao do Java SE.

    Dominando essas tcnicas e APIs, o leitor estar preparado para construir aplicaes internacionalizveis com o mnimo de es-foro e o mximo de flexibilidade.

    aplicao, como um parmetro de con-). So utilizados os

    mesmos arquivos de propriedades pelo serlvet e pela pgina JSP. A diferena que, enquanto que o cdigo do servlet referencia os arquivos explicitamente, os tags JSTL na JSP utilizam o arquivo con-

    web.xml. Tambm

    do JSTL para indicar explicitamente o nome o arquivo de propriedades, dentro

    fmt:format so equi-valentes ao uso das classes com no-

    java.text, ento DateFormat, e

    MessageFormatespecficos da interao entre as APIs Swing e de servlets e o JSTL, com os re-

  • Desenvolvendo aplicaes web e Java EE com o Eclipse

    Web Tools Platform 2.0

    Na Edio 47 apresentamos a nova verso 3.3 do Eclipse, tambm mencionando vrios outros pro-jetos da Eclipse Software Foundation (ESF) que fizeram parte do release Europa (O Europa foi discutido tambm na edio) . Embora o IDE bsico do Eclipse conte-nha as ferramentas mais essenciais para qualquer projeto (editor, compilador etc.) a crescente riqueza da plataforma Java torna importante o uso de ferramentas mais especializadas. Isso especialmente verdadeiro para projetos Java EE, os quais demandam muitas atividades alm de programao pura: editar pginas web estticas e dinmicas, trabalhar com XML, mapear objetos para tabelas, configurar

    Ambiente e instalaoAlguns IDEs j trazem funcionalidades

    Java EE no produto bsico, e o Eclipse costumava ser criticado por no ser assim. Mas isso apenas um efeito da estrutura extremamente modular dos projetos da Fun-dao Eclipse. O verdadeiro problema que a ESF, tradicionalmente, no disponibilizava distribuies orientadas ao usurio final. Isso comeou a melhorar com o Eclipse 3.2 (Callisto), cujo Update Manager permite co-mear com uma instalao bsica, selecionar componentes que sabemos que precisamos, e clicar em Select Required para marcar todos os subcomponentes e dependncias.

    Com o Eclipse 3.3 e o Europa, temos uma nova facilidade: a Fundao Eclipse criou uma srie de pacotes padronizados, para os conjuntos de funcionalidades mais populares (essas distribuies so deta-lhadas no artigo de Fernando Lozano, na Edio 50). No caso de desenvolvimento Java EE, voc s precisa ir em eclipse.org/downloads e escolher a opo Eclipse IDE for Java EE Developers. Isso o conduzir a um download nico de 125Mb. Ao leitor que ainda no tem familiaridade com o Eclipse ou com o WTP, recomendamos este download para acompanhar o presente artigo. Existem tambm (como j existiam antes) vrias distribuies de terceiros, mas no h dvida que as distribuies oficiais da ESF contribuiro para melhorar a reputao do Eclipse quanto facilidade de instalao.

    Escolhendo um servidor Java EEPrecisaremos tambm de um servidor

    Java EE para exercitar o WTP. O primei-ro exemplo s utiliza tecnologias web e poder rodar em containers web como o Tomcat. J o segundo utiliza EJB, exigindo portanto um container Java EE completo, como JBoss, GlassFish etc.

    Uma vez instalado o servidor de sua

    descritores de deployment, fazer testes em servidores de aplicaes, e assim por diante. Por isso, o complemento mais fun-damental de qualquer IDE Java o suporte a Java EE. Neste artigo, apresentaremos o WTP 2.0, o componente fundamental de suporte a Java EE para o Eclipse 3.3.

    Note que este artigo no pretende ensinar tcnicas ou APIs do Java EE, nem as especifi-cidades de servidores Java EE. So assuntos j cobertos com freqncia em vrios artigos da Java Magazine. Vamos focar no ferramental do WTP e no uso prtico das APIs e do servidor. O leitor que j tem alguma familiaridade con-ceitual com Java EE (mas no necessariamente experincia) ser capaz de acompanhar este artigo sem problemas.

  • Edio 51 Java Magazine 19

    Desenvolvendo aplicaes web e Java EE com o Eclipse

    Web Tools Platform 2.0Domine a nova verso do

    projeto da Fundao Eclipse para desenvolvimento de

    aplicaes corporativas em Java, e crie exemplos para

    web e Java EE 5

    oSvaLdo PinaLi doederLein

    preferncia, voc deve configurar o Eclipse para utiliz-lo. Para fazer isso, v em Window|Preferences>Server>InstalledRuntimes (Figura 1) e escolha o tipo e a verso de servidor que voc quer usar. Este artigo utilizar novos recursos do Java EE 5, portanto, preciso escolher um servidor recente que tenha este suporte. Escolhi o Glassfish por ser um produto open source e certificado Java EE 5. (Veja o quadro Servi-dores suportados pelo WTP, especialmen-te se o seu servidor favorito no aparecer inicialmente na lista dos suportados, o que o caso do Glassfish.)

    Minha experincia com WTP e Glassfish foi ex-

    celente, para minha surpresa, pois o adaptador do

    Glassfish para WTP bem recente (usei a v1.0.1) e a

    IBM (a principal fora por trs dos principais projetos

    da ESF incluindo o WTP) e Sun (Glassfish) no so

    l grandes parceiros quando se trata de IDEs. S

    uma pena observar que o adaptador do Glassfish

    no poder ser includo nos downloads do WTP ou

    nas distribuies de IDE da ESF, pois este adaptador

    usa a licena CDDL da Sun; por isso provvel que

    ser sempre necessrio instal-lo parte (a no ser

    que a licena seja alterada, claro).

    Criando um projeto webNosso primeiro exerccio com o WTP ser

    criar uma aplicao web; simples, porm moderna, usando a JavaServer Faces (JSF). Mesmo que voc j tenha familiaridade com aplicaes web, JSF e verses ante-riores do WTP, o exemplo ser til para investigar caractersticas do WTP.

    Acione New|Project>Web>Dynamic Web Project e na primeira pgina do as-sistente, faa Project name=TesteWeb, Target runtime= e Configurations=JavaServer Faces 1.2 Project. Na pgina seguinte, voc poder ver (e se quiser, modificar) as configuraes do projeto.

    A Figura 2 mostra esta pgina. Note que o WTP chama essas configuraes de

    Figura 1. Configurao do Server Runtime para o servidor Java EE utilizado.

    Facets (facetas). importante entender este conceito do WTP. Um projeto contm uma coleo de facets, que podem ser descri-tas como suporte para algu-ma tecnologia especfica. Por exemplo, JavaServer Faces um facet, sendo que existem duas verses dela, para JSF 1.1 e 1.2. Ao selecionar um facet num projeto, o WTP automatiza tarefas como a configurao do classpath do projeto, a gerao de artefatos de deployment (como os arquivos web.xml e faces-config.xml) e o funcionamento de etapas especiais de edio, compilao, validao e deployment. Por exemplo, o WTP saber editar o faces-config.xml com um editor visual customizado para os recursos do JSF 1.2.

    A Tabela 1 detalha os facets

    Figura 2. Detalhamento dos facets de um projeto do WTP.

  • 20 Java Magazine Edio 51

    Web Tools Platform 2.0

    que so suportados pelo WTP 2.0, in-cluindo as verses suportadas de cada um, correspondendo s verses das APIs ou especificaes correspondentes. (Por exemplo, Dynamic Web Module 2.5 significa aplicao web utilizando Servlet 2.5 (JSR-154 MR2), JSP 2.1 (JSR-245) e JSTL 1.2 (JSR-52 MR2).

    Ao combinar facets, voc deve respeitar as dependncias e compatibilidade entre elas: por exemplo, o JSF1.2 exige Dyna-mic Web Module 2.5 ou superior. No se preocupe com isso, pois se fizer selees erradas, estas sero detectadas e proibidas pela pgina de configurao de facets. Note tambm que as verses indicadas ge-ralmente significam igual ou maior que. Por exemplo, no h uma facet Java 6.0,

    O WTP 2.0 suporta, de fbrica, uma boa seleo de servidores (de J2EE 1.3 a Java EE 5). So eles Tomcat, JBoss, WebSphere, JOnAS

    e Oracle OC4J. Mas caso o seu servidor favorito

    no conste da lista dos suportados pelo WTP,

    no se preocupe. No dilogo Installed Runtimes,

    acione o comando Download additional server

    adapters. Quando executei este procedimento, o

    Eclipse detectou novos adaptadores para Apache

    Geronimo, BEA WebLogic, GlassFish (incluindo o

    Sun Java System Application Server) e Pramati, e

    IBM WebSphere Community Edition (que uma

    variante do Geronimo). Quando voc estiver

    lendo este artigo, possvel que outros estejam

    disponveis. Mas os listados j cobrem todos os

    principais produtos open source e comerciais.

    Servidores suportados pelo WTP

    Figura 3. Configurao do facet JSF do projeto.

    mas voc pode usar a facet Java 5.0 com um runtime Java SE 6, sem problemas.

    No assistente de criao de projetos, a seleo de facets j ter efeitos visveis: a ltima pgina a JSF Capabilities (Figura 3), que permite configurar de forma ainda mais refinada as opes especficas a esta facet do projeto. A opo mais importante nesta pgina JSF Libraries: escolha Server suppor-ted JSF Implementation. Isso porque vamos usar um servidor Java EE 5, que j possui o runtime JSF 1.2 integrado. Assim voc evita inchar o WAR do projeto com os JARs da JSF, algo que s seria necessrio para um projeto destinado a servidores J2EE 1.4.

    Para mais detalhes sobre as configura-es de projetos do WTP, que tambm po-dem ser modificadas aps a criao inicial

    do projeto, veja o quadro Configuraes de projetos do WTP.

    Deploy e execuoCriado o projeto, faremos um teste mni-

    mo de deployment. Primeiro, no diretrio WebContent, use New>Other>Web>JSP para criar um arquivo index.jsp contendo uma mensagem qualquer (Al, mundo! no seria m idia). Agora selecione a view Servers que dever estar disponvel, pois normalmente o WTP ativa a perspectiva Java EE ao criar um projeto. Comande New>Server, selecione o tipo de servidor utilizado (ex.: Glassfish / Glassfish v2 Java EE 5), passe pela prxima pgina aceitando os defaults (a no ser que voc tenha ins-talado o servidor com valores no-default para configuraes como porta HTTP e login de administrador), e observe a l-tima pgina do assistente (Figura 4), que permite selecionar projetos para deploy neste servidor. Basta ento adicionar o seu projeto ao painel direito (Configured projects) e finalizar. (Se alguma coisa pa-receu confusa ou repetida, veja o quadro Runtimes e Servers no WTP.)

    Com tudo configurado, vamos executar o servidor de aplicaes, com uma das op-es Start ou Debug sobre a sua definio na view Servers. Aps a inicializao, abra um browser com a URL http://localhost:8080/TesteWeb. Aquela mensagem que voc de-finiu na index.jsp dever aparecer.

    Um micro-tutorialPara colocar o WTP em prtica, vamos

    construir uma aplicao JavaServer Faces mnima. O primeiro passo ser criar o esqueleto das pginas a usar:Recrie a pgina index.jsp, vazia (isto ,

    s com o cdigo do template html).Crie mais uma pgina, ok.jsp, contendo

    apenas uma mensagem Login efetuado com sucesso.Crie outra pgina erro.jsp, com a men-

    sagem Login incorreto.

    Agora, abra o arquivo WebContent/WEB-INF/faces-config.xml. Ser apresentado um editor com diversas pginas; v pgina ManagedBean, onde podemos definir os managed beans (classes Java que inte-ragem com as pginas JSF). Selecione o

  • Edio 51 Java Magazine 21

    Ao configurar o Eclipse para suportar seu servidor de aplicaes e depois configurar o projeto para deploy e execuo neste ser-

    vidor, voc pode ter achado redundantes as

    configuraes da pgina Installed Runtimes e

    da view Servers, at porque algumas opes

    so comuns a ambas. Isso s vezes confunde

    iniciantes no WTP, mas tem suas razes.

    Um Installed Runtime uma configurao que

    s informa ao WTP quais servidores existem no

    sistema, como executar cada um (diretrio, JVM

    utilizada etc.), e fornece valores default para op-

    es como portas e login. A partir de cada runtime

    conhecido, o WTP permite criar vrias configura-

    es de servidor, ou simplesmente servers.

    Um server um conjunto de arquivos de

    configurao e diretrios de trabalho (para

    deploy, logs e outras finalidades as opes

    exatas variam com o servidor). O WTP mantm

    estes arquivos dentro do workspace, em /.metadata/.plugins/org.wtp.server.core.

    Podemos ter vrios servidores para um mesmo

    tipo de runtime, o que importante, por exem-

    plo, para desenvolvedores com workspaces

    complexos contendo diversos projetos, e que

    no querem fazer deploy de todos os projetos

    no mesmo servidor.

    Runtimes e Servers no WTP

    Figura 4. Instalando projetos em um server.

    escopo request e clique no boto Add. No assistente que aparece, selecione Crea-

    te a new Java class, e na pgina seguinte faa Package=teste e Name=Login. Crie o managed bean aceitando os defaults para as demais opes. O resultado dever parecer com a Figura 5, e voc dever ter uma nova classe teste.Login no projeto.

    Edite a classe gerada para conter o cdigo da Listagem 1. Como voc pode ver, no estamos implementando uma tecnologia de autenticao muito sofisticada o mtodo loginUser() s compara o nome do usurio com um valor fixo, retornando true para sucesso ou false para falha de login. O nome do usurio uma propriedade do managed bean, que, como veremos, ser alterada pela pgina.

    Edio da pgina JSFAgora edite a pgina login.jsp para ficar

    parecida com a Figura 6. Mas no vamos digitar tags; faremos tudo visualmente. Ao criar as JSPs, voc pode j t-las aberto no editor, e provavelmente o IDE abriu um editor tradicional. Trata-se de um excelente editor com destaque sinttico, auto-comple-tamento e outras facilidades, mas ainda assim, um editor de texto. Mesmo com o WTP instalado, a extenso .jsp associada ao JSP Editor tradicional (disponvel desde as primeiras verses do WTP).

    Mas existe um editor mais poderoso, orientado composio visual de pginas JSP, HTML e variantes, como JSP com tags JSF, fragmentos etc. Para us-lo, abra as pginas com Open With>Web Page Editor. Outra opo, se voc quiser sempre usar este editor, ir em Window|Preferences> General>Editors>File Associations e marcar o

    Listagem 1. Managed bean para o login.

    package teste;

    public class Login { private String nome; public Login () {} public boolean loginUser () { return Osvaldo.equalsIgnoreCase(nome); } public String getNome () { return nome; } public void setNome (String nome) { this.nome = nome; }}

  • 22 Java Magazine Edio 51

    Web Tools Platform 2.0

    Configuraes de projetos do WTP

    Ao abrir a janela de propriedades de um projeto do WTP, voc encontrar uma srie de novas pginas de configuraes. O WTP d continuidade

    tradio do IDE Eclipse de expor configuraes

    extremamente detalhadas, o que costuma ser visto

    tanto como um ponto positivo (flexvel e poderoso,

    para usurios experientes) quanto negativo (po-

    tencialmente confuso, para iniciantes).

    De qualquer maneira, vale a pena analisar

    essas configuraes, pois elas tambm expem

    alguns recursos importantes do WTP. Algumas

    delas refletem opes presentes no assistente

    de criao de projetos, mas outras esto dispo-

    nveis para customizao somente na pgina de

    propriedades do projeto j criado. Cada item a

    seguir corresponde a uma pgina do dilogo de

    propriedades de projeto, obtido com a opo

    Properties (Alt+Enter).

    BuildersEsta pgina existe em qualquer projeto do

    Eclipse, e lista os chamados builders, que so

    plug-ins que processam de alguma forma o

    projeto quando h alteraes nos seus recursos.

    Alm do Java Builder (responsvel por compilar

    arquivos .java), um projeto do WTP ser configu-

    rado com os builders Faceted Project Validation

    Builder e Validation. Ambos so responsveis por

    diferentes tipos de validao.

    No recomendado alterar essas opes, que

    existem principalmente para permitir que buil-

    ders exigidos por um projeto, mas no instalados,

    sejam desativados, evitando assim a ocorrncia

    de erros no Eclipse. Isso poderia acontecer, por

    exemplo, se um projeto feito com o WTP fosse

    carregado numa instalao do Eclipse que no

    inclui o WTP.

    J2EE Module DependenciesLista outros mdulos dos quais o projeto

    depende para deployment. Digamos que um

    projeto TesteWeb precisa de classes de outro

    projeto, TesteLib. Ao invs de inserir TesteLib no

    classpath (via Java Build Path>Projects), voc deve

    usar a pgina de dependncias de TesteWeb,

    marcando o projeto TesteLib como dependente.

    Assim, quando gerar o WAR para deployment, o

    WTP automaticamente criar um arquivo WEB-

    INF/lib/TesteLib.jar com o contedo do projeto

    dependente.

    Para mdulos EJB e WAR, esta pgina o editor

    do arquivo META-INF/MANIFEST.MF; ser usada

    principalmente para configurar dependncias

    de bibliotecas externas, ou mdulos EJB Client

    (contendo stubs para invocao entre EJBs de

    diferentes mdulos).

    Observe que no ttulo desta pgina do di-

    logo de configuraes, bem como em outros

    lugares, aparece a sigla J2EE, ao invs do mais

    moderno Java EE. Mas o WTP suporta vrias

    verses da edio Enterprise do Java do J2EE

    1.2 ao Java EE 5.

    JSP FragmentPermite especificar opes default (linguagem e

    content type) para fragmentos de JSP. (Os framen-

    tos so arquivos .jspf, normalmente criados para

    incorporao em outras JSPs via

    ou . Isso hoje uma tcnica ob-soleta, substituda por recursos como tagfiles ou

    frameworks de templates.)

    Profile Compliance and ValidationPara projetos que utilizam funcionalidades de

    web services, esta pgina determina a compati-

    bilidade com os padres WS-I SSBP (Simple SOAP

    Binding Profile) e WS-I AP (Attachments Profile).

    Project FacetsPermite configurar os facets do projeto (mais

    detalhes podem ser vistos no corpo do artigo).

    ServerPossibilita a seleo de um servidor (container

    Java EE) para executar o projeto. Isso importante

    se o projeto tiver deploy configurado para mais

    de um server e afeta o comportamento de opes

    como Run As>Run on Server.

    Targeted RuntimesSeleciona os runtimes para os quais o projeto

    ser compilado. Os JARs desses runtimes sero

    automaticamente includos no classpath do pro-

    jeto. Assim, no caso de um projeto configurado

    para um runtime JBoss AS 5, por exemplo, todas

    as APIs do Java EE 5 estaro disponveis e tam-

    bm muitas APIs proprietrias do JBoss sem a

    necessidade de incluir os JARs desse servidor

    manualmente no classpath do projeto.

    ValidationAqui vemos um ponto forte do WTP (veja a

    Web Page Editor como Default para *.jsp.O editor visual bastante fcil de usar.

    Inicialmente a pgina exibida apenas com a estrutura criada pelo template: a diretiva page, as tags html, head, meta, title e body. No painel superior (visual), o body ter uma mensagem Drag and drop Web content here; ento vamos fazer isso. O WTP apresenta uma extensa Palette com componentes para todas as tags de HTML, JSP, JSTL e JSF (ou seja, a totalidade do que padronizado pelo Java EE 5). Os passos so os seguintes:

    1. Abra o grupo JSF Core, selecione o

    componente view e clique dentro do body. Ser criada uma tag vazia. Este o componente-container principal da JSF.

    2. Agora abra o grupo JSF HTML. Dentro do view, crie um Form. Na view Properties do WTP, preencha ID = login.

    3. Dentro do Form, digite o texto Nome:.4. Aps inserir esse texto, crie um Text

    Input. Preencha sua propriedade Value com #{login.nome}. Esta expresso associa o valor do controle de entrada de texto (o componente da JSF) com a propriedade nome do managed bean login.

    5. Aps o Text Input, crie um Command

    Button. Preencha ID=login, Value=Login e principalmente, Action=#{login.loginUser}. Com isso, ao acionarmos este boto do form, o mtodo loginUser() do mesmo ma-naged bean login ser executado.

    Pronto, nossa pgina est completa! Voc pode aproveitar para explorar tambm ou-tras facilidades deste editor. Por exemplo, a maioria dos componentes HTML possui uma propriedade Style onde voc pode digitar o estilo CSS do elemento; mas se no for expert em CSS, voc pode clicar o boto Edit e usar a conveniente caixa de

  • Edio 51 Java Magazine 23

    Configuraes de projetos do WTP

    Figura Q1). Existem plug-ins de validao para

    praticamente todos os tipos de arquivos que

    podem fazer parte de um projeto web: HTML,

    JSP, XML (inclusive schemas e DTDs), e outros.

    Alguns tipos de arquivos mais complexos su-

    portam diversos validadores: por exemplo, para

    JSP, temos o JSP Syntax Validator que valida as

    diretivas e tags da JSP (inclusive de taglibs), o

    JSP Content Validator que valida os elementos

    HTML da pgina, e o JSP Semantics Validator

    (JSF) que valida as tags da JavaServer Faces e

    de expresses EL.

    Voc pode configurar essas opes de validao

    tanto globalmente (seguindo o link Configure

    Workspace Settings), ou de forma local para cada

    projeto. Pode tambm ativar determinados va-

    lidadores para executar automaticamente aps

    alteraes dos arquivos, ou s manualmente (ao

    acionar o comando Validate no menu do projeto).

    Para usurios com projetos de grande porte e

    mquinas modestas, o tempo de execuo de

    todos esses validadores pode ser relativamente

    longo (especialmente aps operaes que alteram

    muitos arquivos, como refatoraes); em tais casos,

    pode ser boa idia desativar a execuo autom-

    tica, e deixar ligada apenas a manual.

    Web Content SettingsUsado apenas para proejtos web. Opes default

    para o tipo de arquivos HTML e CSS.

    Web Project SettingsUsado apenas para projetos web. Seleciona a

    raiz do contexto web, que por default igual ao

    nome do projeto.

    XDocletUsado somente para projetos EJB com a facet

    EJB Project (XDoclet). Permite definir opes para

    o XDoclet, uma ferramenta para desenvolvimento

    de aplicaes Java EE (entre outros tipos) atravs

    de anotaes em cdigo primitivas, usando tags

    especiais em comentrios.

    A XDoclet anterior ao Java SE 5, o qual possui

    uma facilidade de anotaes superior, bem explo-

    rada pelas APIs do Java EE 5. Assim, esta ferramenta

    interessante apenas para projetos que precisem

    executar em servidores J2EE 1.4 ou inferiores.Figura Q1. Configuraes de projeto Web do WTP, destacando as opes de validao.

    dilogo CSS Style Definition.Observe tambm a rica funcionalidade

    do editor textual de JSPs, que torna a edio neste modo at mais produtiva que com o uso de assistentes ou pginas de proprie-dades, para quem j conhece bem HTML, JSP, JSTL e JSF. Por exemplo, ao comear a editar o trecho value = #{', acionando o auto-completamento com CTRL+Space voc ver que o managed bean login uma das opes oferecidas. Completando aps 'value = #{login.', somente as propriedades deste bean (como nome) sero oferecidas, pois o editor sens-vel ao contexto e sabe que a propriedade value

    do componente da JSF requer uma propriedade. Mas aps 'action=#{login.', o auto-completamento oferece os mtodos do bean, pois a action do exige um mtodo.

    Um dos melhores recursos do suporte a desenvolvimento web do WTP que suas ferramentas visuais so baseadas unica-mente nos padres Java EE 5. H IDEs que apresentam editores visuais mais sofis-ticados, mas com sacrifcio dos padres. Por exemplo, o editor visual de pginas do NetBeans 6.0 (antigo Visual Web Pack) contm um editor de pginas superior ao

    do WTP, mas impe o uso de uma bibliote-ca de tags proprietria chamada webui. que a JSF ainda no suficientemente poderosa para habilitar editores visuais mais sofisticados. Isso dever melhorar em verses futuras da JSF, mas com o padro atual, creio que o WTP 2.0 faz um excelente trabalho. Pessoalmente, prefiro ter a opo de gerar uma aplicao puro-Java EE, do que ter um editor visual melhor, mas ser obrigado a usar alguma API/framework/biblioteca que no certificada, integrada e suportada por todos os fornecedores de servidores de aplicaes.

  • Web Tools Platform 2.0

    24 Java Magazine Edio 51

    Figura 5. O editor de configurao de JSF, aps criar o managed bean.

    Regras de NavegaoS ficou faltando uma coisa para a nossa

    aplicao funcionar: o fluxo de navegao de pginas, ou seja, regras do tipo quando acontecer tal coisa na pgina X, v para a pgina Y. Faremos isso tambm de forma totalmente visual.

    No editor de configurao JSF, selecione a pgina Navigation Rule. Voc ver uma rea quadriculada vazia. Arraste todas as trs JSPs do projeto para dentro desta rea. Na view Palette (onde agora aparecero os componentes de navegao), selecione Link. Clique no cone da index.jsp e clique novamente no cone da ok.jsp; uma seta ser criada ligando as duas pginas. Faa o mesmo para conectar a index.jsp com a erro.jsp.

    Selecione a primeira seta (para a ok.jsp) e edite a propriedade From Outcome = true. E na seta para a pgina erro.jsp, preencha From Outcome = false. Estes outcome referem-se ao valor gerado pelo mtodo da ao, no caso o mtodo Login.loginUser() que invocado ao acionarmos o boto do form. (Existe tambm uma propriedade From Action, mas no precisamos identificar a ao, j que s existe uma nica ao no form da index.jsp.)

    s isso. Voc j pode executar a aplicao no container. Ao preencher o campo de texto e pressionar o boto Login, como esperado, voc ser direcionado pgina ok.jsp ou error.jsp, conforme a validao do valor digitado feita pelo mtodo loginUser().

    EJB e JPAAlm de desenvolvimento web, o WTP

    tambm possui suporte bastante completo para outras tecnologias do Java EE, incluindo web services. Mas como o tempo e o espao so finitos, concentraremos o restante deste artigo no suporte a EJB, em especial EJB 3.0 e JPA (Java Persistence API), uma novidade muito esperada do WTP 2.0.

    O primeiro passo criar um novo projeto. Dessa vez criaremos uma aplicao Java EE 5 completa, com direito a projetos EAR, EJB e Web separados. Acione File|New>Project>J2EE>Enterprise Application Project. Na primeira pgina do assistente, faa Project name=Teste, escolhendo tambm o runti-me correto. Na segunda pgina, aquela das facets, haver uma nica opo: EAR. S

    Figura 6. O WTP exibindo sua capacidade de edio visual de pginas.

  • Edio 51 Java Magazine 25

    possvel escolher a verso desta facet, que voc deve deixar em 5.0. Na prxima p-gina, selecione o mdulo TesteWeb: vamos reusar a parte web j construda. Clique tambm no boto New Module e selecione apenas EJB Module (que pode ficar com o nome oferecido, TesteEJB). Finalize o assistente e voc ter dois novos projetos Teste e TesteEJB.

    O WTP (como a maioria dos IDEs Java EE) trabalha com uma estrutura de mltiplos projetos, um para cada artefato: cada WAR (mdulo web), EJB-JAR (mdulo EJB), EAR (aplicao Java EE), e RAR (Resource adap-ter) gerado por um projeto separado.

    A nossa aplicao Java EE completa ser uma melhoria da anterior. Teremos uma tabela USUARIO contendo os nomes dos logins permitidos, com os registros mapeados para o uma entidade Usuario via JPA, e um session bean LoginServerBean para fazer o login. O managed bean Login, do projeto web ser modificado para invocar o LoginServerBean, ao invs de fazer aquela comparao com uma string fixa. Ento, vamos pr mos obra.

    Criando a entidade persistenteVamos comear pela persistncia. Abra

    a nova perspectiva JPA. Vamos comear criando a base de dados, conectando-se a ela e configurando a base a ser utilizada pela aplicao. Como banco de dados, vamos usar o Derby, por este vir includo no Java SE 6.0 Update 2 ou superior (sob o nome de JavaDB). Mas voc poder usar outro banco de dados, bastando, claro, modificar detalhes como a configurao do driver e a URL de conexo.

    Na view Data Source Explorer, em Databases, comande New>Derby Embedded Database e faa Name=Teste. Na pgina de seleo do driver e detalhes de conexes, para escolher o driver comece clicando o boto ...; apare-cer um dilogo Driver Definitions, selecione Derby 10.2 e clique em Add. Na rvore de templates, escolha o Derby Embedded JDBC Driver. Voc voltar ao dilogo de definies de driver, que reclama que no localiza o ar-quivo derby.jar. Use Edit jar/zip para localizar este arquivo no diretrio lib da instalao do Derby/JavaDB.

    De volta ao dilogo Driver Definitions, selecione o Derby Embedded JDBC Driver e

    confirme com OK. Finalmente voc volta ao dilogo de criao de bases de dados, na pgina de detalhes de conexo. Preencha o caminho para o diretrio que ir conter a base de dados (Figura 7). Basta ento finalizar o assistente.

    A partir deste ponto, a definio de driver ficar

    armazenada no workspace, e no teremos a mes-

    ma trabalheira para criar novas bases de dados ou

    novas conexes com o mesmo tipo de driver.

    No Data Source Explorer, no novo node Databases|Teste, comande Connect. Em SAMPLE>Schemas>APP>Tables, acione New Table e passe pela primeira pgina do assistente aceitando os defaults. Na segun-da pgina, faa Table name = USUARIO, e adicione uma coluna com Name=nome e DataType=VARCHAR. Na terceira pgina, escolha um nome qualquer para a chave primria (ou aceite o default) e selecione em Members a coluna nome; finalize.

    O resultado no uma tabela e sim um editor SQL Statement contendo a DDL para criar essa tabela. Execute este cdigo (usando Execute All no menu de contexto do editor, ou Ctrl+Alt+X). Agora sim temos Figura 7. Configurando uma base de dados Derby.

    Figura 8. A perspectiva JPA.

    a tabela! Mas ela no aparece automatica-mente na rvore de bancos de dados; para isso voc deve executar um Refresh.

    Como preguia pouca bobagem, vamos inserir dados tambm do jeito mais fcil. Sobre a tabela USUARIO, comande Data>Edit. Digite alguns nomes e grave com CTRL+S.

  • 26 Java Magazine Edio 51

    Web Tools Platform 2.0

    Pronto. Na view SQL Results voc poder visualizar os INSERTs gerados e executados.

    Estes recursos para trabalho com SQL e bases de

    dados no so algo especfico do WTP; so recursos

    do plug-in DTP (Data Tools Platform), que faz parte

    da distribuio Eclipse IDE for Java EE Develo-

    pers e tambm pode ser instalado parte numa

    configurao do Eclipse sem o WTP. O DTP usado

    por outros plug-ins que trabalham com bancos

    de dados, como o gerador de relatrios BIRT. Ele

    tambm pode ser utilizado como um cliente SQL

    conveniente, integrado ao Eclipse.

    A prxima etapa configurar o suporte JPA no nosso projeto EJB. Na pgina de propriedades do projeto TesteEJB, em Project Facets, acione Modify Project e ative a faceta Java Persistence 1.0. No menu do projeto, acione JPA Tools>Generate Entities. Escolha a conexo Teste e o schema APP (que s aparecer automaticamente se esta conexo estiver aberta no Data Source

    Explorer). Na pgina seguinte, preencha Package=entidades e selecione a tabela USUARIO, finalizando o assistente.

    O resultado ser uma nova classe entidades.Usuario, que aparece na Figura 8, onde tambm ilustramos diversas fun-cionalidades para JPA do WTP. O suporte a mapeamento vai bem alm desse assis-tente que acabamos de utilizar. Se voc tiver uma entidade selecionada, esta ser detalhada na view JPA Structure. E sele-cionando algum elemento desta, a view auxiliar JPA Details permitir editar toda espcie de opes de mapeamento.

    Para programadores j experientes em JPA, poder ser mais fcil simplesmente digitar suas anotaes no cdigo. Mas no h dvida que este suporte do WTP um grande auxlio, no s para atividades bsicas, mas tambm para o uso de opes de mapeamento menos comuns ou ainda para gerar um mapeamento inicial a partir de uma base de dados.

    Criando o session beanPara criar um session bean, o WTP no

    disponibiliza nenhum assistente espe-cfico. Assim, vamos fazer isso moda antiga, escrevendo cdigo (felizmente, com EJB 3.0 isso j no pode ser conside-rado difcil ou trabalhoso). Crie o session bean LoginServerBean, e sua interface local LoginServer, conforme a Listagem 2.

    Graas JPA, a implementao do novo mtodo loginUser() to curta quanto a implementao mock j mostrada na Listagem 1: s precisamos fazer um find() do usurio que tem chave primria igual ao nome recebido. Se este usurio for encontrado, retornamos true indicando sucesso no login.

    O projeto EJB est completo; agora s falta invocar o LoginServerBean a partir do mdulo Web. Antes de fazer isso, voc ter que abrir as propriedades do projeto TesteWeb e em J2EE Module Dependencies, selecionar o mdulo TesteEJB.jar. Isso ter o efeito de incluir uma referncia para o JAR no WebContent/WEB-INF/MANIFEST.MF deste projeto, alm de permitir a importao e uso das classes do projeto TesteEJB no TesteWeb.

    O leitor j versado em Java EE 5 saber que esta configurao do MANIFEST.MF no mais necessria: como tanto o TesteEJB.jar quanto o TesteWeb.war sero includos num mesmo mdulo, Teste.ear, as classes do m-dulo EJB ficaro visveis automaticamente pelo mdulo Web. Isso faz parte das me-lhorias de facilidade de deployment do Java EE 5, exigindo menos descritores. Porm, a configurao do MANIFEST.MF uma forma de fazer o Eclipse incluir as classes de um projeto no classpath do outro.

    No a nica forma: voc poderia ir em Java Build Path>Projects e adicionar uma referncia para o projeto TesteEJB. Funcio-na do mesmo jeito. S que prefiro manter as dependncias entre projetos atravs do MANIFEST.MF, que um arquivo padro do Java EE, ao invs de usar os arquivos de metadados proprietrios do Eclipse. Isso pode facilitar as coisas, por exemplo se um dia o projeto tiver que ser migrado para outro IDE, ou caso seus fontes tenham que ser processados por ferramentas no amarradas a nenhum IDE.

    Agora, para que tudo funcione, s

    Listagem 2. Cdigo para o session bean de login quente, consultando a base de dados.

    LoginServer.java

    package session;

    import javax.ejb.Local;

    @Localpublic interface LoginServer { boolean loginUser (String nome);}

    LoginServerBean.java

    package session;

    import javax.ejb.Stateless;import javax.persistence.EntityManager;import javax.persistence.PersistenceContext;import entidades.Usuario;

    @Statelesspublic class LoginServerBean implements Login { @PersistenceContext private EntityManager em; public boolean loginUser (String nome) { return em.find(Usuario.class, nome) != null; }}

    Listagem 3. Conmfigurando o datasource para a unidade de persistncia JPA.

    java:/Teste

  • Edio 51 Java Magazine 27

    precisamos configurar o datasource. Pri-meiro, abra o arquivo TesteEJB/ejbModule/META-INF/persistence-unit.xml e edite-o, acrescentando o elemento , conforme a Listagem 3.

    Depois, crie um datasource com o nome JNDI jdbc/Teste, apontando para a base de dados que criamos. Esta configurao especfica para cada servidor de aplica-es. Algumas notas:Para o Glassfish, isso pode ser fei-

    to pelo seu Admin Console (normal-mente acessado em localhost:4848). Em Resources>JDBC>Connection Pools, crie um pool com Name=Teste, Datasource Classname=org.apache.derby.jdbc.Em-beddedDataSource e, na pgina Addi-tional Properties, somente a propriedade DatabaseName=. Depois, em Resources>JDBC>JDBC Resource, crie um novo resource com JNDI Name=jdbc/Teste e Pool Name=Teste.A distribuio do Glassfish j incor-

    pora o JavaDB. Em outros servidores que no faam isso, alm de criar o datasour-ce ser preciso configurar o servidor para carregar o derby.jar. Por exemplo, no JBoss (pressupondo a configurao default), basta copiar o derby.jar para /server/default/lib.Um cuidado especfico ao Derby em

    modo embutido (uma escolha que fiz para evitar a complicao de ter que rodar o servidor de BD como um processo parte): voc deve fechar a conexo do Data Source Explorer quando estiver executando o container, caso contrrio ocorrer um erro, pois apenas um processo pode executar o servidor Derby carregando uma deter-minada base de dados. Esta limitao no existir para um servidor convencional, multiusurio (isso inclui o Derby no modo NetworkServer).

    Na view Servers, remova do server o projeto TesteWeb, e adicione o novo projeto Teste. (Voc ver que os projetos TesteEJB e TesteWeb aparecero como dependentes de Teste.) Agora s executar o container e testar novamente a aplicao (mesma URL do exemplo anterior). Verifique se o login permitido para todos os usurios cujos nomes esto cadastrados na tabela USUARIO, e nenhum outro.

    Pronto, temos uma aplicao Java EE 5 completa com EJB, persistncia e uma GUI web feita com JSF. Tudo programado em minutos!

    ConclusesO Eclipse, mesmo com as primeiras

    verses do WTP, j foi o patinho feio dos IDEs para J2EE/Java EE; mas isso mudou. Com o Eclipse 3.3 e o WTP 2.0, temos fi-nalmente suporte abrangente e poderoso

    para as necessidades mais importantes em aplicaes enterprise ou server side. O WTP est atualizado com as ltimas especificaes, no caso a Java EE 5; e possui diversas ferramentas de alta produtivida-de assistentes para de gerao de cdigo ou automao de tarefas corriqueiras e edi-tores visuais para tarefas crticas como edio de pginas ou mapeamento O/R.

    Existem ainda algumas lacunas em com-parao com outros IDEs. Por exemplo,

  • 28 Java Magazine Edio 51

    Web Tools Platform 2.0

    vimos que no h recursos como assis-

    tentes para criao de session beans (o que at

    o J2EE 1.4, exige a criao de diversos fontes e a alte-

    rao de um descritor). Se por um lado o EJB 3.0 torna esse tipo de coisa muito menos essencial que antes,

    bom lembrar que o Java EE 5 ainda uma plataforma relativamente recente.

    Mas se formos pensar nisso, h lacunas maiores, e no s no WTP: em especial a ausncia total de suporte para a velha persistncia EJB/CMP, que tambm no suportada por outros IDEs open source. (Exceto via XDoclet, que o prprio WTP suporta desde verses anteriores, mas que no nenhuma maravilha de produtivida-de comparada JPA e s ferramentas que vimos aqui.) Em resumo, o lema do WTP

    pra frente que se anda; um ferramental mais adequado a projetos que possam usar a especificao Java EE 5 ou superior.

    O leitor que j experimentou outros IDEs atuais pode tambm achar que o WTP peca na falta de recursos mais avanados e modernos, como SOA. Mas o WTP tem a inteno de agregar somente as funcionalidades do Java EE. Outras so fornecidas por plug-ins complementares da Fundao Eclipse, como os fornecidos pelos projetos SOA Tools Platform, BPEL, AJAX Toolkit Framework, entre outros. Estes plug-ins so extenses do WTP, portanto funcio-naro de maneira integrada com os recursos que j vimos (em geral, benefi-ciando-se do sistema de facets do WTP). Mesmo para as funcionalidades supor-tadas pelo prprio WTP, no tivemos espao para mostrar tudo. O quadro

    Neste artigo s criamos os projetos Web, EJB e EAR, mas o WTP suporta outros tipos, que mencionaremos aqui de forma resumida.

    O conceito de Application Client uma parte

    da especificao J2EE que no pegou. So apli-

    caes-cliente que so programadas da mesma

    forma que outros mdulos J2EE, inclusive gerando

    um arquivo EAR. Mas ao invs de ser instalado no

    container, um EAR de application client executa-

    do de forma independente, s com uma JVM J2SE

    (ou quase: com um utilitrio fornecido por cada

    servidor no caso do Glassfish, o appclient). Os application clients no fizeram sucesso por-

    que o programa cliente depende das volumosas

    APIs do J2EE, para poder invocar remotamente

    funes do container (ex.: lookup de JNDI) e de

    aplicaes servidoras que executam no contai-

    ner (tipicamente via interfaces EJB remotas ou

    web services). No caso do JBoss 5, por exemplo,

    essas bibliotecas de cliente somam absurdos

    26 Mb (embora isso possa ser reduzido se o

    cliente no precisar de certas funcionalidades,

    por exemplo web services).

    Somando isso com a exploso de popula-

    ridade da tecnologia web, fcil ver por que

    praticamente ningum desenvolve application

    clients, e porque essa parte da especificao no

    recebe melhorias h bastante tempo. No Java EE

    6 (em desenvolvimento: JSR-316), que ter uma

    estrutura mais modular com vrios perfis e a

    possibilidade de tornar algumas APIs opcionais

    ou mesmo remov-las completamente, minha

    expectativa que os application clients encarem

    a guilhotina, ou pelo menos sejam declarados

    opcionais.

    Um Connector Project ir gerar um conector

    (com deploy para arquivo RAR). Conectores

    so mdulos que funcionam como plug-ins

    do servidor de aplicaes, e geralmente tm a

    funo de se comunicar com sistemas no-Java

    EE, como por exemplo alguma aplicao nativa

    que precise ser acessada via JNI ou sockets, ou

    mesmo programas Java SE via RMI, CORBA e

    outros mecanismos.

    Um Utility Project um projeto definvel

    por excluso: no possui nem EJBs, nem um

    website; no possui nenhum descritor. Mas pode

    utilizar APIs do Java EE. Use esse tipo de projeto

    para criar bibliotecas, que podem ser includas

    como dependncias de projetos EJB ou Web,

    sendo ento automaticamente agregadas aos

    mdulos de deployment EAR e WAR. Isso lhe

    poupa o trabalho de gerar um JAR a partir do seu

    projeto utilitrio e copi-lo (a cada atualizao!)

    para dentro do /lib de um projeto EJB, ou do

    WebContent/WEB-INF/lib do projeto Web.

    Um JPA Project um tipo especial de Utility

    Project, que ir conter somente entidades

    persistentes programadas com a JPA. muito

    interessante por dois motivos. Primeiro, em

    aplicaes complexas, com dois ou mais grupos

    independentes de entidades (onde as entidades

    de um grupo no possuem nenhum relaciona-

    mento com entidades dos outros grupos),

    interessante manter cada grupo de entidades

    num subprojeto parte. Tipicamente, cada

    grupo corresponder a um esquema de dados

    separado, possibilitando tambm a administra-

    o de dados independente. O segundo motivo

    que algum outro projeto por exemplo, um

    projeto de aplicao Java SE poderia importar

    o projeto JPA para tambm fazer acesso direto

    mesma base de dados.

    Um Static Web Project, como diz o nome, um

    projeto web que no contm contedo dinmico,

    somente esttico (HTML, CSS, JavaScript, imagens).

    Sites com contedo pr