Java Magazine Ediao 038 PDF Free
Java Magazine Ediao 038 PDF Free
Eclipse Callisto
Conheça o novo projeto do Eclipse.org
que simplifica a vida do desenvolvedor
Relatórios
&
Gráficos
Usando o Eclipse BIRT para
criar relatórios completos
Agrupamentos,
totalizações e gráficos com
no Eclipse, passo a passo JasperReports e iReport
10
Seções
CAFEÍNA
LEONARDO GALVÃO
Aprendendo programação OO com Greenfoot; Shale
08
e Tapestry top-level; novos Groovy, Geronimo e WTK
DATAS NO DESKTOP
FERNANDO LOZANO
Manipulação de datas em aplicações Swing usando componentes de
12
calendário do projeto NachoCalendar, e conceitos sobre JavaBeans e MVC
Desktop
PROJETO CALLISTO
FERNANDO LOZANO
Detalhes sobre o novo projeto da Fundação Eclipse, que simplifica a
56
instalação de dez plug-ins fundamentais do Eclipse.org
A
Fernando Lozano, Hugo Vidal Teixeira, Julio Faerman, té poucos anos atrás, o suporte a relatórios em Java se encontrava muito aquém
Leonardo Galvão, Osvaldo Doederlein, Yara Senger do oferecido em outras plataformas. Mas a tecnologia evoluiu muito, e hoje
Arte nos deparamos com a situação oposta: há diversas opções de qualidade e até
Diretor de Arte Tarcísio Bannwart ([email protected]) mesmo dificuldade para escolher a melhor alternativa para cada caso. Esta edição traz
Diagramação Jaime Peters Junior, Lais Pancote e Tersis Zonato dois artigos com enfoque na criação de relatórios. Um tutorial completo com diversos
exemplos apresenta e explora o Eclipse BIRT, um conjunto de ferramentas que estende
Ilustrações Felipe Machado e Francisco Peixoto
o IDE Eclipse oferecendo uma solução integrada para a criação de gráficos e relatórios.
Produção O segundo artigo destacado volta-se ao par de ferramentas iReport/JavaReports,
Gerência de Marketing Kaline Dolabella mostrando como criar totalizações, agrupamentos e gráficos. O texto demonstra
Distribuição recursos mais avançados dessas ferramentas, tratando de necessidades comuns em
Fernando Chinaglia Distribuidora S.A. relatórios não-triviais.
Rua Teodoro da Silva, 907, Grajaú - RJ Freqüentemente dizemos aqui que a tecnologia Java está ganhando força no segmento
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362 de aplicações desktop. Esse movimento continua firme, com várias lacunas sendo pre-
Atendimento ao leitor enchidas por ferramentas e APIs que não param de melhorar. São exemplos disso os
A DevMedia possui uma Central de Atendimento on-line, onde você pode projetos do JGoodies: há desde look-and-feels bem projetados até soluções completas
tirar suas dúvidas sobre serviços, enviar críticas e sugestões e falar com um de binding, além de um popular gerenciador de layouts incluído na API JGoodies
de nossos atendentes. Através da nossa central também é possível alterar Forms. Esta API é o assunto de um artigo sobre criação de GUIs, que também trata de
dados cadastrais, consultar o status de assinaturas e conferir a data de envio técnicas fundamentais para o projeto de interfaces gráficas, passando gradualmente
de suas revistas. Acesse www.devmedia.com.br/central, ou se preferir da teoria à prática.
entre em contato conosco através do telefone 21 2283-9012.
Ainda no desktop, você verá como incrementar suas aplicações Swing com os com-
Edições anteriores ponentes NachoCalendar, que simplificam a entrada de datas, são muito configuráveis
Adquira as edições anteriores da revista Java Magazine ou de qualquer outra e podem dar um toque especial e profissional às suas aplicações desktop. O artigo
publicação do Grupo DevMedia de forma prática e segura, em apresenta detalhes sobre os componentes, e como fazer a instalação no Eclipse e no
www.devmedia.com.br/anteriores. NetBeans. Discute também questões importantes no desenvolvimento para o ambiente
desktop, como características dos JavaBeans e o modelo MVC no Swing.
Publicidade
Na edição anterior, o artigo “10 Mais do Eclipse 3.2” colocou na primeira posição o
[email protected], 21 2213-0940
Projeto Callisto, uma importante iniciativa que resolve problemas comuns de instalação
Anúncios – Anunciando nas publicações e nos sites do Grupo DevMedia,
você divulga sua marca ou produto para mais de 100 mil desenvolvedores e versionamento no Eclipse. Nesta edição são mostrados mais detalhes sobre o projeto,
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com incluindo o processo de instalação e possíveis problemas e soluções.
detalhes sobre preços e formatos de anúncios. Temos ainda um artigo que explica como estender o Struts, criando e registrando
Reprints Editoriais – Se foi publicado na Java Magazine um artigo que conversores para processar a entrada de dados e garantir uma formatação apropriada.
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a Além de conhecer o uso de converters no framework, você aprende técnicas que per-
reimpressão da matéria junto com a capa da edição em que saiu, e distribua mitem mudar o funcionamento interno do Struts e resolver problemas sutis.
esse reprint personalizado entre seus clientes.
As tecnologias do Google aparecem aqui em dose dupla, com artigos sobre o Google
Encarte de CDs – Faça como nossos maiores anunciantes. Encarte um CD Web Toolkit e a Google Search API. Lançado durante o JavaOne 2006, o GWT torna
com uma amostra de seus produtos na Java Magazine e atinja um público
possível a criação de aplicações AJAX rapidamente usando código Java. Já a API de
segmentado e formador de opinião.
pesquisas do Google permite integrar o maior mecanismo de busca mundial às suas
aplicações.
Realização Apoio
Boa leitura!
Leonardo Galvão
Parceiros
G
ostaria de orientações sobre como iniciar com com ferramentas e servidores. hoje e mos-
Java, sem que o conhecimento de conceitos Há uma variedade imensa de IDEs disponíveis. tra como
fundamentais possa passar despercebido e Entre os open source, destacam-se o Eclipse criar uma
me faltar no futuro. Por onde devo começar? (eclipse.org) e o NetBeans (netbeans.org). Entre os aplicação
William de Jesus Rende comerciais, há vários populares, como o JDeveloper com o NetBeans, do início ao fim. Temos ainda
da Oracle (oracle.com/technology/products/jdev; artigos identificados como “Primeiros Passos” em
A tecnologia Java tem várias“sub-áreas”,com cada gratuito para uso comercial e incluído no CD desta várias edições, e textos sobre várias tecnologias
uma formando um universo de conhecimentos edição), o JBuilder da Borland (borland.com/jbuilder; importantes do Java, como Swing, JSP, Servlets
bastante independente. O caminho do aprendi- também com versão gratuita, mas com restrições), e JDBC.
zado vai depender muito, portanto, da área em o Rational Application Developer da IBM (ibm. Quanto a livros, a série “Head First Java”da O’Reilly,
que você pretende se especializar. Porém, alguns com/software/awdtools/developer/application), e o já traduzida para português (com título "Use a Ca-
conhecimentos e ferramentas serão essenciais em IntelliJ IDEA (jetbrains.com/idea). A maioria dos IDEs beça"), é excelente para o aprendizado da lingua-
todos os casos. já vem com tudo que é necessário para desenvol- gem. Comece com“Use a Cabeça! Java”(Alta Books),
Comece fazendo o download do JDK (Java SE De- ver com Java, mas vale a pena ter o JDK à parte, por que cobre toda a sintaxe do Java e suas principais
velopment Kit) em java.sun.com/javase/downloads. exemplo, para executar e testar outras aplicações APIs, de forma clara, prática e inovadora.
A versão estável mais atual é a 5.0. Somente com Java (além disso, alguns IDEs, como o NetBeans, Depois de conhecer a sintaxe da linguagem e
o JDK, você já poderá criar aplicações que usam exigem que um JDK esteja instalado). as APIs fundamentais, abre-se muito o leque de
centenas de recursos, desde a leitura e escrita de Com o JDK e um IDE, você está pronto para de- opções de aprendizado. Você poderia, por exem-
arquivos, a operações avançadas de rede, passan- senvolver praticamente qualquer tipo de aplicação plo, decidir se especializar em programação web.
do pelo acesso a bancos de dados relacionais e a Java. O próximo passo é conhecer a linguagem e Neste caso, vale a pena conhecer Struts, JSP, JSF,
criação de interfaces gráficas completas. suas APIs. Há vários sites dedicados a desenvolve- Servlets e AJAX. Já se seu foco é no Java corpo-
Você pode passar muito tempo apenas usando o dores Java na web, inclusive em português, como rativo (enterprise), será importante conhecer EJB,
JDK, mas terá mais facilidade de evoluir no apren- portaljava.com.br e devmedia.com.br/javamagazi- JMS, JNDI e outras tecnologias do Java Enterprise
dizado se tiver instalado também um IDE – um ne. Em inglês, alguns portais se destacam, como Edition. Em ambos os casos, valerá a pena dominar
ambiente integrado de desenvolvimento.Todo IDE java.net, onjava.com, java.com e javaranch.com. ferramentas muito usadas, como Ant e Hibernate.
Java inclui pelo menos um editor de código e um Outra fonte rica de informações são as listas de Se você pretende desenvolver para celulares,
depurador visual (para execução passo a passo de discussão do grupo de usuários SouJava (cadastre- vai precisar conhecer o MIDP e suas muitas APIs,
programas, inspeção de variáveis e objetos etc.); se em soujava.org.br). como GCF, LCDUI e MMAPI, e instalar emuladores
a maioria vem também com um editor visual de Na Java Magazine, já publicamos dezenas de para os dispositivos alvo. Neste ponto, como se
interfaces e vários recursos auxiliares que facilitam artigos voltados ao desenvolvedor iniciante. A série vê, a decisão por qual caminho seguir dependerá
o desenvolvimento, como funcionalidades para “Aplicação Java Completa” nas Edições 25, 26 e 27, muito mais de suas necessidades, e talvez do que
manipulação de bancos de dados e integração por exemplo, é citada e usada pelos leitores até o mercado pede em sua região.
JDBC mesmo. Somente os subtipos concretos como lam conexões ao banco de dados e já incluem
Quero parabenizar toda a equipe de Java Ma- ClienteSimples e ClienteEspecial seriam instanciáveis o suporte a pools.
gazine pelo excelente trabalho de conteúdo e de no segundo exemplo. Mas note que isso não im- Somente se não quiser ou não puder usar
visual da revista. Os artigos sobre JDBC nas edições pede que a invocação cliente.venda() funcione. um servidor Java EE, você precisará se preo-
25 e 26 (“Persistência Turbinada”) são excelentes, e Osvaldo Doederlein cupar com pools de conexões (e com outros
ajudaram a esclarecer muitas questões. pools, como os de threads). Se for esse o caso,
Carlos Eduardo Privati dê uma olhada no Jakarta Commons DBCP
Pools (jakarta.apache.org/commons/dbcp). O DBCP
Em aplicações que processam várias requisições é construído sobre outro projeto do Jakarta, o
Correção na Edição 36 ao mesmo tempo e exigem múltiplas conexões Commons Pool, que permite construir tipos de
Ao me deparar com um trecho de código na pá- com o banco de dados, fica clara a necessidade pools adicionais.
gina 22 da Ediçao 36 (artigo “Qualidade Aplicada”), de um pool de conexões. Existem várias APIs que
no código referente à escolha de polimorfismo ao prometem resolver o problema, mas para quem é
switch, há uma linha desta forma: iniciante na tecnologia fica difícil avaliar o melhor
caminho. Vocês podem dar algumas sugestões?
public class Cliente { public abstract void venda(); } Carlos Eduardo Privati
Essa classe não deveria ser abstrata, e por conse- A princípio, você não precisaria se preocupar Participe!
qüência ela não poderia ser instanciada? com isso, pois hoje em dia a grande maioria das
aplicações Java que acessam SGBDs diretamen- Envie sua dúvida, comentário, correção
Fábio José Fernandes te, se forem construídas segundo um paradigma ou sugestão, com nome completo,
multicamadas, utilizam servidores Java EE para o cidade e estado, para:
Realmente, houve um erro neste trecho de back-end (servidor). Em qualquer servidor Java
[email protected]
código: Cliente deveria ser abstract. Já a primeira EE, desde um produto open source e limitado
versão da classe Cliente mostrada no artigo, à web como o Tomcat até um servidor Java EE Cartas publicadas podem ser editadas
com um atributo int tipo, é concreta. Quanto a completo como o JBoss ou Weblogic, você pode por motivos de clareza ou extensão.
não permitir instanciação, era essa a intenção utilizar o recurso de DataSources, que encapsu-
A versão 1.1 do servidor Java EE da JSR-170, Java Content Repository, e inclui por O Tapestry é voltado à criação de apli-
Apache traz melhorias de perfor- padrão o Apache Jackrabbit (uma implemen- cações web dinâmicas em Java. Divide
mance e muitas correções de bugs. tação open source desta JSR). Também são as aplicações em conjuntos de páginas,
Uma novidade de destaque é o suporte suportadas implementações comerciais do sendo cada uma construída a partir de
a plug-ins: agora aplicações Geronimo, repositório de conteúdo. componentes. Essa estrutura permite que
recursos do servidor e produtos inte- Criado por uma empresa suíça, a Obinary, o framework cuide de tarefas comuns
grados podem ser distribuídos como o projeto fornece uma interface adminis- como a construção de URLs, validação de
plug-ins, que são fáceis de instalar, trativa baseada na web, uma API extensa e entradas do usuários, armazenamento de
automaticamente fazem o download bem documentada e taglibs para a criação estado e localização/internacionalização.
de dependências e não exigem a reini- de templates. No Tapestry o desenvolvedor cria templates
cialização do servidor. A versão 1.1 inclui Entre as novidades principais estão recursos em HTML puro e os combina com código
ainda recursos e visualizações adicio- para versionamento, suporte a Portlets (JSR- Java, e opcionalmente descritores XML. As
nais no console administrativo, como 168), autenticação integrada (single sign-on) aplicações lidam com objetos, métodos e
gráficos de utilização de memória e um e uma interface gráfica renovada. O produto propriedades, e não com URLs e requisi-
wizard para a configuração remota do tem três edições, sendo a Community Edition ções/respostas HTTP (que são abstraídos
servidor http. Outra novidade é a dis- open source. As edições Enterprise e Business do desenvolvedor). A distribuição do pro-
tribuição “leve” do servidor, chamada Process completam as opções, oferecendo jeto inclui mais de 50 componentes, que
Little-G, que inclui um subconjunto das suporte profissional e funcionalidades vão de simples objetos para saída de dados,
funcionalidades do Geronimo. O Little- adicionais. Há localizações para 15 idiomas. até componentes complexos como grades
G vem com um gerenciador de transa- www.magnolia.info. e árvores de navegação.
ções, um container web (que pode ser Atualmente na versão 4.02, o Tapestry já
Tomcat ou Jetty) e outros elementos do está com a versão 4.1 adiantada. Este novo
Geronimo, mas não é um servidor Java Novo WTK release incluirá o dojo, um framework para
EE completo. Será útil para usuários que Foi lançado o beta do Sun Wireless Toolkit desenvolvimento com AJAX, que é a base de
não precisam de todas as facilidades do 2.5 para CLDC, o popular kit de ferramen- boa parte das funcionalidades adicionais. En-
Java EE e desejam consumo menor de tas para desenvolvimento de aplicações tre os destaques está o novo suporte a JSON
memória e processamento. geronimo. Java Micro Edition. Várias novas APIs estão (JavaScript Object Notation), widgets, novas
apache.org. implementadas, entre elas Mobile Service anotações e validações no lado do cliente.
Architecture (JSR-248), Scalable 2D Vector tapestry.apache.org.
O
BlueJ, IDE voltado ao aprendizado cas de imagens. Por ser baseado no BlueJ, o outras operações mais complexas.
de orientação a objetos e Java, tem Greenfoot já vem com editor de código Java, O Greenfoot está em desenvolvimento há
um novo derivado – o Greenfoot depurador e inspetor de objetos, incluindo mais de dois anos, tendo inclusive sido apre-
– que cria um ambiente gráfico bidimen- recursos que permitem atuar sobre o mo- sentado em congressos, mas só recentemen-
sional altamente flexível para estimular o delo de objetos criado (os atores e mundos te teve liberada sua primeira versão pública.
aprendizado de técnicas OO. O novo am- são objetos Java comuns com métodos, Como o BlueJ, o Greenfoot é gratuito, mas
biente, assim como o BlueJ, é direcionado atributos e construtores). Pode-se, por não open source. O site do projeto oferece
a estudantes que estão iniciando a progra- exemplo, criar um novo ator escolhendo um downloads e a documentação da API, além
mação, mas se diferencia por privilegiar um de seus construtores em um menu; executar de um bom tutorial. greenfoot.org.
público mais jovem, do nível colegial.
Com visual bem cuidado, o Greenfoot
se baseia em dois conceitos funda-
mentais: “mundos” e “atores” que são
representados por imagens e têm seus
comportamentos programados por
código Java. Como mostram os vários
exemplos incluídos na distribuição, atores
podem ser praticamente qualquer coisa,
desde pequenos mamíferos australianos
até foguetes, formigas e rochas. Podem
também ser programados para interagir
com o mundo e com outros atores, permi-
tindo a criação de simulações sofisticadas
e até jogos.
Através de uma API simples, mas já
bastante extensa, o usuário pode definir
novos atores e mundos, e programar
rapidamente operações comuns em
simulações, como deslocamento na tela,
verificação de colisões, animações e tro- Greenfoot: Criação de simulações e jogos para aprender Java e orientação a objetos
O
CD encartado nesta edição in- descompactar, será pedida a senha for-
clui três produtos completos da necida no passo anterior. Isso conclui a
Oracle, que são especialmente instalação. Para inicializar o JDeveloper
úteis para o desenvolvedor Java: o IDE (no Windows), simplesmente execute
Java Oracle JDeveloper, uma ferramenta jdeveloper.exe.
de desenvolvimento completa para a cria- Ao executar o JDeveloper pela primeira
ção de aplicações Java de diversos tipos; o vez, será mostrada uma caixa de diálogo
Oracle Containers for J2EE (ou OC4J), um perguntando se você deseja migrar de uma
runtime J2EE que é o coração do Oracle versão anterior do IDE. Responda “No”, e
Application Server 10g; e o Oracle Databa- o IDE será aberto. É então mostrada outra
se 10g Express Edition, uma versão “light” caixa de diálogo exclusiva para a primeira
do SGBD da Oracle. execução (veja a Figura 2); nela você define
as extensões de arquivos que serão associa-
Início da instalação das ao JDeveloper. Vale a pena selecionar
O CD inclui um arquivo Autorun.inf, pelo menos a segunda opção: .jpr.
que, em alguns sistemas, fará com que a A clássica janela de dicas é a próxima a
página inicial seja carregada automatica- ser exibida. Depois de fechá-la, você estará
mente (veja a Figura 1). Caso não seja, abra com o IDE disponível para criar aplicações
a página index.htm na raiz do CD. Java de diversos tipos. Veja o JDeveloper
Para iniciar a instalação, clique no botão em ação na Figura 3.
“Install Now!”. Será mostrada uma lista
de restrições; marque todas as checkboxes, OC4J
leia a licença a seguir e, se decidir aceitá-la, A instalação do OC4J é igualmente sim-
clique em “I Accept”. Na próxima página, ples. Descompacte o arquivo oc4j1013.zip,
será mostrada uma senha para instalação, localizado no diretório oc4j do CD, para
que será sempre “10gJ2EE” (para os três uma pasta adequada do disco (exemplo:
produtos). Ao final da página, você verá c:\Java\oc4j). Para que seja possível usar os
instruções para instalação, que detalha- scripts de execução do OC4J, sua variável
mos a seguir. de ambiente JAVA_HOME deve estar defi-
nida, apontando para o diretório principal
JDeveloper 10g
Para instalar o IDE, expanda
o arquivo jdev1013.zip, locali-
zado na pasta jdev do CD, para
um diretório apropriado (por
exemplo c:\Java\jdev). Ao
Oracle Express
O Oracle Database 10g Express Edition inclui um
instalador convencional (para Windows). Descompac-
te o arquivo OracleXE.zip para algum local do disco
e execute OracleXE.exe. Siga os primeiros passos do
wizard, defina uma senha para contas de sistema e
prossiga com a instalação.
Para testar a instalação, selecione a opção “Ir Para a
Home Page de Banco de Dados” no grupo de progra-
mas criado para o programa (ou visite diretamente a
URL http://127.0.0.1:8080/apex). Forneça o login “sys-
tem” e a senha definida na instalação. A página inicial
de administração será exibida (veja a Figura 5).
Edição 38 •38Java
Edição • Java
Magazine 11 11
Magazine
Datas no Desktop
Usando Componentes Swing para Manipular Da
O
Swing é uma biblioteca de componentes oferecida pelo Swing (o componente
visuais muito rica e poderosa, permitindo JFormattedTextField).
criar uma grande quantidade de aplicações
com qualidade profissional, usando apenas os com- O termo tecnicamente correto para qualificar
ponentes padrões inclusos no Java SE. Mas sempre componentes como um “date picker” em uma apli-
haverá situações em que o desenvolvedor po- cação seria JavaBean, mas este termo ganhou usos
derá se beneficiar de algum componente comuns fora do seu sentido original, por isso pre-
adicional. ferimos o termo “componente”. Para mais detalhes
Um caso comum é o de um “date sobre esta questão, veja o quadro “Componentes,
picker”, um componente que per- JavaBeans e POJOs”
mite selecionar uma data num
calendário. A maioria dos usu- Existem vários componentes proprie-
ários prefere este tipo de tários e livres para a seleção de datas,
interface em vez da caixa de mas decidimos focar este artigo no
texto formatada NachoCalendar (nachocalendar.sf.net) para
fornecer ao leitor um modelo de
como incluir componentes
Swi ng exter nos em
suas apl icações.
Ve j a t a m b é m o
quadro “Outras bi-
bliotecas Java para
calendários”.
E n q u a nt o e s t e
a r t igo apre s ent a
detalhes específicos
da instalação e uso do
NachoCalendar, os qua-
dros que demonstram a
integração deste componen-
te com os IDEs NetBeans e
Eclipse serão úteis também para
o desenvolvedor interessado em
outros componentes para aplicações
Swing.
Sobre o NachoCalendar
O NachoCalendar é um projeto open
source criado em meados de 2004 no
SourceForge. Como tem licença LGPL,
pode ser incluído também em aplicações
distribuídas sob licenças de software
proprietário, sem que isto exija a permis-
são dos desenvolvedores e sem obrigar a
p
NachoCalendar em aplicações
Swing, como integrá-lo ao
NetBeans e Eclipse, e conheça
conceitos gerais sobre
componentes visuais em Java
lar Datas e Calendários
Fernando Lozano
mendada para os usuários do NachoCalendar e java -jar %NACHO%\lib\nachocalendar-0.23-demo.jar
abertura do código da aplicação que faz
componentes similares.
uso do componente. Usuários Linux devem executar o co-
São fornecidos três componentes prin- mando:
cipais, todos no pacote net.sf.nachocalendar. Instalação do NachoCalendar java -jar $NACHO/lib/nachocalendar-0.23-demo.jar
components: Para obter o NachoCalendar, visite
• DateField – Permite tanto a digitação nachocalendar.sf.net, siga o link “Downloads” Os quadros “NachoCalendar no Net-
de datas quanto a seleção em uma jane- e baixe o arquivo nachocalendar- 0.23. Beans 5” e “NachoCalendar no Eclipse
la pop-up, com estilo semelhante a um zip. Então descompacte o ZIP em uma VE” apresentam instruções específicas de
combobox. pasta qualquer. Será criado o diretório instalação e uso para esses IDEs.
• DatePanel – É basicamente o pop-up uti- nachocalendar- 0.23 que contém, entre Agora veremos um exemplo de uso do
lizado pelo DateField, mas fornecido como outros, o arquivo manual-0.23.pdf, um NachoCalendar em aplicações Swing, para
uma subclasse de JPanel. Por isso pode ser “QuickStart” para a utilização do com- depois estudarmos em mais detalhes a
posicionado livremente dentro de uma ponente. A documentação JavaDoc pode arquitetura do NachoCalendar e exemplos
janela para formar telas de entrada de ser encontrada no subdiretório doc. Em adicionais de aplicações.
dados customizadas (como numa agenda lib está o arquivo nachocalendar-0.23.jar,
de compromissos). que deve ser adicionado ao classpath de Exemplo de seleção de datas
• CalendarPanel – Outra subclasse de JPanel, compilação e de execução de qualquer A Listagem 1 apresenta um exemplo
que exibe múltiplos DatePanels simultanea- aplicação que utilize os componentes do básico de uso do componente DateField do
mente, formando uma visão de calendário NachoCalendar. NachoCalendar, e demonstra quase tudo
que exibe diversos meses, com navegação Para executar o programa de demons- o que é necessário saber sobre ele para
e layout customizáveis. tração do projeto, execute a seguinte linha utilizá-lo em uma aplicação real.
de comando, onde %NACHO% deve ser O exemplo modifica a instância de
A Figura 1 apresenta a aplicação de de- substituído pelo diretório contendo o JAR java.text.DateFormat do componente por meio
monstração inclusa com o NachoCalendar. do NachoCalendar: do método setDateFormat(). A razão disso é
Observe que o componente já está “locali-
zado” para o português brasileiro, usando
recursos presentes no Java SE, por meio de
java.text.DateFormat e classes relacionadas.
Os três componentes compartilham
muitos recursos, de modo que a maior
parte do que se aprende sobre o mais
simples é válida também para os mais
complexos. Assim o artigo inicia apre-
sentando exemplos de uso do DateField, e
depois passa para o DatePanel. Para evitar
que o artigo fique muito longo, entretan-
to, não serão apresentados exemplos do
CalendarPanel. No entanto, a parte principal
da sua utilização será exatamente igual
à do DatePanel.
A qui apresentamos uma breve relação de outros componentes e bibliotecas livres para Java,
que podem substituir ou complementar o NachoCalendar, agrupados em categorias de
acordo com suas finalidades.
O exemplo também ilustra como ini-
cializar e como recuperar a data editada
pelo componente. Os métodos getValue()
Note que são todos projetos hospedados no SourceForge, mesmo que alguns tenham seus pró-
e setValue() são declarados para receber e
prios domínios DNS independentes e em alguns casos sites independentes do SourceForge.
retornar um java.lang.Object em vez de um
java.util.Date ou java.util.Calendar. O motivo
Componentes Swing para edição de datas e visualização de calendários
disto é tornar o componente um substituto
• microba.sf.net
direto para o JFormattedTextField, que define
• web.ukonline.co.uk/mseries
os métodos get/setValue() da mesma forma.
• opensource.theotherbell.com/php/datepicker.php
Apesar de a assinatura dos métodos indicar
Componentes web para edição de datas e visualização de calendários um Object, passar qualquer coisa diferente
• calendartag.sf.net de um java.util.Date irá gerar uma exceção.
• jcal.sf.net Para compilar e executar o exemplo,
• sf.net/projects/palooka antes acrescente o JAR com os com-
ponentes ao c lasspat h do si stema,
Interação com serviços de calendário, PIMs e Groupware por exemplo:
• k5n.us/javacaltools.php
set CLASSPATH=%CLASSPATH%;%NACHO%\lib\nachocalendar-0.23.jar
• moonbird.sf.net
• jpim.sf.net
• web.mac.com/sebsto/iWeb/projects/JSCalendarSync.html (Usuários Linux devem usar o comando
• jical.sf.net export em vez do comando set.) O resultado
• icalgrabber.sf.net da execução do programa pode ser visto
na Figura 2.
APIs alternativas para manipulação de datas e horas
• joda-time.sf.net Arquitetura do NachoCalendar
• recurrance.sf.net O manual do NachoCalendar parece in-
import java.util.Date;
import java.text.DateFormat;
import java.awt.BorderLayout;
import javax.swing.*;
import net.sf.nachocalendar.components.*;
getContentPane().add(BorderLayout.NORTH,
new JLabel(“Escolha uma data:”));
dateField = new DateField();
dateField.setDateFormat(df);
dateField.setValue(dia);
//dateField.setPrintMoon(true);
getContentPane().add(BorderLayout.CENTER, dateField);
pack();
}
getContentPane().add(BorderLayout.CENTER, dateField);
pack();
}
//...imports omitidos
getContentPane().add(BorderLayout.NORTH,
new JLabel(“Calendário Swing”));
datePanel = new DatePanel();
getContentPane().add(BorderLayout.CENTER, datePanel);
pack();
}
cujos significados são auto-explicativos: Caso seja configurada uma das duas clique) caso seja utilizado Shift+clique
• MULTIPLE_INTERVAL_SELECTION formas de seleção múltipla, o conjunto de ou Ctrl+clique.
• SINGLE_INTERVAL_SELECTION datas selecionadas pode ser obtido cha-
• SINGLE_SELECTION mando o método getValues(), que retorna
um array de Object. Exibição de feriados
1
Um decorator é uma classe que imita a interface de ou-
tra classe, por meio de especialização ou implementan-
A Listagem 5 demonstra como lidar Encerrando os exemplos de uso do Na-
do a mesma interface, e tem por objetivo substituir esta com seleções múltiplas de datas; é uma choCalendar, será visto como acrescentar
classe apenas acrescentando alguma funcionalidade. pequena modificação do exemplo na feriados ao DatePanel. O processo envolve
Este design pattern é muito usado em aplicações gráficas
para acrescentar algum elemento decorativo por cima de
Listagem 4. Note que o ChangeListener será duas etapas:
outro elemento. Daí o nome. chamado várias vezes (uma para cada 1. Fornecer um decorator1 para o DayRenderer,
F
reqüentemente os termos “componente” própria definição de JavaBeans. ou estender a classe BeanInfo do componente
e “JavaBean” são usados como sinônimos O recurso de introspecção é uma característica original. O IDE também pode fornecer classes
pelos desenvolvedores Java. Além disso, única aos JavaBeans, quando comparado com BeanInfo para JavaBeans que não incluem seus
os termos “POJO” e “JavaBean” também cos- os componentes fornecidos por ambientes próprios BeanInfos.
tumam ser utilizados como equivalentes. Mas, RAD não-Java. Nestes ambientes, limitações da Um JavaBean que fornece seu próprio BeanInfo
se um “POJO” (Plain Old Java Object) é nada linguagem e da plataforma exigem a construção não é obrigado a seguir as convenções definidas
mais do que um objeto/classe Java comum, explícita e trabalhosa de tabelas de proprieda- para o uso da introspecção, permitindo por
sem restrições adicionais, então o que seria um des e eventos, de modo que a construção de exemplo construir componentes que devam ser
componente? um componente é um processo bem diferente instanciados por métodos de fábrica.
Há muitas definições de “componente” no do processo de construção de uma classe O BeanInfo é a única maneira de se fornecer
meio de TI, portanto em vez de discutir livre- “comum”. alguns recursos específicos para o uso em IDEs
mente o conceito, vamos ver o que diz a espe- Mas em Java a maior parte das classes cons- visuais, como um ícone para ser exibido na pa-
cificação JavaBeans 1.01, na seção 2.1: truídas seguindo apenas as “melhores práticas” leta de componentes. É uma pena, no entanto,
de desenvolvimento OO se tornam automatica- que tantos desenvolvedores de componentes
“A Java Bean is a reusable software component mente JavaBeans. Assim o conceito de JavaBean sigam o caminho mais fácil e deixem que o IDE
that can be manipulated visually como componente construído para uso num IDE use apenas a introspecção para configurar o
in a builder tool.” visual acaba sendo esquecido por muitos. O fato suporte aos seus JavaBeans.
de a maioria dos desenvolvedores estar traba- O uso de um BeanInfo não acrescenta esforço
Ou seja, de acordo com a especificação, um lhando na construção de aplicações focadas em significativo ao desenvolvimento do componen-
JavaBean existe para ser manipulado por um ferramentas como Ant e Maven, em vez de vol- te, pois a maioria dos métodos desta interface
IDE visual. Um JavaBean seria portanto aná- tadas a recursos particulares de IDEs, também podem retornar null (nestes casos, o IDE deve
logo aos componentes fornecidos por IDEs ajuda a se perder o conceito de JavaBeans como recorrer ao uso da introspecção para obter as
RAD (Rapid Application Development) como componentes para IDEs visuais. informações não fornecidas pelo BeanInfo).
Delphi ou VB. Hoje em dia, é comum que vários frameworks, A especificação de JavaBeans define ainda
Para que seja viável a manipulação de como Hibernate, Struts e Spring usem o termo muitos outros recursos que podem ser utilizados
JavaBeans por uma ferramenta, a especificação “JavaBean” para indicar uma classe qualquer (um por JavaBeans, como as bound properties (pro-
define conceitos como propriedades e eventos, POJO) que obedeça a estas convenções. priedades que geram eventos sempre que seus
além de duas maneiras pelas quais um IDE pode valores forem modificados). E APIs complemen-
relacionar propriedades, eventos e métodos BeanInfo tares definem recursos como serialização de Ja-
fornecidos pelo componente: A outra forma de se relacionar atributos, vaBeans em formato XML, ou comportamentos
1. Usando introspecção propriedades e eventos fornecidos por um alternativos de um JavaBean, quando executado
2. Usando um BeanInfo. JavaBean é fornecendo uma classe que imple- dentro de um ambiente de desenvolvimento,
menta a interface java.beans.BeanInfo. Esta classe em vez de numa aplicação final.
Convenções e introspecção deve ser nomeada acrescentando-se o sufixo No final das contas, o uso do termo “JavaBean”
O uso da introspecção em JavaBeans é ba- “BeanInfo” ao nome do JavaBean, e pode estar como sinônimo de “POJO” já pegou e não vai de-
seado na obediência a algumas convenções, tanto no mesmo pacote do JavaBean descrito saparecer tão cedo na comunidade Java. Mas a
como o uso de um construtor sem argumentos por ela quando num pacote em separado, con- verdade é que um JavaBean pode ser muito mais
e de métodos de acesso getXxx()/setXxx() para figurado pelo IDE. do que uma classe comum, por isso neste artigo
propriedades. Estas convenções básicas se Então o IDE pode oferecer suporte especializa- preferiu-se usar o termo “componente” para se
tornaram bastante populares, ao ponto de se do para um dado componente, fornecendo uma referir a JavaBeans criados para complementar
confundir a obediência a elas como sendo a classe BeanInfo customizada, que pode substituir aplicações visuais em Swing.
Relatórios e Gráficos c
Usando o Business Intelligence and Reporting T
A
geração de relatórios é uma neces- de relatórios com um tutorial prático, e rador de relatórios; utiliza definições
sidade comum a muitas aplicações, examinando os recursos e características produzidas pelo ERD ou WRD.
especialmente as que fazem acesso desta ferramenta. • ECE (Eclipse Charting Engine) – Gera-
a bases de dados corporativas. De fato, o vo- dor de gráficos; também utiliza definições
lume de dados acumulados pelas empresas Embora o BIRT e este artigo sejam calcados no produzidas pelo ERD ou WRD.
só faz crescer a cada ano, seja devido à infor- Eclipse, usuários de outros IDEs também podem
matização crescente de atividades, seja por usar o BIRT, graças ao RCP Report Designer (veja Instalando
força de legislações ou práticas comerciais a seção “Instalando”). Existem quatro maneiras de instalar o
que exigem o controle e a armazenagem de BIRT de forma a acompanhar este artigo
cada vez mais informações (ex.: contratos O Projeto BIRT (utilizaremos o BIRT 2.1, que é baseado no
de qualidade de serviço). O projeto BIRT tem o objetivo de cons- Eclipse 3.2):
Isso se traduz numa demanda cada vez truir ferramentas de Business Intelligence 1. Instalação tradicional do Eclipse.
maior por funcionalidades de geração e relatórios, usando o modelo open source Começando com o Eclipse 3.2 (Platform
de relatórios, tarefa que não costuma ser e as tecnologias da Fundação Eclipse. É + JDT, ou SDK), instale os plug-ins EMF
das favoritas de muitos desenvolvedores. interessante destacar algumas conseqüên- 2.2 e GEF 3.2 (também exigidos por vários
Certamente por este motivo, o mercado de cias menos evidentes desta definição: outros plug-ins, como o WTP). Basta então
ferramentas de software há muito tempo • O BIRT não é simplesmente um "plug-in baixar o pacote birt-report-framework-2.1.zip
oferece produtos de geração (semi-)auto- para o IDE Eclipse". Pode-se utilizá-lo e descompactá-lo sobre sua instalação do
mática de relatórios, desde produtos amar- sem nenhum IDE, inclusive para a edição Eclipse.
rados a SGBDs como o Oracle Reports De- visual de relatórios. 2. Callisto. Com o Eclipse 3.2 instalado,
veloper, a softwares independentes como • O BIRT se integra à arquitetura de vá em Help|Software Updates>Find and
Crystal Reports. E mais recentemente, ferramentas do Eclipse, o que significa Install>Search for new features to install, es-
opções open source como o JasperReports que haverá outros plug-ins para Eclipse a colha “Callisto Discovery site” e selecione
e iReport para Java. se beneficiar do BIRT, como já é o caso do um mirror. Dentro da árvore de opções
O BIRT (Business Intelligence and TPTP 4.2 (Eclipse Test and Tools Platform). “Callisto Discovery Site”, abra o ramo
Reporting Tools), projeto da Fundação O quadro “O BIRT, outros geradores de “Charting and Reporting” e selecione
Eclipse, é uma nova opção na categoria relatórios e open source” discute o status a opção “Eclipse BIRT Report Designer
“independente, open source e para Java”. do BIRT como projeto do Eclipse.org, e o Framework 2.1.x”. Depois clique no botão
Mas não é apenas mais um gerador de compara com outros projetos competido- Select Required para selecionar as depen-
relatórios. O BIRT promete revolucionar o res no mundo open source. dências necessárias para a operação do
cenário dos relatórios para Java, especial- BIRT, e clique em Next. Aceite a licença
mente devido à sua forte integração com o Componentes do BIRT para os componentes a serem instalados;
IDE Eclipse, o que traz vantagens de pro- Como toda ferramenta de business clique em Next e depois em Finish.
dutividade claramente além do possível intelligence, o BIRT traz sua própria sopa 3. Opção “all-in- one”. Na pági na
para outros competidores (mesmo os que de letrinhas, com muitos novos acrôni- de download do BIRT, baixe o pacote
possuem plug-ins para IDEs). mos para aprendermos. Os componen- birt-report-designer-all-in-one-2_1.zip, que
Apesar de relativamente novo, o BIRT tes de runtime e design do BIRT são os vem com tudo que você precisa, incluindo
tem evoluído a passos largos e já é uma seguintes: o próprio Eclipse (SDK), o EMF, o GEF e
tecnologia madura. Já encontramos o BIRT • ERD (Eclipse Report Designer) – Edi- o BIRT.
na sua versão 2.1, que acompanha o release tor visual de definições de relatórios. 4. RCP Report Designer. É a opção para
do Eclipse 3.2 e faz parte do Callisto 1.0 • WRD (Web Based Report Designer) quem quer usar o BIRT sem o Eclipse;
(distribuição integrada dos principais – Equivalente ao ERD, mas com interface
projetos do Eclipse.org). web (este componente ainda não está 1
A versão embutida da base Classic Models usa o Apa-
Neste artigo, veremos como utilizar disponível). che Derby. Veja mais sobre esse SGBD em “Demonstrando
o BIRT, guiando o leitor na construção • ERE (Eclipse Report Engine) – Ge- o Apache Derby”, na Edição 29.
ideal para usuários de outros IDEs. Baixe pulação de dados para o Derby e para o MySQL2, e fizer isso, ainda poderá digitar as legendas
o arquivo birt-rcp-report-designer-2_1_0.zip um arquivo .mdb para o Microsoft Access. Uma vez nos cabeçalhos dos relatórios, mas este
(ou mais recente), que contém um editor criadas as tabelas, crie a data source com a opção trabalho teria que ser feito repetidamente
visual de relatórios auto-contido. “JDBC Data Source”. O diálogo de criação de data para cada novo relatório que utilize o
sources possui um botão “Manage Drivers”, que Data Set.
O projeto permite cadastrar o driver JDBC para seu SGBD pre-
Feita a instalação, execute o comando ferido (o driver para o Derby em modo embutido já O relatório
File|New>Project, e você verá que foi cria- vem registrado.) Tendo o driver configurado, basta Como o layout básico do relatório está
do um novo grupo de projetos para BIRT. entrar com os dados de URL, login e senha. pronto (usamos um template que já inclui
Escolha a opção Report Project e forneça um um grid de quatro colunas), só falta asso-
nome para o projeto. Isso cria um projeto Na mesma view, em Data Sets, precisamos ciar nosso Data Set ao layout. Observe que
“puro” de relatório, o que num primeiro criar agora um “conjunto de dados” (Data cada coluna do Grid (na aba Layout) possui
momento simplificará o acompanhamento Set), que corresponde a um resultset ou as linhas (rows) Header (cabeçalho), Detail
desse tutorial. Depois veremos como com- cursor. Crie o Data Set com o nome “car- (dados) e Footer (rodapé). Selecione, no
binar o relatório a um projeto Java. ros” e tipo “SQL Select Query”. Será apre- Data Set, a coluna de resultado Fabricante,
Após a criação do projeto, o BIRT apre- sentado o diálogo de construção visual de e arraste-a até a linha Detail na primeira
senta a perspectiva Report Design, tam- consultas do BIRT (Figura 1). coluna (aparece um diálogo Select Data
bém conhecida como ERD (Eclipse Re- A database Classic Models modela uma Binding; você pode aceitar as opções de-
port Designer). No novo projeto, use loja de automóveis. Vamos criar um rela- fault e fechá-lo). Faça o mesmo para as
New>Report para criar um relatório. For- tório simples, mostrando nome, fabricante, outras três colunas de resultado.
neça o nome carros.rptdesign e na opção de descrição e preço de todos os automóveis Um último retoque é alterar o formato dos
templates escolha Simple Listing. cadastrados, ordenados por fabricante e cabeçalhos, para que estes se diferenciem
Depois de finalizar o wizard, você verá depois por nome. Os nomes da tabela e das dos dados. Selecione com Shift+clique
o ERD lotado de ferramentas atraentes colunas podem ser copiados para a con- cada célula de cabeçalho, e no Property
– editor visual de relatórios, paleta de sulta com um duplo clique (ou arrastando Editor mude o Background Color. Mas, como
elementos, editor de propriedades etc. para a janela que contém o código SQL); queremos usar o mesmo estilo para todas
Mas um relatório, antes de tudo, precisa pode-se também digitar os comandos SQL as células do cabeçalho, há uma forma
de dados de entrada, portanto o próximo diretamente. Assegure que a consulta seja mais fácil: passe o cursor do mouse sobre
passo será disponibilizar esses dados. algo como: o Grid para mostrar o manipulador Table
(sob o canto inferior esquerdo do Grid);
Os dados select PRODUCTNAME, PRODUCTVENDOR, clique nele, revelando os manipuladores
PRODUCTDESCRIPTION, BUYPRICE
Entre na view Data Explorer, clique com from PRODUCTS de linhas e colunas; depois clique no da
o botão direito sobre o nó Data Sources e order by PRODUCTVENDOR, PRODUCTNAME primeira linha (a do cabeçalho). Use en-
selecione New Data Source. Depois escolha tão o Property Editor, customizando a cor
Classic Models Inc. Sample Database. Dê um Após a criação inicial do Data Set, o diá- de toda a linha selecionada. O resultado
nome à data source, ex.: “carrosDS”. Este logo Edit Data Set permite customizar deta- deverá ser parecido com a Figura 2.
banco de dados de teste é embutido no lhes como parâmetros, colunas calculadas, Para testar o relatório, clique na aba
BIRT1; por isso não é exigida nenhuma cache e filtros, e também se ter um pre- Preview. Você verá o relatório funcionan-
outra configuração. view dos dados
selecionados, de
Num projeto real, você usaria um banco de forma a verificar
dados externo. Se quiser já praticar este cenário que a query está
mais realista, baixe o pacote birt-database-2.1.zip, correta.
que contém os scripts para criação e população Um a ú lt i m a
do mesmo banco de dados “Classic Models”. Este etapa essencial é
pacote contém scripts de criação de tabelas e po- ir na aba Output
Columns (ainda
no diálogo Edit
2
Para outros SGBDs, é fácil criar as tabelas a partir dos Data Set) e pre-
scripts create_classicmodels.sql de uma destas versões. Já encher, para cada
a população de dados iniciais está disponível em vários
coluna do resul-
arquivos-texto (formato CSV), que podem ser importados
com facilidade em muitos SGBDs, por exemplo com o tado, o seu Dis-
Oracle SQL*Loader. play Name (ex.:
3
Para quem já usou o JasperReports, o arquivo .rptde-
BUYPRICE = “Pre-
sign é o equivalente aos arquivos .jrxml, exceto que não
existe uma etapa de pré-compilação para .class. ço”). Se você não Figura 1. Definindo um data set a partir de uma query SQL.
http://127.0.0.1:52939/viewer/run?__report=E%3A%5
COsvaldo%5Ctestws%5CBIRTJava%5Ccarros4.rptdesign&
__format=html&__svg=false&__designer=true&_
_masterpage=true& __rtl=false&__maxrows=&1486415089
JavaScript) será executada, para cada linha mos para colunas “reais”. De que outra é associada à expressão dataSetRow[“Preço”].
do Data Set, produzindo a coluna “Avalia- maneira poderíamos ter obtido o mesmo Clicando nesta expressão, veremos nova-
cao”. Se clicarmos na aba Preview Results, efeito? Se você voltar ao design do Grid (o mente (sem muita surpresa) o Expression
veremos a nova coluna preenchida com componente de relatório tabular) e der um Builder.
valores, como na Figura 8. duplo-clique na célula de detalhe da colu- Agora, se você selecionar o gráfico e
Poderíamos, então, utilizar esta coluna na Preço, verá o diálogo Select Data Binding. acionar Select Data, examinando com no-
no relatório, da mesma forma como fize- Observe que, neste diálogo, a coluna Preço vos olhos esta aba do diálogo Edit Chart
(Figura 4), verá que existem scripts por
todo lado. Por exemplo, o campo Category
Scripting no BIRT e no Eclipse (X) Series tem o valor row[“Fabricante”] – um
script. O mesmo vale para as opções de
A versão atual do BIRT suporta JavaScript
(ECMAScript). Versões futuras deverão
suportar outras linguagens de scripting para
ambiente; ou seja, a plataforma Eclipse, os
plug-ins instalados e os recursos gerenciados
por estes plug-ins.
valor Y, agrupamento e colunas de dados
para o eixo X. Embora a prática mais co-
mum seja derivar todos estes dados de co-
a JVM (como Groovy, Jython etc.), possivel- O BIRT já faz isso para o ROM ( Report
lunas do Data Set, pode-se, no lugar disso,
mente através da JSR-223. Object Model, isto é, a representação em
escrever código JavaScript arbitrário.
Há anos a comunidade Eclipse vem dis- memória do documento .rptdesign), o que
Poderíamos ter criado no Grid a expres-
cutindo a implementação de facilidades permite ao script utilizar sintaxes especiais
são que transforma um preço na string
de scripting para o Eclipse como um todo, como row[nome] e params[nome] para acessar
“caro” / “barato”. Mas se definirmos esta
para automatizar qualquer operação do IDE elementos do ROM. E vai mais além: é pos-
expressão no próprio Data Set, o valor
e de todos os seus plug-ins. A falta dessas sível escrever scripts com expressões como
resultante pode ser reusado em vários
facilidades é uma das principais lacunas do sum(row.BUYPRICE), onde sum é uma função
lugares; por exemplo, podemos querer
Eclipse, para usuários avançados que gostam agregada semelhante à do SQL. Ela retorna
exibir esta informação tanto no Grid
de automatizar seu trabalho com scripts. Essa a soma dos valores da coluna BUYPRICE para
quanto no gráfico. Calculá-la uma vez só,
deficiência já vem sendo investigada por todas as linhas (rows) do Data Set. Esta
no Data Set, economiza tanto o esforço
projetos na incubadora da Fundação Eclipse sintaxe não é suportada por JavaScript, mas
de edição do relatório, quanto tempo de
(como o EclipseMonkey), além de projetos como linguagens de scripting são por natu-
processamento.
externos (como o EclipseShell). Sem falar reza fáceis de manipular, o BIRT pode criar
Uma terceira alternativa para gerar va-
em ferramentas que incluem suporte ad-hoc extensões desse tipo com facilidade 8.
lores calculados seria fazer o cálculo na
para scripting, como o próprio BIRT. O BIRT também permite invocar classes
própria query do Data Set; por exemplo:
A Fundação parece ter demorado para levar Java a partir do relatório. Não abordamos
o assunto a sério, devido à grande ênfase essa funcionalidade neste artigo, mas é uma SELECT PRODUCTNAME, PRODUCTVENDOR,
do Eclipse no desenvolvimento de plug-ins. opção bem mais complexa. O código Java PRODUCTDESCRIPTION, BUYPRICE,
Mas mesmo uma ferramenta poderosa como não tem os benefícios do Report Object ( CASE WHEN BUYPRICE >= 50 THEN ‘caro’
ELSE ‘barato’ END) AS AVALIACAO
o PDE não supera a facilidade de escrever Model ou de extensões de sintaxe, sendo FROM PRODUCTS
scripts, que permitem inclusive cenários de obrigado a utilizar APIs do BIRT, ex.: task. ORDER BY PRODUCTVENDOR, PRODUCTNAME
“programação zero” (macros gerados pela getParameterValue(“productLine”). Estas APIs prio-
Este tipo de programação é comum
captura de ações do usuário no IDE). Mas rizam flexibilidade e desempenho sobre a fa-
quando são usados geradores de relatórios
agora os scripts estão na moda, ganhando su- cilidade de uso, e na versão 2.1 ainda não são
sem capacidade de scripting. Porém apre-
porte até da plataforma Java SE (ver JSR-223, APIs estáveis (com garantia contra mudanças
senta alguns problemas. A sintaxe “CASE”
já incluída no Mustang, e a JSR-292). O Eclipse incompatíveis em releases futuros).
usada no exemplo é uma extensão SQL de
precisa de um suporte robusto e unificado a Em geral, você só utilizará Java no lugar de
um SGBD específico, e mesmo essa sintaxe
scripting, compartilhado por todas as ferra- JavaScript se tiver necessidades especiais de
não permitiria implementar cálculos mais
mentas que possam se beneficiar de scripts, integração, como reusar métodos de alguma
complexos (por exemplo, qualquer cálculo
e suportando várias linguagens. O assunto biblioteca Java. Ou de desempenho, como
exigindo um loop). A solução poderia ser o
foi discutido num painel da EclipseCon 2006, calcular um Data Set muito complexo (o
uso de procedimentos armazenados (que
e provavelmente será materializado numa que pode ser feito em JavaScript, mas com
o BIRT também pode invocar para gerar
solução definitiva no Eclipse 3.3. menos desempenho, por ser uma linguagem
um Data Set), mas esta prática também
O suporte a scripting não requer somente interpretada).
tem seus inconvenientes, como baixa por-
fazer a interface entre Java e o runtime de
tabilidade. Além disso, transferir colunas
alguma linguagem de scripting – problema
que a JSR-223 já padroniza e resolve. Boa 8
Ou seja, os scripts do BIRT não são realmente Ja-
parte do esforço é a definição de um Object vaScript puro, e sim uma extensão. Mas o BIRT faz um
pré-processamento que trata estas extensões e gera
7
Este artigo de Joel Spolsky diz tudo sobre a questão
Model (OM) que represente, de uma forma código JavaScript comum, compatíveis com runtimes “aparência versus funcionalidade”:
simples, os dados e funcionalidades do de JavaScript padrão, como o Mozilla Rhino. joelonsoftware.com/articles/fog0000000356.html
Customizações de layout
Vamos a uma outra necessidade im-
portante de relatórios “caprichados”:
modificar dinamicamente a apresentação
dos dados, para destacar informações
importantes. Nunca esqueça que você é
pago (principalmente) para fazer suas
aplicações parecerem boas!7
Digamos que você queira que as linhas Figura 8. Data set com uma coluna calculada por script.
do Grid que exibem os modelos mais ba-
ratos sejam exibidas em negrito. Para fazer
isso, selecione o manipulador da linha,
e vá na aba Property Editor / Highlights,
que permite definir regras de destaque.
Clique em Add, trazendo o diálogo New
Highlight; no primeiro campo, If following
condition is true, clique o botão “...”. Lá está
mais uma vez o Expression builder. Crie
a expressão row[“Preço”]. De volta ao New
Highlight, no segundo combobox (para a
seleção de operador) escolha Less than;
e no terceiro campo, que também aceita
uma expressão, digite 50. Agora, no grupo
Then apply following formatting, clique no
segundo botão “B” (bold); veja a Figura 9.
Pronto, basta confirmar e testar novamente
o relatório.
O Report Engine procura oferecer uma
GUI que permita fazer tudo com o mouse,
selecionando opções predefinidas mes-
mo na edição de scripts. Usuários mais
experientes, que conheçam JavaScript e já
tenham aprendido palavras-chave como
row e params, poderão ignorar esta interface
gráfica e digitar as expressões diretamen- Figura . Editando uma regra de destaque.
te. No caso do highlight, acho mais fácil
digitar um único script no primeiro campo
– row[“BUYPRICE”] < 50 – e deixar os outros
como “Equals to” e “true”.
JFreeChart. Mas o princípio do BIRT é ex- opção de scripting. no caso de JDBC: não há query, somente
plorar a generalidade do conceito de Data Crie um novo Data Source, com o tipo colunas calculadas (na aba Output Colu-
Source, que não precisa necessariamente Scripted Data Source e nome “scriptDS”. Na mns). Crie duas novas colunas, angulo e seno,
ser uma fonte de dados relacional. aba Script do editor, você verá que o BIRT ambas com o tipo Float. Veja a Figura 10.
Ao criar um Data Source, você deve ter permite definir cinco métodos: open, close, Observe que o diálogo não permite a
observado que existem opções de flat beforeOpen, beforeClose, afterOpen e afterClose. entrada de expressões para calcular o valor
files (arquivos CSV – texto com campos Pode ser preciso redefinir estes métodos, destas colunas, o que pode parecer estra-
separados por vírgula), e XML (que usam por exemplo, para abrir e depois fechar nho. Mas faz sentido, pois nosso Data Set
expressões XPath para extrair um Data Set uma conexão com um sistema externo. não possui colunas de dados “primárias”
tabular de um documento XML qualquer). Neste exemplo, não precisaremos disso. a partir das quais as colunas calculadas
Estas opções são muito interessantes para Crie um Data Set chamado “senoidal” possam ser derivadas (no caso de Data Sets
a integração entre aplicações através de para este Data Source. Você verá que o JDBC, estas colunas seriam as do resultset
arquivos. Mas ainda mais poderosa é a diálogo Edit Data Set é mais simples que da query ou stored procedures. O Scripted
Data Source exige o uso de scripts para
tudo, inclusive para determinar quantas
linhas existem, portanto, sua configuração
é um pouco diferente.
Na view Data Explorer, deixe o Data Set
senoidal selecionado; agora, na view do
.rptdesign (área central), clique na aba
Script. Você verá um combobox no topo,
listando todos os métodos disponíveis
para o script do Data Set. Entre com o
seguinte código.
Para o método open:
x = 0.0;
if (x < 8) {
row[“angulo”] = x;
row[“seno”] = Math.sin(x);
x = x + 0.01;
return true;
}
else return false;
Figura 11. Data Set totalmente baseado em scripting, com o código que gera cada nova linha. Para compreender a programação de um
Data Set baseado em script, basta pensar
que ele funciona como um java.util.Iterator.
O método open inicializa o Data Set, e o
método fetch retorna true se existir mais
uma linha, ou false se não houver mais
linhas. Além disso, o fetch deve também
setar os valores de todas as colunas para
a próxima linha (se houver).
No nosso exemplo, queremos calcular
os senos de todos os ângulos entre 0 e 8
radianos (i.e., de 0 e 1.440 graus, ou 4 voltas
na circunferência trigonométrica), com
incrementos de um centésimo de radiano
(3,6 graus). (Utilizamos valores fixos para
o ângulo inicial, final e incremento, mas
poderíamos facilmente ter criado parâme-
tros do Data Set para estes valores.)
Para fazer isso, usamos uma variável de
Figura 12. Chart gerado a partir do data set senoidal, calculado por um script. estado do Data Set, a variável x, iniciali-
N
o artigo “Relatórios na Web Passo bém mostraremos como criar e configurar relatório são obtidos a partir de um banco
a Passo”, publicado na edição gráficos no relatório MySQL, e o modelo de dados é mostrado
anterior, apresentamos o Jasper- na Figura 1.
Reports e o iReport e mostramos como Sobre o projeto de exemplo A Figura 2 representa o resultado final
criar um relatório mestre-detalhe com- O projeto utilizado neste artigo permite a desse relatório e o quadro “Como criar o
pleto, que lista detalhes dos pedidos de execução de um relatório a partir de uma relatório inicial” resume os passos para a
clientes. Neste artigo, vamos incrementar aplicação web. Ele é baseado em quatro criação. O projeto inicial completo, com
esse relatório inicial definindo grupos e entidades principais: pedidos, itens de todas as classes necessárias, os templates
acrescentando diversas totalizações. Tam- pedido, clientes e produtos. Os dados do de relatorio.jrxml e o script para criação do
banco de dados, está disponível no site
da Java Magazine. Os leitores que não
acompanharam o artigo na edição ante-
rior poderão obter esse exemplo pronto,
e partir dele para realizar as mudanças
detalhadas aqui. Será disponibilizado no
download tanto o projeto inicial, como
o projeto final, resultado das alterações
feitas neste artigo.
tório também seja passado para a variável final da geração do relatório. SELECT c.nome as nomeCliente,
totalGeral do relatório principal. Faça o 2. Configure a Textfield expression de SUM(it.quantidade * pro.preco) as totalCliente
seguinte: modo que o valor seja apresentado como FROM pedidos_itens it
JOIN pedidos ped ON ped.numero = it.numero_pedido
1. No relatório principal RelatorioPedidos. moeda, novamente utilizando o formata- JOIN produtos pro ON pro.id = it.id_produto
jrxml, abra a janela de propriedades do ele- dor de moedas, da seguinte maneira: JOIN clientes c ON ped.id_cliente = c.id
mento subreport; clique na aba Subreport GROUP BY c.nome
(Other) e dentro dela selecione a aba Subre- “Total Geral: “ + java.text.NumberFormat.getCurrencyInstance(
new Locale(“pt”,”br”)).format($V{totalGeral}.doubleValue())
port return values. Depois clique em OK para salvar as
2. Clique no botão Add e digite o nome Veja na Figura 12 como ficam o layout e alterações. Ao ser definida a consulta, os
da variável do sub-relatório (Subreport o resultado da execução. campos retornados serão automaticamente
variable) que contém o valor a ser somado: declarados no subdataset.
total. Gráfico de vendas por cliente
3. Indique o nome da variável que deve O JasperReports tem suporte a gráficos, O elemento de gráfico
estar definida no relatório principal onde através de um elemento de relatório que Já podemos incluir o gráfico no rela-
a totalização será armazenada (Local usa a biblioteca JFreeChart (jfree.org/ tório:
destination variable), ou seja, a variável jfreechart). Este elemento também está dis- 1. Vá em Visualizar|Bandas do Relatório,
totalGeral. ponível na barra de ferramentas
4. Indique também que o cálculo repre- do iReport, e permite a configu-
senta uma soma, fazendo Calculation type ração de um subconjunto das
= Sum. propriedades visuais suportadas
Veja essas configurações na Figura 11. pelo JFreeChart.
Como exemplo, vamos acres-
Resta apenas exibir a variável totalGeral centar um gráfico de barras que
no final do relatório: mostra o valor total consumido
1. Coloque na banda summary um por cada cliente em todos os
textfield com Evaluation time = Report; isso pedidos realizados por esse RelatorioPedidos.jrxml
faz com que o textfield seja avaliado ao cliente no final do relatório
RelatorioPedidos.jrxml, na banda
summary.
Subdataset
Precisamos que os valores se-
jam agrupados pelo cliente, ou
seja, é necessário criar uma con-
sulta SQL diferente da definida
no relatório principal. Por isso
iremos usar um subdataset.
Um subdataset é um elemento
do JasperReports usado para
fornecer uma fonte de dados Figura 9. Relatório com total por cliente.
secundária para um gráfico.
Subdatasets têm seus próprios parâmetros,
Figura 7.Tela de configuração da variável que totaliza o variáveis e fields, e podem ter também
valor de pedidos por cliente. uma consulta SQL executada (ou um
outro datasource, que neste caso viria de
um dos campos do datasource principal).
O conceito é muito parecido com o de um
subreport, e é possível ter vários subdata-
sets num mesmo relatório.
Para criar o subdataset:
1. Vá até Editar|Subdatasets e clique em New.
2. Clique em Create. Isso habilita os de-
mais botões da janela.
3. Clique em Query, e insira a seguinte
Figura 8. Configuração de parâmetro de retorno do subreport. consulta SQL: Figura 10. Tela de configuração da variável de total geral.
Ana Abrantes
([email protected])
é desenvolvedora Java na
Globalcode, co-autora do curso
de JasperReports/iReport e possui
algumas certificações em Java (SCJA, SCJP e SCWCD). É
formada pela FATEC-SP e atua na área de informática
há mais de 15 anos.
Yara M. H. Senger
([email protected]) é formada
em Ciências da Computação na USP
em São Carlos, especialista em desen-
volvimento web; possui as certificações
SCJA, SCJP e SCWCD. Atualmente é Instrutora e Diretora
Educacional da Globalcode, criadora e coordenadora
de diversos cursos das carreiras Academia do Java e
Academia do Web Developer.
Figura 18.Última página do relatório gerado, com gráfico inserido.
O T
projeto de interfaces gráficas sobre nossos olhos revelam detalhes que do a importância do projeto visual para
eficazes exige mais do que co- complementam o significado das infor- o desenvolvimento de GUIs (Graphic
nhecimento sobre componentes mações e auxiliam o usuário a entender User Interfaces; interfaces gráficas com
visuais ou outras questões relacionadas o conteúdo da imagem observada. o usuário). Em seguida, abordaremos
à tecnologia. São detalhes mais humanos
que fazem a diferença, e que precisam
ser compreendidos antes mesmo de se
digitar qualquer linha de código. Os
efeitos que cada elemento visual produz
Este artigo apresenta a primeira parte
de uma série voltada para a qualidade
das interfaces gráficas, apresentando
técnicas fundamentais para um bom
projeto visual. Começaremos analisan-
erros comuns e técnicas de organização
de interfaces. E veremos como utilizar
a API JGoodies Forms para montar
telas eficientes e com poucas linhas de
código.
p
Técnicas de
nosso estudo analisando alguns dos
principais erros cometidos no projeto de
GUIs. Em seguida veremos técnicas de
organização de informações e de redução
P
or ser um conceito muito abstrato, apoio de designers e outros especialistas cometidos no desenvolvimento de inter-
qualquer julgamento sobre a qua- em projeto visual. O resultado dessa de- faces gráficas. Ilustraremos esta técnica
lidade de um software é difícil. cisão freqüentemente são sistemas com com um exemplo – veja a Figura 1 – que
Embora existam normas e processos de telas complexas e pouco intuitivas, que resume alguns problemas que precisam
engenharia de software voltados para às vezes confundem seus usuários por ser sempre evitados. Você dificilmente
esse propósito, a tendência de um usuá- refletirem diretamente as entidades de encontrará todos esses problemas juntos
rio é determinar a qualidade de algo que negócio por trás do sistema (EJBs, tabelas na mesma tela de um sistema real, mas
não conhece baseando-se naquilo que etc.). Além disso, o desconhecimento de a freqüência com que cada um aparece
vê e sente. Assim, a interface gráfica de princípios de criação de interfaces ou a separadamente é bastante alta.
um sistema conta muito para uma boa simples vontade de embelezar muito a Vejamos os erros. Comece observando
impressão. tela podem resultar em interfaces pobres os componentes JTextField desalinhados
Vamos começar explorando algumas e excessivamente poluídas. na parte superior esquerda da tela. As
questões fundamentais que precisam A segunda questão que precisamos suas posições horizontais variam de
estar claras para qualquer equipe envol- destacar é a suposição incorreta de que acordo com o tamanho de cada JLabel.
vida na criação de GUIs. A importância o simples uso de componentes e APIs Esse problema de alinhar os JLabels, mas
dessas questões está relacionada ao papel (como os do Swing e do AWT) é suficien- não os componentes relacionados, torna
do projeto visual no desenvolvimento e o te para se alcan-
momento em que ele deve ser aplicado. çar os benefícios
Em primeiro lugar, o projeto visual não de uma boa apre-
é uma tarefa que pode ser deixada para sentação. A for-
depois. Este é um erro comum cometido ma com que essas
em muitos projetos e que ainda precisa peças são unidas
ser combatido. Para ser eficaz, o projeto é tão importan-
visual precisa estar bem integrado ao te qua nto cada
ciclo de vida de desenvolvimento, per- peça individual.
mitindo que interfaces gráficas possam E é necessário ir
ser elaboradas e melhoradas conforme além; entender a
o entendimento do problema avança ao influência e efei-
longo do tempo. tos que diferen-
É comum vermos empresas que deixam tes composições
o projeto e a implementação de GUIs ape- cau sa m nu ma
nas nas mãos de programadores sem ex- GUI.
periência na criação de interfaces, e sem Começaremos Figura 1. Tela de exemplo que ilustra um projeto visual com problemas.
Figura 3. Excesso de bordas no painel à esquerda em contraste com a simplicidade do painel à direita.
com JGoodies
O FormLayout revela-se como uma solução
vantajosa por ser simples e intuitivo, e ade-
quado para a codificação direta sem o uso
de editores visuais de interfaces. Você verá
a partir de agora que o código exigido para
a montagem de uma tela normalmente é
U
ma das soluções open source mais para executar os exemplos. bem curto e de fácil leitura, o que aumenta
interessantes para quem traba- a produtividade do desenvolvedor.
lha com Java no desktop é, sem Começando com o FormLayout
dúvida, o conjunto de APIs do JGoodies. A classe central da API Forms é FormLayout, Usando o FormLayout
Consulte o quadro “O que é JGoodies?”, um gerenciador de layout que divide a tela Para a criação de uma instância de
ao final desta seção, para conhecer melhor em linhas e colunas flexíveis. Assim como FormLayout, passamos no construtor duas
essa iniciativa. Veremos agora como utilizar a classe GridBagLayout do Java SE, o FormLayout strings que definem, respectivamente, as
a API JGoodies Forms para implementar alinha componentes às células da grade colunas e as linhas que formam a grade da
interfaces eficazes em Java. Nosso objetivo retangular que forma a tela, permitindo tela sendo projetada. O JGoodies Forms de-
principal será reconstruir a tela inicial que cada componente ocupe uma ou mais fine uma linguagem simples para montar
apresentada nas Figuras 1 e 2 (onde muitos células. essas strings e especificar cada linha e co-
erros foram encontrados) seguindo as técni- luna. Uma vantagem é que toda a estrutura
cas de projeto visual apresentadas. Uma das mais importantes vantagens do do painel está centralizada nessas duas
FormLayout é o uso da grade para dividir o espaço strings, o que facilita a sua compreensão
Preparação da tela. De fato, essa é a principal técnica utilizada e rápida modificação. Em outros geren-
A obtenção e instalação da API Forms pelos designers profissionais. Uma grade alinha, ciadores, a estrutura normalmente fica
são bastante simples: navegue até o site espalhada, exigindo que o desenvolvedor
do JGoodies (jgoodies.com), vá até a seção leia partes extensas do código de GUI para
Downloads e clique em Libraries. Lá você entender a estrutura sendo definida.
terá acesso aos arquivos zipados de todas Nosso primeiro exemplo é o painel
as APIs, os quais contêm exemplos, docu- ilustrado na Figura 5. Para criá-lo utili-
mentação, código-fonte e o JAR que deve zando o FormLayout, esboçamos a tela em
ser incluído no classpath da sua aplicação papel e identificamos as linhas e colunas
que formam a sua estrutura. Observe a
Listagem 1. Método para criar o painel do exemplo da Figura 5 com o FormLayout. Figura 6 e veja como o painel foi proje-
private static Component montaPainelExemplo() {
tado. Repare que existem nove colunas.
FormLayout layout = new FormLayout( As colunas 1, 3, 7 e 9 determinam que a
“right:pref, 3dlu, pref, 3dlu, 15dlu, 10dlu, right:pref, 3dlu, pref”, // colunas
“pref, 3dlu, pref, 3dlu, pref”); // linhas largura seja a largura preferida dos com-
layout.setColumnGroups(new int[][] { {1, 7}, {3, 9} });
ponentes inseridos em seu interior (no
caso, JLabels ou JTextFields / JComboBoxes).
JPanel panel = new JPanel(layout);
As colunas 1 e 7 exigem ainda que seus
CellConstraints cc = new CellConstraints(); componentes estejam alinhados à direita.
panel.add(new JLabel(“Nome:”), cc.xy (1, 1));
panel.add(new JTextField(), cc.xyw(3, 1, 7)); Note que a contagem das linhas e colunas
panel.add(new JLabel(“CPF:”), cc.xy (1, 3));
panel.add(new JTextField(10), cc.xy (3, 3)); começa em 1.
panel.add(new JLabel(“Categoria:”), cc.xy (1, 5)); As colunas 2, 4 e 8 formam um espa-
panel.add(new JComboBox(), cc.xy (3, 5));
panel.add(new JButton(“...”), cc.xy (5, 5)); çamento de proporção fixada em 3dlu
panel.add(new JLabel(“Telefone:”), cc.xy (7, 3));
panel.add(new JTextField(), cc.xy(9, 3));
(dialog units). Essa unidade estabelece um
panel.add(new JLabel(“Telefone(Fax):”), cc.xy (7, 5)); tamanho que é independente de pixels e
panel.add(new JTextField(), cc.xy(9, 5));
return panel; é calculado levando em conta o tamanho
}
das fontes (definido pelo look-and-feel) e
a resolução da tela. Dessa forma, podemos
fill ou f: preencher com o conteúdo (default). “fill:30dlu” – coluna de 30dlus de largura, onde os componentes são
Alinhamento de left ou l: alinhado à esquerda. esticados para ocupar toda a largura.
Colunas center ou c: centralizado. “right:pref” – coluna onde os componentes ficam alinhados à direita, e
Right ou r: alinhado à direita. sua largura é a largura preferida dos componentes.
center ou c: centralizado (default). “top:100px” – linha de 100 pixels de altura, onde todos os componen-
top ou t: alinhado ao topo. tes estão alinhados na parte de cima (topo).
Alinhamento de Linhas
bottom ou b: alinhado ao chão. “fill:3cm” – linha de 3 cm de altura, onde os componentes ocupam todo
fill ou f: preencher com o conteúdo. o espaço vertical.
Inteiro + Unidade
“10px” – linha/coluna com 10 pixels de altura/largura.
Onde Unidade pode ser: px (pixel), pt (point) ou dlu
“36pt” – linha/coluna com 36 pontos de altura/largura (36 pontos = ½
(dialog unit). (Obs.: 1 pt = 1/72 polegada)
Tamanho Constante polegada).
– ou –
“0.33cm” – linha/coluna com 0.33 cm de altura/largura.
Double + Unidade
“0.15in” – linha/coluna com 0.15 polegadas de altura/largura.
Onde Unidade pode ser: in (polegada), mm ou cm.
min(constante;componente): assume o tamanho menor “min(30dlu;p)” – linha/coluna cuja altura/largura assume o menor valor
entre os valores. entre 30dlu e a altura/largura dos componentes.
Tamanho Limitado
max(constante;componente): assume o tamanho maior “max(0.5cm;p)’ – linha/coluna cuja altura/largura assume o maior valor
entre os valores. entre 0.5cm e a altura/largura dos componentes.
isso para telas complexas com lápis e o arquivo da planilha como documenta- dies Forms chamada DefaultFormBuilder,
papel tende a ser um pouco trabalhoso, ção para a equipe. A Figura 8 apresenta a que apresenta algumas funcionalidades
portanto você pode talvez preferir voltar planilha criada para o exemplo. vantajosas como, por exemplo, o suporte
ao computador neste ponto. Uma opção é A identificação das linhas e colunas a separadores com títulos, depuração e
utilizar uma planilha eletrônica e colorir já é suficiente para iniciar a codificação internacionalização. A implementação com
as células onde ficam os componentes. da interface. Construiremos o painel essa classe não é muito diferente da vista
Essa estratégia tem a vantagem de deixar utilizando uma classe utilitária do JGoo- até aqui:
Listagem 2. Classe que recria o painel do exemplo inicial, agora utilizando a API Forms do JGoodies.
Figura 9. Tela de exemplo reconstruída com a API Forms. Figura 10. Tela do exemplo, em modo de depuração, mostrando a definição da grade.
A
AD
AD
OT
OT
G
G
ES
ES
Edição 1
Edição 2
Edição 3
Edição 4
coleção! - Ferramentas livres
- Introdução ao J2EE 1.4
- Introdução a J2ME
- J2EE Fundamental
- Multimídia no celular
- Automação com Ant
- Robocode
- Tag Libraries JSP
- Dados em J2ME
- JavaServer Faces
- Jogos wireless
- Eclip
- O me
- Segu
- Inte
- Certificação J2EE
- Dados com JDBC - Processando XML em Java - Montando um ambiente Java - Expr
A
AD
GOT
ES
Edição 13
Edição 10
Edição 11
Edição 12
Edição 14
Edição 9
- Java no Governo - Códigos no Eclipse - Tutorial de NetBeans - Eclipse para Web - Relatórios Corporativos - Form
- Apache FOP - New I/O Fundamental - API New I/O (java.nio) - Fome Zero com Java - Gráficos com Java 2D - ANT
- JSTL – Guia Completo - Game API - Cesta de compras com Struts - Tags Customizadas em JSP 2.0 - Java.net na Prática - JBos
- Cocoon Inicial - Criando Plug-ins para Eclipse - Testes de carga com JMeter - Tiger: A Evolução do Java - Raio-X do Tiger - Extre
- Pacotes WAR e JAR - Preferences API - Concorrência e a JVM - Dicas para Web - Paginação na Web - Meta
$OMANDO O #LASSPATH
4IRE SUAS D¢VIDAS SOBRE ESTE CONCEITO ESSENCIAL
%SPECIAL
%SPECIAL
0ATTERNS /N
2ELATRIOS .
Edição 24
Edição 21
Edição 22
Edição 23
Edição 19
Edição20
- JSTL aplicado no Tomcat 5 - Threads no Java 5.0 - Relatórios avançados - Criptografia aplicada - O Projeto Eclipse - Nov
- Modularizando páginas com Tiles - Cadastros com Struts - Mais design patterns - XML de alto desempenho - Segurança no JBoss - Máq
- Componentes View do Struts - MVC na web - Gerenciamento com JMX - Segurança em apllicações web - JSF Avançado - Gráf
- O rugido do Java livre - Servlet API Avançada - Java Web Start - JSF Passo a Passo - Começando com Java - Sup
- Padrões de projeto - Dúvidas de classpath - Datas e Horas em Java - Tira-dúvidas - Tag
Edição 29
Edição 30
Edição 31
Edição 32
Edição 33
Edição 34
- JavaMail - HSQLDB - SWT no Eclipse - NetBeans 5.0 - Hibernate em aplicações web - Para
- Por Dentro do Apache Derby - Internacionalização de MIDlets - Eclipse Web Tools Project - Aprendendo Groovy - Java 6 (Mustang) - Test
- Clusters com Tomcat e Apache - Performance na JVM - Validação avançada com Struts - Test-Driven Development - Programação em par - Web
- Mais HttpClient - Caso de sucesso: Procon - Fronteiras do Java - Debate Internacional Sou+Java - Processos ágeis - Scri
- Examinando o Mustang - Benchmarks JME - CD do NetBeans - Java Business Integration (parte 1) - Java Business Integration (parte 2) - Asp
www.javamagazine.com.br devmedia.com .b
jm38.indb 54
jm24-anteriores_página dupla.ind2-3 2-3 17/7/2006 14:12:50
A
A
AD
AD
AD
OT
OT
OT
G
G
ES
ES
ES
Edição 4
Edição 5
Edição 7
Edição 8
Edição 6
- Eclipse inicial - JBoss Inicial - Introdução ao Tomcat - Bancos de dados livres - JavaOne 2003
- O mercado J2ME - Introdução ao JMX - Conectivade com MIDP - Testes unitários com JUnit - Conhecendo o CVS
- Segurança em aplicações web - Java no Lego Mindstorms - Struts, primeiros passos - JSTL- Guia Completo: tags Core - JSTL- Guia completo SQL e Format
- Interfaces ricas com Flash - Logging - Automação com XDoclet - Java na Droga Raia - Tomcat e o Servidor Apache
ava - Expressões regulares no J2SE 1.4 - Memória e desempenho
A - Jakarta Velocity - Validação na Web
AD
OT
G
ES
Edição 18
Edição 14
Edição 15
Edição 16
Edição 17
- Genéricos no Tiger - SwingWT - JSP 2 e Servlets no Tomcat 5
- Formulários com Swing - Otimização de EJBs no JBoss
- JBuilder para web - Java 2D: Animação e impressão - Primeiros passos com wireless
- ANT - Automatizando Java - Processamento de imagens
- MIDP 2.0 - Anotações no Java 5 - Collections avançado
- JBoss e Entity Beans - Programação com regras
- JavaOne 2004 - Projeto Looking Glass - Conhecendo o JDeveloper 10g
- Extreme Programming - Jakarta Taglibs
- Segurança com JAAS - Java 2D: Animações e Impressão - Servlets: do básico ao avançado
- Metaprogramação e Reflection - Case J2ME
PÕ
'RÕFICOS COM *&REE#HART Imprimindo com Java
! 2EVISTA DA #OMUNIDADE *AVA "RASILEIRA #RIE GRÕFICOS DE NEGCIOS PARA APLICA½µES
DESKTOP E WEB USANDO !0)S LIVRES Conheça duas APIs de impressão do
J2SE e obtenha controle fino
sobre layout e formatação
3UPER7ABA )NICIAL
$ESENVOLVA PARA 0$!S COM
FERRAMENTAS *AVA E CONHE½A
O MUNDO DOS HANDHELDS
Gerência de Conteúdo
Edição 24 - Ano III - R$ 9,90 Detalhes sobre a Novíssima API
JCR e a Criação de Repositórios
4AGS *30 COM 4AG &ILES de Conteúdo na Web
! MANEIRA MAIS SIMPLES DE CRIAR TAGS
CUSTOMIZADAS PARA PÕGINAS *30
Uma Aplicação Java Tira-Dúvidas Especial
%SPECIAL
%CLIPSE#ON Completa com NetBeans Caches e DAOs com JDBC, Usando
*6-S !LTERNATIVAS !S NOVIDADES DO )$% E DE OUTROS Parte final – Acesso a Banco
JVMs Alternativas, Relatórios e
Driblando Restrições
#ONHE½A MAIS DE MÕQUINAS VIRTUAIS PROJETOS DA &UNDA½áO %CLIPSE de Dados e Gerência de
*AVA E EXPLORE T£CNICAS DE OTIMIZA½áO Preferências de Usuários
da Máquina
E BENCHMARKS
Java:
/NOVO Futuro
.ET"EANS
.ET Presente &
Edição 24
Edição 28
Edição 25
Edição 26
Edição 27
JavaOne 2005
Grandes novidades em
produtos e APIs, planos e Migrando para o Java 5
/ )$% LIVRE PATROCINADO PELA 3UN £ HOJE UMA FERRAMENTA INTEIRAMENTE comemorações no evento Conheça na prática e em detalhes
NOVA 2EVEJA OS FUNDAMENTOS DO )$% CONHE½A NA PRÕTICA A NOVA mundial da tecnologia Java como, porque e quando fazer o
ESTRUTURA DE PROJETOS BASEADA NO !NT E SAIBA O QUE VIRÕ NA VERSáO upgrade para o J2SE 5.0
- Novo NetBeans - Aplicação Completa - Parte 1 - Aplicação Completa - Parte 2 - Aplicação Completa - Parte 3 - Hibernate Fundamental
- Máquinas virtuais alternativas - Desempenho com JDBC e DAOs - Mais Desempenho com JDBC - Migrando para o Java 5 - Apache Geronimo na Web
- Gráficos com JFreeChart - Portlets - Fundamentos - Portlets - Recursos Avançados - Impress ão com Java - Ajax: Interatividade Turbinada
- SuperWaba Inicial - JFreeChart Avançado - Jakarta Commons Inicial - Gerenciamento de Conteúdo - Tutorial de Genéricos
- Tag Files do JSP 2.0 - O Novo Extreme Programming - Números: Conceitos e Formatação - JavaOne 2005 - De Volta aos Patterns
Edição 35
Edição 36
Edição 37
use em todos
os lugares
web - Para onde vai o Struts - Frameworks de Logging - Conhecendo o Ant - Criação de Plug-ins
- Teste com J2MEUnit - Otimização de Código - Acessando Código Nativo - Os 10 Mais do Eclipse 3.2
- Web Services - Ajuda com JavaHelp - Qualidade Aplicada - JavaOne 2006
- Scripting na JVM - Maven 2 Essencial - Migrando para o Maven 2 - Relatórios Passo a Passo
(parte 2) - Aspectos no Mundo Real - Java ME no Eclipse - Logging no Java SE - Testes com mock objects
N
o final de junho foi finalmente • Eclipse Test and Performance Tools atualizações gerada por cada projeto indi-
liberado um dos lançamentos Platform Project (TPTP) vidual no passado – por exemplo, hoje sai
mais ag uardados do a no, o • Eclipse Web Tools Platform Project um novo Eclipse SDK, algumas semanas
Eclipse Callisto, que reúne 10 dos projetos (WTP) depois um novo EMF, apenas depois disso
mais importantes da Fundação Eclipse: • Visual Editor (VE) um novo WTP, e daí em diante.
• Business Intelligence and Reporting O propósito do Callisto é facilitar a vida
Tools (BIRT) O projeto Callisto, destacado no artigo de dois tipos de usuários, ao oferecer
• C/C++ IDE (CDT) sobre o Eclipse 3.2 na edição passada, foi uma plataforma unificada com releases
• Data Tools Platform (DTP) iniciado no começo de 2006 com o ambi- simultâneos de componentes-chave dos
• Eclipse Modeling Framework (EMF) cioso objetivo de liberar simultaneamente 10 projetos citados:
• Graphical Editing Framework (GEF) e as novas versões de vários dos principais • Desenvolvedores individuais que
Graphical Modeling Framework (GMF) projetos da Fundação Eclipse. Dessa for- usam o Eclipse como ambiente de desen-
• Eclipse Project: Eclipse Platform, ma, os novos recursos ficam disponíveis volvimento de aplicações;
Java Development Tools (JDT) e Plug-in para uso imediato pelos interessados, em • Integradores que constroem produ-
Development Environment (PDE) vez de terem que esperar pela cascata de tos baseados nos projetos da Fundação
Eclipse
Instalação do Callisto
Curiosamente, o Callisto não fornece
uma página de downloads e nem um ins-
talador integrado, o que o torna bastante
diferente de “distribuições” do Eclipse
como o Yoxos (yoxos.com).
Para se obter o Callisto, é necessário
baixar e instalar manualmente o Eclipse
Platform Runtime 3.2 (ou então o Eclipse
SDK 3.2) para a sua plataforma específica.
Depois deve-se abrir o Update Manager
da plataforma (Help|Software Updates
>Find and Install), conforme mostra a
Figura 1. O próximo passo é escolher a
opção Search for new features to install, e na
página seguinte do assistente selecionar
Callisto Discovery Site.
Figura 1. Como chegar ao site de download do Callisto. Antes de receber a relação de features
que podem ser instaladas pelo Callisto,
de se deixar de acom- o usuário recebe a opção de selecionar
panhar cada projeto um espelho (mirror) para o download
individualmente e uti- dos arquivos. Há uma grande quantidade
lizar apenas as últimas de espelhos ao redor do mundo (veja a
versões disponibili- Figura 2), mas nenhum ainda no Brasil.
zadas como parte do O site principal tende a estar saturado,
Callisto. especialmente logo após o anúncio de
O Callisto garante um novo release de algum componente
que cada projeto no popular como o JDT, portanto pode ser
seu conjunto de rele- interessante selecionar uma das demais
ases funcionará junto alternativas.
com os demais sem A próxima janela exibe a relação de
problemas, coisa que features disponibilizadas pelo Callis-
nem sempre acontece to, organizadas em categorias como
com as versões mais “Java Development” e “Charting and
recentes dos projetos Reporting”. A mesma feature pode ser
individuais; garante exibida em mais de uma categoria, de
Figura 2. Escolha de um dos espelhos. t a m b é m q u e s e r ão modo a facilitar a localização das features
sempre versões está- desejadas pelos usuários iniciantes em
unificados. Cada um permanece com seus veis. O projeto ainda traz uniformidade Eclipse.
próprios planos de desenvolvimento e no controle de versões, critérios para Caso uma feature tenha dependências
cronogramas de releases individuais. O qualificação de releases como estável ou contidas em outras features, será exibido
que o Callisto fornece é a possibilidade em desenvolvimento, e outros pequenos um marcador de erros semelhante ao
Figura 7. Nem sempre o Update Manager será útil para quem não conhece os projetos que deseja
Figura 6. Baixando e instalando as features selecionadas.
instalar. Por exemplo, nenhuma feature tem um nome parecido com “draw2d”.
T
odo usuário de internet percebe o Instalação e uso Buscas
papel que o Google representa na Para usar a Google Search API, basta fa- As buscas são feitas definindo uma
vida on-line. Desde o inicialmente zer o download do kit de desenvolvimento, expressão de consulta, usando o metodo
modesto site de busca, com uma caixa de descompactá-lo em algum local do disco e setQueryString() – semelhante ao que seria
texto e dois botões, até o sofisticado Google obter uma chave. O site google.com/apis lista feito normalmente no site google.com – e de-
Earth, poucos são os internautas que não os passos necessários. Para obter a chave, pois invocando o método doSearch(), que re-
usam um dos produtos Google: Gmail, clique no link fornecido no segundo passo torna um objeto da classe GoogleSearchResult.
Calendar, Finance, Pages, Analytics, Maps, (“Create a Google Account”). Como se vê, Este objeto contém os resultados da busca
Desktop, Talk, SketchUp, Spreadsheets... e é necessário ter uma conta do Google, que e algumas informações adicionais, como
a lista não para de crescer. pode ser criada no mesmo site (se você o tempo de busca e o total estimado de
Mas mudar a maneira de como usamos tem uma conta no GMail ou no Orkut, já resultados. Um exemplo de uso do método
a internet parece não ser suficiente para tem uma conta no Google). Tendo a conta doSearch() pode ser visto na Listagem 1.
o Google, que está oferecendo cada vez criada, faça o login e uma chave será en- A melhor maneira de se encontrar as
mais ferramentas e APIs para que desen- viada para seu e-mail no GMail. A chave informações desejadas usando o Google
volvedores possam explorar os produtos e permite a realização de até mil pesquisas é construir uma boa consulta. Por exem-
tecnologias da empresa em suas próprias automatizadas por dia. plo, buscar por Java Magazine (sem aspas)
aplicações. Neste artigo, veremos como O k it de desenvol- usando a API, dificilmente retornará o site
usar a Google Search API, para realizar vimento contém o desta revista como o primeiro dos resulta-
buscas de vários tipos, obter sugestões JAR da biblioteca e dos. Uma primeira melhoria seria ao invés
de correção ortográfica e ler páginas exemplos de uso de buscar separadamente os termos Java e
armazenadas em cache, entre outras em Java, C# e Magazine, buscar o termo composto pelas
operações. Visu al Basic. duas palavras na ordem dada, colocando
Além destas, o conjunto entre aspas. Um detalhe é que,
pode ser usada para fazer isso no programa Java, as aspas
qualquer outra devem ser “escapadas” com o caractere “\”
linguagem que para que façam parte da string ao invés
suporte web servi- de delimitá-la, ou seja, a consulta seria
ces: o kit de desenvolvi- “\”Java Magazine\””.
mento inclui o descritor do Se a consulta fosse feita através de
web service publicado pelo um navegador web, o problema estaria
Google (GoogleSearch.wsdl) e resolvido. Mas o web service utilizado
exemplos de requisições (no pela API não recebe as informações de
diretório soap-samples). localidade submetidas pelo navegador,
Em Java, basta adicionar a bi- e sites de peso em língua inglesa como
blioteca googleapi.jar ao classpa- Amazon e JavaWorld tendem a aparecer
th, instanciar um objeto da classe primeiro nos resultados. Um contorno se-
com.google.soap.search.GoogleSearch e ria excluí-los manualmente dos resultados
configurar nele a chave usando com o operador “-“, executando a consulta
o método setKey(), como mostra- “\”Java Magazine\” -JavaWorld -Amazon”.
do na Listagem 1. A classe Há um mecanismo mais elegante para
GoogleSearch contém métodos limitar consultas. O método setRestrict()
para busca, sugestão ortográ- da classe GoogleSearch permite que sejam
fica e obtenção de páginas em impostas restrições de idioma, de país
cache, como será mostrado ou de tópicos. Por exemplo, se antes de
a seguir. buscar por “Java Magazine” configurarmos
sultas ao Google
JULIo FaerMan
seria “CMMI filetype:doc OR filetype:pdf”. Entre- intitle:\”index of\” +(\”/ebooks\”|\”/book\”) +( ao buscar por “Filosofy”, é retornado o
tanto, para buscar um termo comum ou chm|pdf|zip|txt) -inurl:htm -inurl:html lewis alice wonderland. termo correto “Philosophy” (veja Lista-
com muitos documentos relacionados, gem 1).
como o livro “Alice no País das Maravi- Todas essas buscas são exemplificadas
lhas” (Alice’s Adventures in Wonderland)1, na Listagem 1. Páginas em cache
uma busca por tipo de arquivo dificil- No processo de indexação de uma página,
mente retornaria o livro. Neste caso, é Sugestões de ortografia o Google armazena uma cópia em cache.
melhor buscar por páginas de índice de Quando se faz uma consulta no site do Esta versão arquivada pode ser obtida
diretórios, cujo título costuma ser “index Google usando um termo incomum ou usando o método doGetCachedPage(), que
of”, e num diretório de livros, como “book” com erros de digitação/ortografia, como retorna o código HTML da página. Esse do-
ou “ebooks”. Como desejamos o arquivo “javascripiti”, o Google é capaz de verifi- cumento pode ser facilmente reexibido por
do livro, também ajuda acrescentar como car em seu índice gigantesco que esta não um componente gráfico ou uma taglib, ou, é
critério os formatos comuns de livros ele- é a forma mais freqüente da palavra, e claro, ser mostrado em um navegador web.
trônicos – zip, chm, txt ou pdf. E como pági- educadamente sugerir: “Você quis dizer: Uma maneira simples para obter páginas
nas web não interessam, podemos remover JavaScript?”. em cache é mostrada na Listagem 1.
endereços com extensões de páginas, como A mesma funcionalidade está dis-
htm e html. Por último, adicionamos os ter- pon ível na API at ravés do método Limitações
mos da consulta, por exemplo o título do doSpellingSuggestion() da classe GoogleSearch. A Google Search API é uma oferta
livro e o nome do autor. Sendo assim, uma Basta passar o termo como parâmetro, que
busca como a seguinte tem boa chance de será retornada a sugestão de ortografia, ou 1
Obra de Lewis Caroll publicada em 1865 e em domínio
ser bem sucedida: null se não houver sugestão. Por exemplo, público desde o início do século passado.
Operadores
Os termos a seguir possuem interpretação especial e podem ser incluídos na expressão da consulta:
ou que tratem de alguns tópicos indexados tosh), bsd (Sistema Operacional FreeBSD). Por brevidade, foram apresentadas aqui ape-
separadamente, etc. Abaixo estão exemplos nas uma seleção de idiomas, países e tópicos.
de restrições que podem ser utilizadas e qual Restrições Combinadas – setRestrict() ou A lista completa pode ser vista em google.
método da classe GoogleSearch usar para con- setLanguageRestrict() com/apis/reference.html.
figurá-las:
Operador Significado Exemplo Descrição
Idioma – setLanguageRestrict()
lang_pt (Português), lang_en (Inglês),lang_de - Não -lang_pt Exclui resultados em português
(Alemão), lang_fr (Francês), lang_es (Espanhol).
. E linux.countryBR Resultados apenas do tópico linux de sites no Brasil
País – setRestrict()
| Ou lang_br | lang_en Resultados apenas em português ou inglês
countryBR (Brasil), countryEU (União Euro-
péia), countryUS (Estados Unidos), countryPY (Pa- () Precedência (linux).(-(countryUS|countryUK)) Resultados do tópico linux que não estejam nos EUA ou no Reino Unido
raguai), countryPT (Portugal).
experimental do Google, limitada a Por último, a API é muito mais precisa tões de ortografia. Mas com um pouco
aplicações não-comerciais e a apenas mil para termos e sites americanos, pelo volume de criatividade você poderá usar a API
consultas por dia. Não há previsão pública que estes representam no índice total. Por para incrementar praticamente qualquer
de se estender o serviço. Entretanto, para exemplo, a sugestão ortográfica é capaz de aplicação, integrando-a ao mais popular
aplicações corporativas, existe uma API corrigir termos mais comuns em português, mecanismo de busca mundial, e surpre-
semelhante baseada no servidor de busca como “Filosopia”, mas falha em outros pou- ender seus usuários.
corporativo do Google, que é um produto co publicados, como “Lumbriga”.
à parte (veja links).
Julio Faerman
Outra limitação é que apenas um sub- Executando o exemplo ([email protected]) é consul-
conjunto dos operadores de busca do site Para testar as consultas sugeridas, bas- tor independente em desenvolvi-
está disponível para a API. Por exemplo, ta executar a classe jm.GoogleSearchDemo mento de sistemas corporativos e
“stocks:”, “define:”, “movie:”, ou outros (Listagem 1), que está também disponível melhoria de processos de software.
serviços, como Images e Froogle, só po- no site da Java Magazine. Deve ser passada Certificado SCJP, SCWCD, SCBCD, SCDJWS e SCEA(I),
dem ser usados no site. (Estas e outras como parâmetro a chave de uso (além do bacharel em Ciência da Computação, MBA em Gerência
opções de busca podem ser conhecidas classpath, se este não estiver configurado). de Projetos e Mestrando da Universidade Federal de
em google.com/help/cheatsheet.html ou em Por exemplo (em uma linha): Uberlândia, na área de Inteligência Artificial.
googleguide.com/advanced_operators_refe-
rence.html.) java -cp c:\Java\GoogleAPI\googleapi.jar;.
jm.GoogleSearchDemo sua_chave google.com/apis
Site principal da Google Search API
code.google.com
Conclusões Portal para desenvolvedores (geral)
A Google API é poderosa e bastante
funcional. Mas colocar essa biblioteca de code.google.com/enterprise1
consultas em prática numa aplicação pode Portal para desenvolvedores (clientes
não ser tão simples, principalmente pelas corporativos)
limitações da sua versão atual. Algumas www.googleguide.com
destas limitações, no entanto, podem ser Guia de uso para buscas do Google (criado por
dribladas, por exemplo permitindo que terceiros)
cada usuário cadastre sua própria chave undergoogle.blogspot.com
de acesso. As aplicações mais beneficiadas Blog com dicas e notícias do Google
diretamente são aquelas que lidam com
gerência de conteúdo e sites, podendo javamagazine.com.br/downloads/jm38/
mostrar conteúdo semelhante ou suges- jm-googleapi.zip
O
Google Web Toolkit (GWT) é um pilador, distribuído no pacote
framework que define um novo do próprio framework.
paradigma de desenvolvimento O uso de código Java é
de aplicações AJAX. O seu objetivo é vantajoso, por exemplo, por
esconder do programador a implemen- permitir que o desenvolvedor
tação de código JavaScript, considerando utilize a IDE Java de sua pre-
que esta tarefa é repetitiva e propensa a ferência, já que o GWT é
erros, e repleta de tarefas tediosas, como independente do ambien-
o tratamento de incompatibilidades entre te de desenvolvimento.
navegadores. Além disso, com o uso
O GWT abstrai a linguagem JavaScript de uma IDE, as van-
a partir de uma biblioteca de classes Java, tagens da lingua-
na qual está disponível uma coleção de gem Java são bem
componentes visuais AJAX (os widgets), a p r o ve i t a d a s ;
já conhecidos dos que usam as aplicações por exemplo,
AJAX do Google, por exemplo o GMail e
o Google Maps.
Este tutorial apresenta o GWT e traz um
exemplo de implementação utilizando o
framework.
Vantagens do uso de
classes Java
A principal novidade apresentada pelo
GWT é o uso de classes Java para represen-
tar os componentes visuais da aplicação.
Estas classes são convertidas em
código JavaScript por um com-
a verificação de tipos pelo compilador e utilizados. A segunda ferramenta é um projeto. Recomenda-se também adicionar
a capacidade de completar código ao ser navegador web local, que evita que o o diretório do GWT à variável de ambiente
digitado. desenvolvedor tenha de converter o seu PATH, para facilitar a criação do projeto.
código Java em JavaScript cada vez que A partir do diretório criado para o proje-
Arquitetura do Framework desejar realizar um teste. O navegador to, execute o comando a seguir:
Um modelo da arquitetura do GWT é local é capaz de exibir os componentes das
apresentado na Figura 1. A arquitetura é bibliotecas sem a necessidade da conversão projectCreator –eclipse TutorialGWT
dividida em duas grandes camadas. A ca- de código. Isso cria o projeto. Em seguida, execute
mada de bibliotecas contém uma biblioteca este comando (numa mesma linha):
de componentes visuais e uma biblioteca Instalação applicationCreator –eclipse TutorialGWT
de emulação Java, que traz a implemen- O primeiro passo para utilizar o GWT br.com.javamagazine.client.TutorialGWT
tação de algumas classes dos pacotes é, claro, baixar o pacote a partir da pá-
gina do framework. O GWT encontra-se Será criada a estrutura básica de um
disponível para Windows e Linux. Neste projeto para o Eclipse, com referências às
tutorial iremos apresentar as instruções bibliotecas já configuradas. No Eclipse,
de configuração para Windows, lembran- basta importar o projeto criado (item de
do que o procedimento é
bastante semelhante para o
Linux. Foi utilizada a versão Biblioteca de
Biblioteca de
emulação Java Bibliotecas
1.0.21 do GWT; o pacote é componentes visuais
(java.lang e java.util)
distribuído no formato
ZIP e tem 13.9 MB.
A instalação é bastante
Compilador Java Navegador
simples: basta descom- Ferramentas
para JavaScript Local
pactar o arquivo ZIP
em um diretório de sua
preferência. Neste dire- Figura 1. Arquitetura do Google Web Toolkit.
tório estarão as bibliotecas
do GWT, e alguns utilitários para a
configuração de projetos.
O exemplo deste artigo é implemen-
tado utilizando o Eclipse com o WTP
(Web Tools Project). A utilização desse
Eclipse se justifica porque o GWT
traz ferramentas que automatizam o
processo de criação de projetos para
java.lang e java.util. Estas duas bibliotecas esse IDE.
compõem a infra-estrutura básica necessá-
ria para representar os componentes AJAX Criando um projeto
utilizando código Java. O primeiro passo é a criação de um
A outra camada do GWT é composta projeto e uma aplicação. Para isso,
por duas ferramentas. A primeira é o serão utilizados dois utilitários forne-
compilador de Java para JavaScript, que é cidos com o GWT: applicationCreator e
responsável por gerar o código JavaScript projectCreator. Será necessário criar um
representando os componentes visuais diretório para conter os arquivos do Figura 2. Estrutura do projeto de exemplo.
Listagem 1. TutorialGWT.html
<html> </tr>
<head> <tr>
<title>Tutorial GWT</title> <td id=”removeContact” align=”center” colspan=”2”></td>
<style> </tr>
body,td,a,div,.p{font-family:arial,sans-serif} </table>
div,td{color:#000000} </td>
a:link,.w,.w a:link{color:#0000cc} <td>
a:visited{color:#551a8b} <table align=”center”>
a:active{color:#ff0000} <tr>
.list {width: 100%;} <td>Nome: </td>
</style> <td id=”firstName”></td>
<meta name=’gwt:module’ content= </tr>
’br.com.javamagazine.TutorialGWT’> <tr>
</head> <td>Sobrenome: </td>
<body> <td id=”lastName”></td>
</tr>
<script language=”javascript” src=”gwt.js”></script> <tr>
<iframe id=”__gwt_historyFrame” style= <td>E-mail: </td>
”width:0;height:0;border:0”></iframe> <td id=”email”></td>
<h1>Tutorial GWT</h1> </tr>
<div id=”input” align=”center”></div> <tr>
<table align=”center”> <td colspan=”2”>
<tr> <div id=”insertContact” align=”center”></div>
<td> </td>
<table align=center width=”400”> </tr>
<tr> </table>
<td id=”label”></td> </td>
<td id=”text” width=”100%”></td> </tr>
</tr> </table>
<tr> </body>
<td id=”list” colspan=”2”></td> </html>
Listagem 2. TutorialGWT.java
code.google.com/webtoolkit/
Google Web Toolkit
eclipse.org/webtools
Projeto Eclipse Web Tools
javamagazine.com.br/downloads/jm38/
jm-gwt.zip
Douglas José
Soares Rodrigues
([email protected]) é
formado em Ciência da Com-
putação pela Unicamp e trabalha
como consultor Java há quatro anos.
Figura 4. Exemplo de cadastro e busca incremental, exibido no navegador
O
Struts oferece muitas branco; ou pior: os valores podem ser trata- butos do tipo String. Isso porque faremos o
funcionalidades para o dos de forma equivocada. Por exemplo, em Struts configurar o FormBean com os tipos
tratamento da entrada uma data como 10/03/06, o mês será 10, 03 corretos, ou seja, o próprio framework irá
de dados, mas possui ainda ou 06? Para nós brasileiros, fica claro que o converter os dados enviados pelo usuário
algumas limitações mês é março – mas e para o sistema? para Date e BigDecimal.
nessa área. Quem Uma das soluções mais utilizadas é A Action tem uma implementação sim-
utiliza o framework criar métodos no FormBean para tratar os ples. Ela faz apenas um forward para o JSP
sabe da dificuldade dados enviados. Dessa forma, existiriam com o formulário (veja a Listagem 3). Nos-
para se tratar, por no FormBean dois métodos: um para con- so objetivo aqui é fazer com que o Struts
exemplo, datas e nú- verter para o tipo correto no momento da configure o FormBean com seus devidos
meros decimais, e aca- entrada dos dados, e outro para converter atributos. Não nos importa neste ponto o
ba utilizando strings para para string no momento da exibição. O que será feito depois com estes valores.
representar muitas informa- problema dessa solução é que ela se repeti- A Listagem 4 mostra o conteúdo do
ções que vêm do usuário. rá para todos os formulários que precisam arquivo struts-config.xml. A configuração
Como sabemos, quando o usuá- da conversão, além de não se aplicar aos é simples. Primeiro definimos um formu-
rio entra com valores em um formulá- DynaActionForms (representações di- lário dentro do elemento <form-beans>, com
rio e os envia, estes chegam ao servidor em nâmicas de formulários configuradas no dois atributos: nome e classe. Usamos o nome
forma de strings. O Struts tenta converter struts-config.xml). Aqui veremos uma solu- formBeanTeste e a classe FormBeanTeste.
essas strings para os formatos mapeados ção alternativa, que oferece vantagens. Logo em seguida, temos a configu-
no FormBean (classe que representa um ração da Action dentro do elemento
formulário), e caso não consiga, recebemos Solução proposta <action-mappings>. Configuramos o path,
erros pouco explicativos ou páginas em Para demonstrar nossa solução, vamos que será a URL chamada pelo formulário
construir uma aplicação simples, com uma no momento da postagem; a classe, através
página JSP, um FormBean e uma Action. do atributo type; e o mais importante: o
Usaremos uma classe concreta para re- nome do FormBean, através do atributo
presentar o formulário, mas poderíamos name. O nome deve ser o mesmo dado na
igualmente utilizar um DynaActionForm. configuração do FormBean. Note que, após
O exemplo completo está disponível no site a execução da Action, iremos retornar
da Java Magazine. para a mesmo formulário (index.jsp) pois
O JSP, como mostra a Listagem 1, constrói também precisamos exibir/formatar os
um formulário com dois campos de texto; dados corretamente. Esse retorno simula,
o primeiro para uma data e o segundo por exemplo, um formulário de edição que
para um número decimal. Note que para já possui os dados populados, ou quando
a construção do formulário utilizamos as há um processo de validação e o usuário
tags do Struts <html:form> e <html:text>. é redirecionado ao mesmo formulário
O FormBean que representa este formulá- seguido dos erros encontrados.
rio terá dois atributos, um do tipo java.util.Date
e outro do tipo java.math.BigDecimal. Veja a Primeira parte da solução
Listagem 2; observe que não temos atri- Neste estágio, a aplicação ainda não fun-
cionará. Assim que o usuário preencher o Controller (veja links). Isso significa que e registrar os nossos converters (classes que
formulário e clicar em Enviar, receberá um ele possui um controlador que gerencia executam conversões de tipos, por exem-
erro. Isso acontece porque o Struts tenta o tratamento das solicitações, deixando plo, de String para Date). Para tal, iremos
converter os dados postados para os tipos para as Actions a responsabilidade de substituir, no arquivo web.xml, o servlet do
correspondentes no FormBean, e não con- responder à requisição e de definir o que Struts por um servlet nosso (que estende
segue. Por padrão o Struts não vem com os será retornado para o usuário. o do Struts): MeuStrutsServlet. Esse servlet
conversores corretos para BigDecimal e Date. O Front Controller do Struts é o servlet deve fazer tudo que o ActionServlet faz,
É aí que entra a nossa solução. org.apache.struts.action.ActionServlet, que está além de registrar os converters corretos
Você já deve ter ouvido falar que o configurado no arquivo web.xml. É justa- para Date e BigDecimal.
Struts implementa o design pattern Front mente neste servlet que podemos interferir A Listagem 5 mostra como fica nosso
servlet. Observe que apenas iremos rede-
Listagem 1. index.jsp: Página com o formulário de exemplo. finir o método init() e adicionar as linhas
<%@ taglib uri=”/tags/struts-html” prefix=”html” %> que registram os converters corretos,
<html:form action=”/PostFormularioAction”>
Data: <html:text property=”data” /><br />
e continuar chamando o método init()
Valor: <html:text property=”valor” /><br /> da superclasse. A Listagem 6 mostra a
<html:submit/>
</html:form> configuração do web.xml antes e depois
da substituição (apenas a parte alterada).
Listagem 2. FormBeanTeste.java: Classe que representa o formulário, com dois campos: um Date e outro BigDecimal.
Simplesmente trocamos a classe do servlet,
package br.com.jm.formbean; apontando para a nossa.
import java.math.BigDecimal; Vamos agora aos converters. Para o
import java.util.Date;
import org.apache.struts.action.ActionForm;
converter de data, utilizamos a classe
DateLocaleConverter do projeto Jakarta Com-
public class FormBeanTeste extends ActionForm {
private Date data; mons BeanUtils (veja links). Passamos
private BigDecimal valor; como parâmetros o locale e o formato da
//... Métodos get/set data que chegará ao converter. Neste caso,
}
usamos o formato “dd/MM/yyyy”.
Listagem 3. PerformPostAction.java: Action que apenas retorna para o formulário com o forward “sucesso”. Infelizmente, para o conversor de
package br.com.jm.action;
BigDecimal não podemos ainda utilizar
o BigDecimalLocaleConverter (também do
// … imports
BeanUtils), pois há atualmente uma
public class PerformPostAction extends Action {
incompatilidade entre esse conversor
public ActionForward execute(ActionMapping mapping, ActionForm form, e o Struts. Então, iremos criar a nossa
HttpServletRequest request, HttpServletResponse response)
throws Exception própria classe que implementa a inter-
{ face org.apache.commons.beanutils.Converter.
/* Neste ponto pode-se obter os valores enviados já com os tipos corretos,
/ por exemplo: Vamos chamá-la de BigDecimalConversor
*
* FormBeanTeste meuForm = (FormBeanTeste)form; (Listagem 7).
* Date dataEnviada = meuForm.getData(); A classe BigDecimalConversor terá um mé-
*/
return mapping.findForward(“sucesso”); todo converter() que receberá dois parâme-
}
}
tros: um java.lang.Object e o tipo de classe
para qual deverá converter o Object. Como
registramos o conversor para apenas o
Listagem 4. struts-config.xml: com a configuração de um FormBean e uma Action. tipo BigDecimal converteremos sempre para
<struts-config> esse tipo. Além disso, a implementação de
<form-beans>
<form-bean name=”formBeanTeste” type=”formbean.FormBeanTeste”/>
exemplo já faz o tratamento de exceções.
</form-beans> Se houver algum erro, um valor padrão
<action-mappings> poderá ser retornado.
<action path=”/PostFormularioAction”
type=”br.com.jm.action.PerformPostAction” name=”formBeanTeste”>
<forward name=”sucesso” path=”/index.jsp”/> Testando os conversores
</action>
</action-mappings> Agora que já temos os conversores pron-
</struts-config> tos, vamos fazer um teste. Rode a aplicação
em qualquer container web, como o Tom-
no FormBean para formatar estes dados <html:text> formate o conteúdo que irá duas abordagens. A primeira é criar uma
antes da exibição. Essa prática, no entanto, exibir. Para isso, iremos substituir a classe nova taglib, ou seja, um novo arquivo
não é recomendada, pois se repetirá para que implementa a taglib. .tld e uma nova classe que estende a tag
todos os formulários que trabalham com do Struts. Esta abordagem segue as boas
dados diferentes de strings, deixando o Aqui é importante lembrar que as taglibs são práticas de utilização do framework, pois
desenvolvimento mais lento e diminuin- configuradas em arquivos chamados tag library não altera nenhum arquivo original do
do a reutilização do código. descriptors (TLDs), que informam quais atributos Struts e deixa o código nas páginas JSP
a tag pode ter, além de indicar a classe que imple- mais légivel, já que utiliza uma taglib
Segunda parte da solução menta a tag. própria. É a abordagem indicada para
Chegamos à segunda parte da solu- aplicações que estão iniciando o processo
ção. Precisamos fazer com que a tag Para substituir a tag podemos adotar de desenvolvimento.
A segunda, e a que adotaremos aqui, é
apenas editar o arquivo struts-html.tld e
Listagem 6. Trecho do web.xml, antes e depois da substituição da Action.
substituir o nome da classe que implemen-
Antes da substituição ta a tag. Esta solução é indicada para apli-
<servlet-name>action</servlet-name> cações que já estão avançadas no processo
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class> de desenvolvimento, e em que um refac-
Depois da substituição toring de todas as JSPs que utilizam esta
taglib seria realmente muito custoso.
<servlet-name>action</servlet-name>
<servlet-class>br.com.jm.servlet.MinhaStrutsServlet</servlet-class> O arquivo struts-html.tld é utilizado para
configurar várias taglibs, por isso temos
Listagem 7. BigDecimalConversor.java: Converter personalizado para BigDecimal.
que fazer a alteração apenas na parte
package br.com.jm.converter;
referente à tag <html:text>. A Listagem 8
import java.math.BigDecimal; mostra o trecho relevante do arquivo de
import java.text.DecimalFormat;
import java.text.ParseException; configuração antes e depois da mudança.
import java.util.Locale; Note que alteramos a linha onde está
import org.apache.commons.beanutils.ConversionException; a definição da classe: o nome da classe
import org.apache.commons.beanutils.Converter;
muda de org.apache.struts.taglib.html.TextTag
public class BigDecimalConversor implements Converter { para br.com.jm.taglib.MinhaTextTag.
private Locale locale;
private BigDecimal valorPadrao; A Listagem 9 mostra a classe da nossa taglib,
private boolean useValorPadrao;
que estende org.apache.struts.taglib.html.TextTag
public BigDecimalConversor(Locale locale, BigDecimal valorPadrao, e redefine formatValue(). Este método será
boolean useValorPadrao)
{ chamado antes da exibição do conteúdo e
this.locale = locale; tem implementação simples. Verificamos
this.valorPadrao = valorPadrao;
this.useValorPadrao = useValorPadrao; o objeto que é passado como argumento,
}
e caso seja uma instância de BigDecimal, solução para a sua aplicação levando em 3. E por último, no momento da exibição,
fazemos a formatação utilizando a classe conta a legibilidade do código e a facilidade a taglib formatou os dados exatamente
java.text.DecimalFormat. Mais uma vez, o pa- de manutenção da sua aplicação. como haviam sido digitados.
râmetro Locale(“pt”, “BR”) é utilizado. Já se o
objeto passado for do tipo Date, formatamos Testando a solução Dessa maneira, seus FormBeans poderão
para o padrão de exibição desejado, nesse Vamos testar a solução completa. Reini- ter atributos mapeados para qualquer
caso “dd/MM/yyyy”. cie a aplicação e digite os mesmos dados classe Java, desde que você registre um
Esta segunda abordagem que apenas que usamos na primeira vez, como já mos- conversor responsável para ela e estenda
substitui o nome da classe no arquivo trado na Figura 1. Após clicar no botão as taglibs. Essa mesma solução se aplica
struts-html.tld, pode, em uma fase de manu- Enviar, o formulário deverá aparecer com também para formulários dinâmicos (os
teção, deixar os desenvolvedores um pouco os dados formatados corretamente. DynaActionForms).
confusos, já que praticamente escondemos Note que três coisas aconteceram durante
a nova configuração e a criação da nova o processamento da requisição: Conclusões
taglib. Por outro lado, pode ser a salvação 1. O St r uts conver teu os dados e Neste artigo, vimos como registrar con-
para aqueles que já possuem milhares de configurou o FormBean; verters personalizados no Struts e como
JSPs e não querem ter de alterá-los caso 2. A Action redirecionou o usuário para formatar formulários para exibição ou
seja criada uma nova tag. Analise a melhor o mesmo formulário; edição. Uma solução mais rica poderia
aceitar a configuração dos converters via
XML. Dessa forma, parâmetros do sistema,
Listagem 8. struts-html.tld, antes e depois da substituição da classe que implementa a tag.
como o padrão de formatação da data, não
Antes da substituição estariam diretamente no código, e sim num
<tag>
<name>text</name> resource da aplicação. E possivelmente
<tagclass>org.apache.struts.taglib.html.TextTag</tagclass>
...
teríamos apenas um objeto java.util.Locale
</tag> instanciado por sessão do usuário.
Depois da substituição
<tag>
<name>text</name> struts.apache.org
<tagclass>br.com.jm.taglib.MinhaTextTag</tagclass>
... Framework Apache Struts: downloads e
</tag> documentação.
Listagem . MinhaTextTag.java: Classe que substituirá a implementação da taglib Text do Struts. jakarta.apache.org/commons
package br.com.jm.taglib;
Jakarta Commons, componentes reutilizáveis para
vários fins.
// … imports
java.sun.com/developer/technicalArticles/
public class MinhaTextTag extends TextTag{
public MinhaTextTag(){ Intl/IntlIntro/
super(); Uma visão geral sobre internacionalização
this.type = “text”;
doReadonly = true;
}
java.sun.com/blueprints/corej2eepatterns/
Patterns/FrontController.html
protected String formatValue(Object value) throws JspException {
Locale locale = new Locale(“pt”,”BR”); Sobre o design pattern Front Controller
if(value instanceof BigDecimal){
try{ javamagazine.com.br/downloads/jm38/
DecimalFormat formatter = jm-strutsconverters.zip
(DecimalFormat) DecimalFormat.getInstance(locale);
return formatter.format(value);
} catch(Exception e){
return super.formatValue(value); Ari Dias Neto
} ([email protected]) é con-
}
if(value instanceof Date){ sultor Java/JEE com experiência
try{
SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”);
de mais de sete anos em tecnogias
return sdf.format(value); para web. Atualmente atua em projeto
} catch(Exception e){
return super.formatValue(value);
internacional para IBM e tem certificações SCJP, SCWCD,
} EA(I) e de Borland CaliberRM.
}
return super.formatValue(value);
}
}
Na contratação de um Plano de Hospedagem* você tem: Blog Gratuito • E-mails LocaMail com antivírus e anti-spam • Completo painel de controle
• Suporte às linguagens ASP**, .NET 2.0, JSP e Servlets***, PHP 5***, PERL, Python***, C,C++***, Ruby on Rails***, PERL/CGL, XML, WML/WAP
• Diversos componentes para ASP e .NET • Relatórios de visita em português • Certificado seguro com SSL • Banco de dados Access**, MySQL
5.0*** e PostgreSQL 8.1*** • Podcast • Backup diário incluso • Garantia de disponibilidade de 99,5%
E ainda pode contratar serviços adicionais à hospedagem como: comércio eletrônico, banco de dados MS SQL Server, Oracle compartilhado, MySQL
para Windows, MySQL adicional para Linux, domínios e pacotes de e-mails adicionais e muito mais.
*Para mais detalhes e complementação de condições, consulte o modelo de contrato disponível no site www.locaweb.com.br **em Windows ***em Linux