PDF Java Magazine Ediao 038 DL - PDF
PDF Java Magazine Ediao 038 DL - PDF
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
s
e CAFEÍNA
õ
ç
LEONARDO GALVÃO
Aprendendo programação OO com Greenfoot; Shale
08
e
e Tapestry top-level; novos Groovy, Geronimo e WTK
S
e
l
g AJAX FÁCIL COM GOOGLE WEB TOOLKIT
o
o 64
DOUGLAS JOSÉ RODRIGUES
Conheça as tecnologias e ferramentas do Google que tornam
MAIS RELATÓRIOS PASSO A PASSO
a ANA ABRANTES E YARA SENGER 36
p
Definindo agrupamentos, calculando totais em vários níveis
e criando gráficos de resumo – com JasperReports e iReport
a
C
DATAS NO DESKTOP
FERNANDO LOZANO
Manipulação de datas em aplicações Swing usando componentes de
12
p calendário do projeto NachoCalendar, e conceitos sobre JavaBeans e MVC
o
t
k
s
GUI S COM QUALIDADE, PARTE 1
e 44
HUGO VIDAL TEIXEIRA
Técnicas e boas práticas para o projeto de interfaces gráficas e
W
e
s PROJETO CALLISTO
p
i 56
l
FERNANDO LOZANO
c
Detalhes sobre o novo projeto da Fundação Eclipse, que simplifica a
instalação de dez plug-ins fundamentais do Eclipse.org
E
jm38.indb 3 17/7/2006 14:09:05
Direção
Ano V • Edição 38 • 2006 • ISSN 1676-8361
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 est ende
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
Publicidade desktop, como características dos JavaBeans e o modelo MVC no Swing.
[email protected] , 21 2213-0940
Na edição anterior, o artigo “10 Mais do Eclipse 3.2” colocou na primeira posição o
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 deta lhes 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 garanti r 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
Realização
aplicações.
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 ( jakar ta.ap ache.o rg/comm ons/d bcp ). 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 Ap licada”), 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 da s
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-
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
d
C O
CD encartado nesta edição in-
clui três produtos completos da
Oracle, que são especialmente
descompactar, será pedida a senha for-
necida no passo anterior. Isso conclui a
instalação. Para inicializar o JDeveloper
n o
ú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
a
çã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
r
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
o
do SGBD da Oracle. execução (veja a Figura 2); nela você define
l
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
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
x
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
E
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ági na, 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 jde v1013 .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 logi n “sys-
tem” e a senha definida na in stalação. A página inicial
de administração será exibida (veja a Figura 5).
Edição 38 •38 Java
Edição • Java
Magazine 11 11
Magazine
Datas no Desktop
Usando Componentes Swing para Manipular
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
mendada para os usuários do NachoCalendar e java -jar %N ACHO%\l ib\nach ocalendar- 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/ nachocalend ar-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 DatePanel s 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 lin ha 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.
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(“Esc olha 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();
}
getContentPane().add(BorderLayout.NORTH,
Exemplo de exibição de calendário new JLabel(“Calendário Swing”));
A Listagem 3 apresenta um exemplo de datePanel = new DatePanel();
datePanel.setRenderer(dayRenderer);
uso do DatePanel, que simplesmente exibe
um calendário para o mês corrente. getContentPane().add(BorderLayout.CENTER, datePanel);
pack();
Observe que a janela pode ser redimen- }
sionada, e que o calendário será redimen-
//...método main omitido
sionado proporcionalmente (mas note }
que o tamanho de fonte utilizado não irá
Listagem 5. EscolheVariasDatas.java – como lidar com seleções múltiplas em um DatePanel
aumentar para compensar o aumento da
área do calendário). A Figura 3 ilustra a //...imports omitidos
aparência deste exemplo, após um peque- public class EscolheVariasDatas extends JFrame {
no aumento da janela. private DatePanel datePanel;
Caso a aparência padrão do calendário public EscolheVariasDatas() throws Exception {
não lhe agrade, o DatePanel fornece uma //...inicialização do JFrame e do DatePanel omitida
forma poderosa de customização que é datePanel.addChangeListener(dataAlterada);
bem coerente com outros componentes
getContentPane().add(BorderLayout.CENTER, datePanel);
Swing sofisticados, por exemplo o JTable. pack();
Em vez de definir muitas propriedades que }
alteram o aspecto visual do componente, é private ChangeListener dataAlterada = new ChangeListener() {
definida uma interface de renderer (renderi- public void stateChanged(ChangeEvent e) {
Object[] datas = datePanel.getValues();
zador) para cada parte. Por exemplo, existe DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String listaDatas = “”;
o net.sf.nachocalendar.components.DayRenderer, for (Object d : datas)
que é o responsável pela exibição de cada listaDatas += df.format(d) + “\n”;
célula de mês no calendário. JOptionPane.showMessageDialog(EscolheVariasDatas.this,
São fornecidas pelo NachoCalendar “As datas escolhidas foram:\n” + listaDatas,
“Datas alteradas”, JOptionPane.INFORMATION_MESSAGE);
várias implementações de DayRenderer, em }
especial o DefaultDayRenderer, que é uma };
subclasse do JLabel do Swing. É possível //...método main omitido
mudar a aparência do renderizador da }
mesma forma que se faz com um JLabel
padrão, por exemplo adicionar uma bor-
da. A Listagem 4 ilustra como fazer esta and-feels personalizados, um renderizador deve valos de datas utilizando Shift+clique ou
customização simples, que tem o efeito de evitar fixar cores como foi feito no exemplo. Em então várias datas não-contíguas utilizan-
inserir “linhas de grade” no calendário. O vez disso, deve usar preferencialmente alguma cor do Ctrl+clique, da mesma forma que se
resultado pode ser visto na Figura 4. dependente do ambiente do usuário, por exemplo faz com JList e JTables. Na verdade, a con-
O mesmo modelo da Listagem 4 pode uma das definidas na classe java.a wt.SystemColor . figuração padrão de um DatePanel permite
ser utilizado para mudar a fonte e as co- No exemplo, em vez de Color.LIGHT_GRAY poderia seleções múltiplas desse tipo.
res de texto e de fu ndo, bem como outros ser utilizado SystemColor.control . Para se restringir a seleção a uma
atributos da exibição do calendário. Caso única data, ou a uma única faixa de
se deseje modificar os cabeçalhos com os datas contíguas, deve ser chamado
dias da semana, deve ser fornecido um Seleção de múltiplas datas o método setSelectionMode() do objeto
HeaderRenderer, que é similar ao DayRenderer. Com um DateField, não se pode selecionar DateField . Este método pode receber uma
múltiplas datas no calendário. Mas com de três constantes definidas na interface
Para manter a compatibilidade com look- um DatePanel, é possível selecionar inter- net.sf.nachocalendar.model.DateSelectionModel ,
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 s eguir 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 .BeanInf o. 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
Usando o Business Intelligence and Reporting
ideal para usuários de outros IDEs. Baixe pulação de dados para o Derby e para o MySQL 2 , 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 repetida mente
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 possu i um bot ão “Manage Drivers”, que Data Set.
O projeto permite cadastrar odriver 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 Uma última
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
arquivos-texto (formato CSV), que podem ser importados
coluna do resul-
com facilidade em muitos SGBDs, por exemplo com o tado, o seu Dis-
Oracle SQL*Loader. pl ay Na me (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.
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 ex pressã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 u m 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 plataf orma 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 especia is de
não permitiria implementar cálculos mais
mentas que possam se beneficiar de scripts, integração, como reusar métodos de al guma
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 scri pt.
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 9. 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;
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-
so a Passo agrupamentos
agrupament os e calcular
totais em vários níveis,
num relatório mestre-
detalhe, e como criar
gráficos de resumo
r Reports
ANA ABRANTES E YARA SENGER
Magazine • Edição 38
38 Java Magazine
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 ( jf ree.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.
HUGO VIDAL TEIXEIRA
Técnicas de
nosso estudo analisando alguns dos
principais erro s cometidos no projeto de
GUIs. Em seguida veremos técnicas de
organização de informações e de redução
projeto visual
de poluição gráfica, entre outras.
Figura 3. Excesso de bordas no painel à esquerda em contraste com a simplicidade do painel à direita.
Usando o FormLayout
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, exigi ndo 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();
panel.add(new JLabel(“Nome:”), cc.xy (1, 1));
componentes estejam alinhados à direita.
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 taman ho
} 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.
2
o
S G
E
A
D
T A
O
3
o
coleção!
ã ã ã
ç ç ç
i i i
d d d
E E E
A
D
T A
O
S G
E 3
0 1 2
9 1 1 1 1
o o o o o
ã ã ã ã ã
ç ç ç ç ç
i i i i i
d d d d d
E E E E E
- Java no Governo - Códigos no Eclipse - Tutorial de NetBeans - Eclipse para Web - Relatórios Corporativos
- Apache FOP - New I/O Fundamental - API New I/O (java.nio) - Fome Zero com Java - Gráficos com Java 2D
- JSTL – Guia Completo - Game API - Cesta de compras com Struts - Tags Customizadas em JSP 2.0 - Java.net na Prática
- Cocoon Inicial - Criando Plug-ins para Eclipse - Testes de carga com JMeter - Tiger: A Evolução do Java - Raio-X do Tiger
- Pacotes WAR e JAR - Preferences API - Concorrência e a JVM - Dicas para Web - Paginação na Web
9
1
o
ã
ç
0
2
o
ã
1
2
o
ã
ç
2
2
o
ã
ç
3
2
o
ã
ç
i ç i i i
d i d
d d
E d E E E
E
www.javamagazine.com.br devmedia.com
jm38.indb i 54 i l i 17/7/2006 14:12:50
A A A
D D D
T A T A T A
O O O
S G
E S G
E S G
E
4 5 6 7 8
o o o o o
ã ã ã ã ã
ç ç ç ç ç
i i i i i
d d d d d
E E E E E
- 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
- Expressões regulares no J2SE 1.4 - Memória e desempenho - Jakarta Velocity - Validação na Web
A
D
T A
O
S G
E
4 5 6 7 8
1 1 1 1 1
o o o o o
ã ã ã ã ã
ç ç ç ç ç
i i i i i
d d d d d
E E E E E
Java 5 Impressão Java Content Repository Caches e JDBC NetBeans JavaOne
• • • • •
Imprimindo com Java
ConheçaduasAPIsde impressãodo
J2SEeobtenha controlefino
sobrelayoute formatação
Gerência deConteúdo
Edição24-AnoIII-R$9,90
Detalhessobrea NovíssimaAPI
JCRea CriaçãodeRepositórios
deConteúdona Web
Uma Aplicação Java Tira-DúvidasEspecial
CacheseDAOscom JDBC,Usando
Completa com NetBeans
Partefinal–AcessoaBanco
JVMsAlternativas,Relatóriose
DriblandoRestrições
deDadoseGerênciade
daMáquina
PreferênciasdeUsuários
Java:
Futuro
Presente
4
5 6 7
& 8
2
2 2 2 JavaOne 2005 2
o Grandesnovidadesem
ã o o o produtoseAPIs,planos e Migrando para o Java 5 o
ç ã ã ã comemoraçõesnoevento Conheça na prática eem detalhes ã
i ç ç ç mundialda tecnologia Java como,porqueequando fazero ç
i i i i
d upgradepara o J2SE 5.0
E d d d d
E E E E
- 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
4
3
5
3
6
3
7
3
Leia uma vez,
o
ã
ç
i
o
ã
ç
i
o
ã
ç
i
o
ã
ç
i
use em todos
d
E
d
E
d
E
d
E os lugares
- 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
- Aspectos no Mundo Real - Java ME no Eclipse - Logging no Java SE - Testes com mock objects
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 Ecl ipse
SDK 3.2) para a sua plataforma específica.
Depois deve-se abrir o Update Manager
da plataforma ( Hel p|Soft war e Upd ate s
>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 Calli sto.
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. também que serã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”.
API
sultas ao Google
de busca que revolucionou
a internet dentro de suas
aplicações Java, e conheça
técnicas avançadas de pesquisa
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 atravé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 (lin ux).(-(countryUS|countryUK)) Resultados do tópico li nux 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.Go ogl eSea rchD emo 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/cheatshee t.html ou em Por exemplo (em uma linha): Uberlândia, na área de Inteligência Artificial.
googleguide.com/advance d_ ope rators _refe -
rence.html.) java -cp c:\Java \Goog leAPI\ googlea pi.jar; .
jm.Google SearchDemo 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
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
1.0.21 do GWT; o pacote é emulação Java Bibliotecas
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- para JavaScript Local
Ferramentas
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 é i mplemen-
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
e java.util . Estas duas bibliotecas
java.lang 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
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 t ipos 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”> e continuar chamando o método init()
Data: <html:text property=”data” /><br />
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-
{
/* Neste ponto pode-se obter os valores enviados já com os tipos corretos,
face org.apache.commons.beanutils.Converter.
/ 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.Objec t 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 cl asse 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, é
Listagem 6.Trecho do web.xml , antes e depois da substituição da Action.
apenas editar o arquivo struts-html.tld e
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.Mi nhaTextTag.
private Locale locale;
private BigDecimal valorPadrao; AListagem9 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 Struts converteu 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.Loc ale
</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 9. 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{ de mais de sete anos em tecnogias
SimpleDateFormat sdf = new SimpleDateFormat(“dd/MM/yyyy”);
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);
}
}