Java Magazine - Edição 039 PDF
Java Magazine - Edição 039 PDF
Especial
JGoodies Binding
Ligue componentes grficos a objetos
de negcio mantendo a abstrao OO
JavaMail Aplicado
Criando uma mala direta em HTML
com anexos, fazendo personalizao
atravs de expresses regulares
Dicas na Web
Recapitulando tcnicas essenciais
na programao com servlets e JSPs
JAVA EE 5
jm39.indb 1
Explorando a Plataforma
jm39.indb 2
15/8/2006 18:11:30
Contedo
CAFENA
06
Sees
10
JAVA EE 5
OSVALDO PINALI DOEDERLEIN
Capa
Explorando a nova verso do Java corporativo: anotaes, injeo de dependncias, novas JSRs e um exemplo prtico usando o servidor open source GlassFish
16
PERSISTNCIA NO JAVA EE 5
ANDR DANTAS ROCHA E SRGIO OLIVEIRA KUBOTA
Aprenda a utilizar a nova Java Persistence API, de conceitos de mapeamento
objeto-relacional, a um exemplo completo usando Toplink Essentials e MySQL
28
38
Desktop
Web
Utilize a API JavaMail para enviar e-mails em HTML com anexos para mltiplos
destinatrios, e personalize mensagens usando expresses regulares
jm39.indb 3
62
70
50
15/8/2006 18:12:15
Esp a
Direo
Diretor Editorial Leonardo Galvo
Diretor de Marketing Gladstone Matos
Diretor Comercial Casseano Filho
Edio
Publisher e Editor-Chefe
Leonardo Galvo ([email protected])
Editores-Adjuntos
Fernando Lozano ([email protected])
Osvaldo Doederlein ([email protected])
Colaboraram nesta edio
Ana Abrantes, Andr Dantas Rocha, Andr Lus Monteiro,
Ari Dias Neto, Fernando Lozano, Hugo Vidal, Leonardo Galvo,
Osvaldo Doederlein, Srgio Kubota, Yara Senger
Arte
Diretor de Arte Tarcsio Bannwart ([email protected])
Diagramao Jaime Peters Junior, Lais Pancote e Tersis Zonato
Ilustraes Felipe Machado e Francisco Peixoto
Capa Felipe Machado
Produo
Gerncia de Marketing Kaline Dolabella
Distribuio
Fernando Chinaglia Distribuidora S.A.
Rua Teodoro da Silva, 907, Graja - RJ
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362
Atendimento ao leitor
A DevMedia possui uma Central de Atendimento on-line, onde voc pode
tirar suas dvidas sobre servios, enviar crticas e sugestes e falar com um
de nossos atendentes. Atravs da nossa central tambm possvel alterar
dados cadastrais, consultar o status de assinaturas e conferir a data de envio
de suas revistas. Acesse www.devmedia.com.br/central, ou se preferir
entre em contato conosco atravs do telefone 21 2283-9012.
Edies anteriores
Adquira as edies anteriores da revista Java Magazine ou de qualquer outra
publicao do Grupo DevMedia de forma prtica e segura, em
www.devmedia.com.br/anteriores.
Publicidade
[email protected], 21 2213-0940
Anncios Anunciando nas publicaes e nos sites do Grupo DevMedia,
voc divulga sua marca ou produto para mais de 100 mil desenvolvedores
de todo o Brasil, em mais de 200 cidades. Solicite nossos Media Kits, com
detalhes sobre preos e formatos de anncios.
Reprints Editoriais Se foi publicado na Java Magazine um artigo que
possa alavancar as suas vendas, multiplique essa oportunidade! Solicite a
reimpresso da matria junto com a capa da edio em que saiu, e distribua
esse reprint personalizado entre seus clientes.
Encarte de CDs Faa como nossos maiores anunciantes. Encarte um CD
com uma amostra de seus produtos na Java Magazine e atinja um pblico
segmentado e formador de opinio.
Realizao
Apoio
Boa leitura!
Parceiros
Leonardo Galvo
jm39.indb 4
15/8/2006 18:12:21
p ao do Leitor
Dilogos modais para a rea de trabalho
SOA
Sou assinante da Java Magazine e gostaria
primeiramente de parabeniz-los pela excelente
qualidade do material apresentado. Tambm
gostaria de saber de vocs se h possibilidade de
publicar na revista um artigo falando sobre SOA e
web services, visto que o assunto cada vez mais
comentado na comunidade Java.
Michel Pires da Silva
Web Services e SOA (Service-Oriented Architecture) foi um dos assuntos de capa da Java
Magazine 34. O artigo de Osvaldo Doederlein
cobriu desde as tecnologias precursoras dos web
services como RPC, at o atual enfoque na criao
de arquiteturas orientadas a servios.
Java EE 5
Gostaria de ver as novidades do Java EE 5 nas
prximas edies. Afinal de contas, a especificao
j foi aprovada, e a Java Magazine sempre nos
apresenta as novidades em primeira mo.
Michel Zanini
Esta edio atende ao seu pedido! Alm de
um artigo fornecendo uma viso geral da nova
plataforma destacando as principais mudanas,
voc ver uma matria sobre uma das mais
Ferramentas
Parabenizo a Java Magazine pelas excelentes
edies. Sou iniciante em Java e uma das grandes
dificuldades para um iniciante , alm de aprender
a linguagem, saber utilizar as ferramentas existentes. E a Java Magazine sabe nos mostrar como
utilizar essas ferramentas de forma muito didtica,
o que facilita bastante a vida dos iniciantes.
Rubens Renato Lima
Participe!
Envie sua dvida,
comentrio, correo ou
sugesto, com nome completo, cidade e
estado, para:
[email protected]
Cartas publicadas podem ser editadas por
motivos de clareza ou extenso.
jm39.indb 5
15/8/2006 18:12:31
Cafen
News & Bits
15/8/2006 18:12:40
n a
Leonardo Galvo
TestNG 5.0
O framework de testes TestNG o principal
concorrente do JUnit, e se posiciona como
uma alternativa mais capaz e mais moderna
(NG uma abreviao de New Generation).
Primeiro framework de testes a suportar
anotaes (mesmo antes do Java 5), o TestNG inclui suporte a mtodos dependentes
e parmetros, distribuio de testes e testes
orientados a dados.
O TestNG segue um modelo de execuo que
dispensa o uso do tradicional TestSuite e traz
o BeanShell embutido. H tambm plug-ins
para vrias ferramentas, entre elas o Eclipse e
o Apache Maven. A verso 5.0 tem melhorias
importantes nos relatrios de testes gerados,
com uma estrutura mais organizada e mudanas visuais. Outro destaque o trabalho com
stack traces, que agora podem ser mostrados
interativamente nos relatrios HTML, sendo
possvel tambm filtr-los. testng.org
Subversive 1.0.0
polarion.org.
LimpidLog
A n ov a API d e l o g g i n g o p e n s o u rce
jahia.org.
acelet.com/limpidlog.
classes e arquivos.
15/8/2006 18:12:41
Cafena Especial
Fernando LoZano
15/8/2006 18:12:48
Listagem 1. Arquivo javaw.exe.manifest que permite a aplicaes SWT assumirem a aparncia nativa do Windows XP
<?xml version=1.0 encoding=UTF-8 standalone=yes?>
<assembly xmlns=urn:schemas-microsoft-com:asm.v1 manifestVersion=1.0>
<assemblyIdentity version=1.0.0.0
processorArchitecture=X86
name=SWT.javaw
type=win32/>
<description>Standard Widget Toolkit</description>
<dependency>
<dependentAssembly>
<assemblyIdentity type=win32
name=Microsoft.Windows.Common-Controls
version=6.0.0.0
processorArchitecture=X86
publicKeyToken=6595b64144ccf1df
language=*/>
</dependentAssembly>
</dependency>
</assembly>
15/8/2006 18:12:56
Recapi t
Dicas na
Web
N
Nesta edio,
recapitulamos um dos
assuntos mais populares
na Java Magazine: o
desenvolvimento com JSP e
servlets. Foram selecionadas
quatro dicas, ainda
totalmente atuais, do artigo
Dicas na Web publicado
na Edio 12, que resolvem
dvidas comuns e exploram
detalhes importantes da
programao web com Java.
Definindo o nome do
arquivo em downloads
Um uso comum para servlets (e mesmo
para pginas JSP) a gerao dinmica de
arquivos, tais como planilhas ou documentos
PDF. Nessas situaes, ao enviar o arquivo
gerado, preciso que o servlet especifique
o tipo do contedo atravs do mtodo
response.setContentType(String tipo). O tipo segue
no cabealho da resposta HTTP retornada pelo
servlet e, de acordo com ele, o navegador poder decidir o que fazer com o arquivo.
Normalmente o arquivo exibido atravs
de um plug-in, ou oferecida a opo de
salv-lo no disco, mas nos casos onde a in-
ServletContext sc = pageContext.getServletContext();
String servidor = sc.getServerInfo();
String versaoServlet = + sc.getMajorVersion() + .
+ sc.getMinorVersion();
String versaoJsp = JspFactory.getDefaultFactory().
getEngineInfo().getSpecificationVersion();
%>
15/8/2006 18:13:03
i tulando
teno que o usurio faa o download, esse
procedimento traz alguns problemas:
No garantido que o usurio tenha a
opo de salvar o arquivo em vez de o navegador abrir automaticamente um plug-in.
Mesmo que o navegador web oferea a
opo de salvamento, o nome sugerido ser
o do servlet ou o da pgina JSP (por exemplo,
contador.jsp), sendo que o ideal seria um
nome mais amigvel, ou ao menos com a
extenso correta (como "contador-10.txt").
Para resolver esses problemas, a soluo
definir a propriedade content-disposition do
cabealho da resposta HTTP, com o valor
attachment;filename=nome.extenso, como no
trecho de cdigo a seguir:
Forward ou redirect?
Uma necessidade muito comum na programao web passar o fluxo de execuo
1
RFCs (Requests for Comments) so documentos que
definem protocolos, modelos ou especificaes para os
sistemas da internet. De forma ampla, representam para
a internet o que os JSRs (Java Specification Requests) so
para Java.
Forward
A primeira forma usa o mtodo forward()
da classe RequestDispatcher, como mostra o
cdigo da Listagem 3.
response.setHeader(
content-disposition,
attachment;filename= + nomeArquivo
);
Felipe Leme
%>
Em servlets:
RequestDispatcher dispatcher =
getServletContext().getRequestDispatcher(/novaPagina.jsp);
dispatcher.forward(request, response);
jm39.indb 11
11
15/8/2006 18:13:04
Redirect
A segunda forma de passar o fluxo de execuo para outra pgina consiste em usar o
mtodo sendRedirect() da classe HttpResponse,
enviando com isso um comando HTTP SEND
REDIRECT para o navegador web. Nesse caso
a requisio volta para o navegador, que
automaticamente faz a requisio da pgina
especificada (que no precisa estar localizada no mesmo servidor). A Figura 3 ilustra o
procedimento.
Comparando as tcnicas
A Tabela 1 mostra as demais diferenas
entre cada opo, e a Listagem 4 contm
uma pgina JSP com exemplos das duas
tcnicas. Note que, em ambos os casos,
se o buffer de resposta j tiver recebido
alguma sada, a tentativa de mudar o fluxo
de execuo lana uma IllegalStateException.
Assim, recomendvel que chamadas a
forward () ou a sendRedirect() sejam feitas
no comeo do cdigo principal do servlet
(doPost(), doGet() etc.), antes de qualquer
RequestDispatcher.forward()
Response.sendRedirect()
15/8/2006 18:13:06
13
15/8/2006 18:13:12
class=jm.dicas.EntradaDadosBean
scope=session>
<jsp:setProperty name=beanEntrada property=*/>
</jsp:useBean>
<form>
Nome:
seria equivalente a:
Object meuBean = (Object) pageContext.getAttribute(
meuBean, PageContext.SESSION );
if (meuBean == null) {
throw new InstantiationException(
bean meuBean not found within scope);
}
2
O cdigo mostrado aqui parecido com o gerado pelo
compilador JSP, porm simplificado: alm do tratamento
de excees ter sido omitido, os objetos foram instanciados atravs do operador new, enquanto que o compilador
JSP usa java.beans.Beans.instantiate().
15/8/2006 18:13:17
Assim que a pgina acessada, o bean instanciado, porm nenhuma propriedade setada (j que no foram passados parmetros
requisio).
Felipe Leme
([email protected])
Engenheiro de Computaco pela
UNICAMP, membro atuante das
comunidades Java brasileira e mundial,
tendo publicado artigos em revistas tcnicas e sites
internacionais e palestrado nas principais conferncias
sobre Java, alm de participar como expert no JCP e
ser committer em projetos da Apache. Atualmente
Diretor Tcnico da Voxblue (voxblue.com)
e instrutor da Globalcode.
15
15/8/2006 18:13:19
Byte Code
Java EE 5
15/8/2006 18:13:45
Complexidade escalvel
detalhe sobre APIs e funcionalidades especficas, o que seria pouco vivel devido
extenso da plataforma. Esta necessidade
ser melhor servida por artigos futuros especializados em temas como JPA (coberto
nesta edio), EJB etc. Aqui nosso objetivo
fornecer uma viso conceitual. Mas agora
assumimos que o leitor j possui familiaridade bsica com a plataforma J2EE. Assim,
podemos enfocar as novidades, e analisar
e discutir a natureza e as motivaes por
trs de cada mudana dessa atualizao
que pode mudar radicalmente sua rotina
de desenvolvimento de aplicaes Enterprise Edition. E para comear uma
explorao prtica, o quadro GlassFish:
o Java EE open source mostra como
instalar a implementao de referncia
(RI) desta plataforma, e desenvolver uma
aplicao Java EE 5 simples com o IDE
NetBeans 5.5.
jm39.indb 17
1
15/8/2006 18:13:53
Java EE 5
Injeo de Dependncias
A persistncia de POJOs, no estilo do
Hibernate, tem chamado ateno como
a grande novidade que o Java EE 5 pega
emprestada de outros frameworks. Mas
no menos importante a Injeo de Dependncias (ID). Para compreender a idia
fundamental da ID, podemos classificar as
1
Plain Old Java Objects, algo como bons e velhos objetos Java. uma definio por excluso: objetos que no
so obrigados a herdar/implementar nenhuma interface
imposta por uma API. Tambm se usa POJI para interfaces
que no precisam herdar nenhuma outra interface. Um
framework que suporta POJOs, no lugar de herana, utiliza mecanismos mais fracamente acoplados, como anotaes ou arquivos de configurao, para interagir com
seus objetos.
2
A exceo fica por conta de casos simplistas como os
listeners da AWT/Swing, ex.: MouseListener, acompanhados
por classes adapter, como MouseAdapter, que facilitam a
criao de inner classes que implementam somente um
dos mtodos exigidos por listeners que agrupam vrios
eventos. Como tratadores de eventos so simples e raramente se beneficiariam de herana de implementao,
nestes casos no faz mal usar a herana nica para derivar do adapter. O mesmo no pode ser dito de EJBs que
implementam complexas regras de negcio.
15/8/2006 18:13:54
Por essas e outras, os nicos desenvolvedores que acham o EJB simples costumam
ser aqueles que j utilizaram geraes anteriores de componentes distribudos, como o
COM/COM+ da Microsoft ou o CORBA da
OMG. H justificativas para expor algumas
das etapas que descrevemos, mas nem sempre. Por exemplo, nunca entendi a utilidade
da interface Home para Stateless Session
Beans, que s podem ter um mtodo create(),
sem parmetros e cujas invocaes retornam sempre a mesma referncia.
Mais grave nos obrigar a escrever
cdigo que quase nunca necessrio.
Por exemplo, quanta gente trata excees
como NamingException, com um cdigo de
recuperao de falha especfico a cada
local de ocorrncia? Quase ningum; o que
todo mundo faz tratar de forma genrica
estas excees, talvez encapsulando-as em
outra exceo que o framework utilizado
sabe tratar (como uma ServletException para
aplicaes web). Da o framework se encarrega da exceo, cancelando a operao
em andamento, roteando a GUI para uma
pgina de erro configurvel, etc. Mas se
para deixar que o framework ou o container trate excees, no deveramos ter
que escrever centenas de blocos try/catch
exatamente iguais, nem saber que existe
a NamingException! Alis, nem deveramos
precisar lidar com a JNDI, ou as interfaces
Home, exceto em casos excepcionais.
Listagem 1. Cdigo de exemplo numa Web Application J2EE que acessa um servidor EJB.
public class LoginAction extends DispatchAction // usando Struts
protected LoginServer loginServer;
protected synchronized LoginServer lookupLoginServer ()
throws ServletException
{
if (login == null) try
{
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup(ejb/session/LoginServer);
LoginServerHome home = (LoginServerHome)
PortableRemoteObject.narrow(obj, LoginServerHome.class);
loginServer = home.create();
}
catch (final NamingException e) { throw new ServletException(e); }
return login;
}
public ActionForward doLogin (final ActionMapping mapping, final ActionForm form,
final HttpServletRequest request, final HttpServletResponse response)
throws ServletException
{
LoginServer loginServer = lookupLoginServer();
LoginForm f = (LoginForm)form;
boolean ok = loginServer.login(f.getUser(), f.getPassword());
// ... etc.
}
}
19
15/8/2006 18:13:54
Tutorial
Java EE 5
GlassFish:
O Java EE 5
open source
15/8/2006 18:15:03
import javax.ejb.EJB;
package aloee;
import javax.ejb.Remote;
@Remote public interface AloRemote {
String alo ();
}
package aloee;
import javax.ejb.Stateless;
@Stateless public class AloBean implements aloee.Alo {
public String alo () {
return Al, Java EE 5!;
}
}
<html>
<head>
<title>Al, Mundo</title>
</head>
<body>
<f:view>
<h:outputText value=#{Alo.alo}/>
</f:view>
</body>
</html>
21
15/8/2006 18:15:11
Java EE 5
Os componentes do Java EE 5
Nada menos que 21 JSRs separadas, que
podemos ver na Tabela 1, contribuem
diretamente para o Java EE 5. Novas funcionalidades so poucas, mas importantes:
a Java Persistence API (que sucede os EJB/
CMP) a nica API totalmente nova. Alm
disso, temos a incorporao de APIs anteriormente independentes, como a StAX e
a JAXB, e atualizaes de muitas outras. A
mudana mais sensvel ao programador,
que a introduo de anotaes para facilitar o uso de muitas APIs, d uma cara
de novidade, mas por si s no cria novas
funcionalidades s permite fazer com
anotaes as mesmas coisas que podamos
e continuamos podendo fazer invocando
as APIs tradicionais.
Verses do Java EE e SE sempre compartilham algumas novas APIs, e cada verso
do Java EE depende da verso anterior
mais recente do Java SE, ambas tradicionalmente compartilhando o mesmo nmero.
O Java EE 5 depende do Java SE 5. Mas as
verses subseqentes do Java SE sempre
incorporam algumas APIs introduzidas
inicialmente no Java EE. O Mustang (Java
SE 6) um exemplo disso, integrando as
3
Este exemplo fictcio, pois a ID s pode ser usada em
classes que so gerenciadas pelo container, o que incluiria uma Servlet, mas no uma Action da Struts (que no
faz parte do Java EE). Mas confiamos que verses prximas de frameworks populares como a Struts suportaro
integrao com o Java EE, dando suporte ID nos seus
artefatos.
4
Note que estes frameworks podem oferecer outras
funcionalidades alm de ID por exemplo, no Spring, temos os mdulos de AOP e Web Flow.
15/8/2006 18:15:12
EJB 3.0
Se existe um patinho feio na histria do
J2EE, sem dvida a tecnologia EJB, em
especial os Entity Beans, acusados de baixa
eficincia, alta complexidade e dificuldade
de uso. Por outro lado, os Session Beans
foram um sucesso. Com eles, obteve-se um
excelente equilbrio entre a sofisticao e
o desempenho do CORBA, a simplicidade
do RMI, e as vantagens de baixo acoplamento do COM/COM+. Os EJBs tambm
implementam facilidades de controle declarativo de segurana e de transaes, alta
integrao entre todo o stack de servidor
JSR
Descrio
JSR-244: Java EE 5
Java SE?
-
JSR-173: StAX
No
No
No
No
No
Atualizao da API para e-mail, com muitas novas funcionalidades e melhorias de desempenho.
No
No
No
No
No
No
No
JSR-77: Java EE Management 1.1 Maintenance Release 1 da API para gerenciamento de servidores.
No
jm39.indb 23
23
15/8/2006 18:15:12
Java EE 5
Qual a relevncia da JPA para os adeptos de outras solues (no-EJB) de persistncia? Nenhum sistema O/R ser ideal
para todas as aplicaes e a concorrncia
deve continuar existindo, mas creio que a
JPA tende a se impor como um forte padro, ao unificar o status de API oficial do
Java EE 5 com qualidades de facilidade de
uso e compatibilidade com o Java SE (antes
exclusividades do JDO, Hibernate e outras
solues). At mesmo a API do popular
Hibernate deve perder terreno; o projeto j
oferece uma implementao (hoje em beta)
da Persistence API, o Hibernate Entity
Manager (HEM). O HEM uma casca
que implementa a nova API padronizada
pela JSR-220, mas que possui no ncleo o
runtime tradicional do Hibernate5. Pode
Listagem 3. Uma aplicao EJB 3.0 completa, com persistncia e Session Bean.
// Entidade persistente simples
import
import
import
import
import
java.io.Serializable;
javax.persistence.Entity;
javax.persistence.GeneratedValue;
javax.persistence.GenerationType;
javax.persistence.Id;
15/8/2006 18:15:14
25
15/8/2006 18:15:18
Java EE 5
ser usado em qualquer servidor Java EE
5 que suporte EJB 3.06 e at sem servidor
algum, em aplicaes Java SE 5.
Empacotamento
Uma das melhorias de facilidade de
uso mais discretas do Java EE 5, mas nem
por isso pouco importante, est nos seus
padres de pacotes para deployment, os
arquivos EAR, WAR e outros, que tradicionalmente exigiam uma estrutura bastante
complexa.
A estrutura bsica continua existindo.
Por exemplo, uma enterprise application
continua sendo empacotada num arquivo
EAR, dentro do qual pode-se ter arquivos
JAR com os EJBs, um folder META-INF com
descritores e assim por diante. As melhorias
so duas. Primeiro, os descritores tendem a
ser bem menores (e at opcionais), graas
ao novo modelo de anotaes + POJOs +
defaults. Segundo, no mais preciso declarar obviedades ou informar a mesma coisa
duas vezes o Java EE aprendeu a seguir o
princpio DRY (dont repeat yourself).
Um bom exemplo disso a configurao
de JARs utilitrios, que so colocados na
pasta /lib de um EAR, mas antigamente
isso no era suficiente: era preciso declarar
todos os JARs no META-INF/MANIFEST.
MF, na diretiva Classpath. Agora nada disso
necessrio o container ir detectar todos
os arquivos lib/*.jar e inclu-los no classpath
do mdulo EAR.
Aplicaes web (WAR) que usem somente
JSP e tecnologias relacionadas como JSTL,
mas no servlets, no precisam de nenhum
descritor (WEB-INF/web.xml). O mesmo
vale para WARs expondo web services (no
precisam mais de um webservices.xml, nem
de arquivos da JAX-RPC).
Alm disso, os EARs no precisam mais
do application.xml. Os application clients
tambm dispensam o application-client.xml;
basta ter no META-INF/MANIFEST.MF o
Main-Class apontando para a classe principal da aplicao. Finalmente, mdulos EJB
tambm no precisam obrigatoriamente do
ejb-jar.xml, bastando que o arquivo JAR do
mdulo possua anotaes como @Stateless.
Tudo isso no quer dizer que os descritores tenham desaparecido completamente.
Continuam sendo suportados, e s vezes
podem ser necessrios. A diferena que
agora, s preciso criar descritores quando
so realmente necessrios.
JavaServer Faces
A incluso da JSF 1.2 a nica grande
novidade de funcionalidade do Java EE 57.
Este anncio de grande novidade pode
parecer uma surpresa para os j adeptos
da JSF, comumente utilizada em servidores
J2EE 1.4. Mas o fato que at ento, nenhuma verso da JSF fez parte, oficialmente, da
plataforma J2EE (a JSF 1.0, JSR-127 (maro
de 2004) posterior J2EE 1.4 (novembro
de 2003)).
Mas isto talvez tenha sido bom, pois a
JSF uma tecnologia complexa que teve
um perodo relativamente longo de amadurecimento de reclamaes sobre o desempenho das primeiras implementaes,
a trapalhadas como problemas de compatibilidade com as especificaes JSP e EL, que
s recentemente foram resolvidos. Assim,
pode ser uma boa coisa que somente agora,
j na sua terceira reviso e com muitas dessas dores de crescimento superadas, a JSF
tenha sido integrada ao complexo conjunto
de especificaes e tecnologias que forma a
plataforma Java EE.
A JSF um framework orientado a componentes para gerao de GUIs web. Isto se
insere melhor na arquitetura geral do Java
EE, que j possui modelos de componentes
para regras de negcio, servios, integrao com recursos e sistemas externos etc.
Faltava suportar o mesmo paradigma no
lado do cliente, at ento servido apenas
por opes fora-bruta (Servlets) ou de
templates (JSP mesmo com extenses
como EL, JSTL, Struts etc.). Por orientado
a componentes queremos dizer que a JSF
permite construir GUIs atravs da composio de objetos e (em se tratando de GUI)
do tratamento de eventos gerados por estes
objetos. Um benefcio desta arquitetura a
separao entre o comportamento da GUI
e a sua apresentao. Outro a facilidade
para a construo de ferramentas puramente visuais.
Concluses
Neste artigo demos as primeiras pinceladas no Java EE 5, a plataforma que todos
usaremos em algum ponto para aplicaes
5
A API proprietria do Hibernate possui algumas funcionalidades que ainda no existem na JPA (como as queries
Criteria), mas isso s afeta usurios mais avanados. A
maioria pode migrar facilmente para a JPA, ganhando
com isso as vantagens de padres do Java EE, como implementaes concorrentes, maior suporte de IDEs etc.
6
o caso do JBoss 4.0, cujos ltimos releases (compatveis com o J2EE 1.4) suportam tambm o EJB 3.0, embora
o JBoss ainda no possua (no momento em que escrevo)
uma verso que suporte a plataforma Java EE como um
todo.
7
A JPA uma nova API, mas no uma nova funcionalidade (a no ser qualitativamente), j que as verses anteriores do J2EE j suportavam persistncia O/R com os
Entity Beans.
8
O codinome Tango especfico ao lado da Sun do
projeto, e achei timo. Afinal, o Tango uma dana lenta,
formal e sombria, e das mais difceis de executar sem escorregar para o ridculo (pelo menos no esteretipo que
aprendi no cinema: ver Quanto Mais Quente Melhor com
Jack Lemmon, e O Baile de Ettore Scola).
15/8/2006 18:15:21
jcp.org/en/jsr/detail?id=244
JSR-244, padro do JCP que define a
plataforma JEE 5.
java.sun.com/javaee
JEESDK 5 / Sun Java System Application Server 9.
glassfish.dev.java.net
Projeto GlassFish.
javamagazine.com.br/downloads/jm39/
jm-jee5.zip
Osvaldo Pinali Doederlein
([email protected]) Mestre em
Engenharia de Software Orientado a Objetos, membro individual
do Java Community Process (tendo participado do Expert Group da JSR-170: Tiger/J2SE 5.0), e
trabalha na Visionnaire Informtica como arquiteto e
desenvolvedor.
2
15/8/2006 18:15:26
Persistncia no Java E
Iniciando com a Java Persistence API
15/8/2006 18:16:30
a EE 5
Conceitos bsicos
Na JPA os objetos persistentes so denominados entidades (entities). Uma entidade
um objeto simples (POJO), que representa
um conjunto de dados persistido no banco.
Como entidades so definidas por classes
Java comuns, sem relao com frameworks
ou bibliotecas, elas podem ser abstratas ou
herdar de outras classes, sem restries.
Um conceito importante que as entidades possuem um identificador (descrito
pela chave primria) e estado, sendo seu
tempo de vida independente do tempo
de vida da aplicao. Assim, aplicaes
distintas podem compartilhar a mesma
entidade, que referenciada atravs de
seu identificador.
1
No Java EE 5.0, os Entity Beans foram revistos e se tornaram bem mais simples de usar
2
A independncia do container trouxe uma grande melhoria na testabilidade das aplicaes que mapeiam dados
do banco
29
15/8/2006 18:17:25
Persistncia no Java EE 5
Mapeamento
As classes e interfaces da JPA esto
localizadas no pacote javax.persistence. A
API faz uso intensivo de anotaes3; por
isso no necessrio criar descritores
XML para cada uma das entidades da
aplicao 4. Uma entidade uma classe
Java comum, rotulada atravs da anotao @Entity. No preciso implementar
interfaces ou estender outras classes
para tornar uma classe persistvel; a
nica exigncia que a classe da entidade
possua um construtor sem parmetros,
pois a instanciao da classe feita por
reflexo.
No cdigo a seguir a classe Pessoa representa uma entidade. O atributo cpf o
identificador da entidade (chave primria),
especificado atravs da anotao @Id:
@Entity
public class Pessoa {
@Id
private String cpf;
}
Outro padro utilizado pelo JPA considerar todas as propriedades de uma entidade como persistentes (o mapeamento
segue as regras descritas anteriormente).
Caso seja desejvel excluir alguma propriedade do mapeamento (ex.: no caso
de ela poder ser criada a partir de outras
propriedades), basta marc-la com a anotao @Transient:
@Entity
public class Pessoa {
@Id
private String cpf;
@Transient
private String nomeCompleto;
}
Consultas
A JPA oferece suporte a consultas estticas e dinmicas. A API fornece uma
linguagem prpria de consulta, que
uma extenso bastante poderosa da EJB
QL (a linguagem de consultas do EJB).
Essa linguagem pode ser usada como
3
As anotaes surgiram da verso 5.0 do Java e esto
presentes na maioria das APIs do novo JEE.
4
Mesmo no sendo obrigatrio o uso de XML para
descrever o mapeamento, ainda possvel utilizar essa
opo. Um exemplo tpico o arquivo persistence.xml,
que guarda as configuraes da unidade de persistncia
e utilizado neste artigo.
5
As principais operaes executadas sobre dados so
conhecidas atravs da sigla CRUD (Create, Read, Update,
e Delete).
15/8/2006 18:17:25
Um exemplo completo
Agora que os conceitos bsicos da JPA
foram apresentados, partiremos para
um exemplo completo, onde a API ser
demonstrada na prtica.
Enquanto a maioria dos artigos sobre
JPA foca no uso de EJBs, aqui faremos
uma abordagem distinta. No exemplo
deste artigo implementaremos uma aplicao desktop sem nenhum vnculo com
um container EJB. O objetivo mostrar
que a JPA pode ser utilizada no Java SE
facilmente. Usaremos na camada de persistncia o TopLink Essentials e o MySQL.
O TopLink Essentials a verso open
source do TopLink, uma ferramenta de
mapeamento objeto-relacional da Oracle.
O TopLink Essentials implementa a JPA e
utilizado no projeto GlassFish, que a
base da implementao de referncia do
Java EE 5.0. Por simplicidade, e para focar
melhor na API, no implementamos uma
interface grfica. O cdigo completo da
aplicao est disponvel no site da Java
Magazine. Veja mais sobre o ambiente
utilizado e como executar a aplicao
de exemplo no quadro Configurando o
ambiente.
A aplicao implementa um sistema
(bastante simplificado) para gerenciamento de uma locadora de veculos. Na
Figura 1 exibido seu diagrama de classes e na Figura 2 o modelo ER (EntidadeRelacionamento) utilizado.
Mapeamento do cliente
Comearemos com o mapeamento da
classe Cliente, a mais simples da aplicao. O cdigo da classe mostrado na
Listagem 1. Como vimos, a anotao
@Entity torna a classe persistvel, permitindo a sua manipulao pela JPA.
Note que no foi necessrio utilizar a
anotao @Table para especificar a tabela
utilizada para persistncia, uma vez que
uma tabela de mesmo nome usada para
persistir os clientes (CLIENTE). A identidade de cada cliente definida atravs da
propriedade codigo. A anotao @Id indica
que esse campo utilizado como iden-
Configurando o ambiente
Executado a aplicao
Eclipse 3.2
O Eclipse 3.2 foi o IDE escolhido para implementar o exemplo. O download pode ser feito
a partir de eclipse.org/downloads. Para quem
ainda no usa o Eclipse, a instalao simples,
bastando extrair o contedo do arquivo compactado para o diretrio de sua preferncia.
Aps a instalao do Eclipse, o projeto de exemplo deve ser importado para o IDE. A estrutura
do projeto mostrada na Figura Q1.
MySQL
O MySQL usado no exemplo devido sua
facilidade de instalao e configurao. O
download do MySQL e do MySQL Connector/J
(driver JDBC) podem ser feitos em dev.mysql.
com/downloads. Escolha a verso adequada
ao seu sistema operacional e siga as instrues
fornecidas no help. Aps instalar, crie um database com nome locadora e execute o script
de criao das tabelas.
O arquivo compactado do drive r Co n n e c to r /J co nt m a b i b l i ote c a
mysql-connector-java-3.1.12-bin.jar (a verso
pode variar), que deve ser adicionado ao projeto do Eclipse.
Aps esses passos, a aplicao estar pronta para ser iniciada. O projeto j contm a
configurao do persistence unit, localizada
no arquivo META-INF/persistence.xml. Para
rodar a aplicao basta executar a classe
br.com.jm.locadora.Principal. Durante a execuo,
o console mostrar as seguintes mensagens:
Populando tabelas... OK
Listando todas as reservas...
Srgio - BMW
Andr - ECO SPORT
Listando todas as locacoes...
Andr - ECO SPORT
Listando reservas entre 01/06/2006 e 01/08/2006...
Andr - ECO SPORT
Listando dados do veculo ABC1234...
ECO SPORT - ABC1234 [Utilitario]
Toplink Essentials
O Toplink Essentials a implementao da
JPA utilizada no projeto GlassFish (glassfish.dev.
java.net). O download pode ser feito a partir
da pgina do projeto: oracle.com/technology/
products/ias/toplink/jpa/download.html. Aps
baixar o arquivo execute o comando:
java jar glassfish-persistence-installer-v2-b11.jar
(Lembrando mais uma vez que a verso
31
15/8/2006 18:17:26
Persistncia no Java EE 5
Veiculo
Reserva
Cliente
{ From model }
{ From locadora }
{ From model }
Attributes
veiculo
Attributes
cliente
Attributes
reserva
Esportivo
Utilitario
Locacao
{ From model }
{ From model }
{ From model }
Attributes
private Integer velocidade
Attributes
private Integer passageiros
Attributes
private Integer codigo
Mapeamento do veculo
Na modelagem OO da aplicao decidimos especializar a classe Veiculo, guardando as particularidades de cada veculo em
classes especficas (veja a Figura 1). Veiculo
uma classe abstrata, que possui duas
subclasses: Esportivo e Utilitario.
No modelo relacional a abordagem foi
distinta. Para evitar o custo de joins, todos os veculos foram mapeados em uma
nica tabela, que contm propriedades
tanto genricas quanto especficas. Como
veremos a seguir, o nosso mapeamento
deve contemplar essa deciso arquitetural
e permitir que os objetos sejam instanciados corretamente (de acordo com sua
classe), mesmo com todos residindo em
uma tabela genrica.
Vamos analisar o cdigo da entidade
Veiculo (Listagem 2). Como j conhecemos
as anotaes @Entity, @Id e @Column, veremos
apenas as novas construes.
O mapeamento da herana de entidades
descrito atravs da anotao @Inheritance,
que define a estratgia usada no mapeamento. De forma semelhante a outros
15/8/2006 18:17:28
@Entity
@Table(name = VEICULO)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = CD_TIPO, discriminatorType = DiscriminatorType.STRING)
public abstract class Veiculo {
@Id
@Column(name = DS_PLACA, nullable = false)
private String placa;
@Column(name = DS_MODELO, nullable = false)
private String modelo;
@Column(name = NR_ANO, nullable = false)
private Integer ano;
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Inheritance
Listagem 3. Esportivo.java
package br.com.jm.locadora.model;
import javax.persistence.*;
@Entity
@DiscriminatorValue(E)
public class Esportivo extends Veiculo {
@Column(name = VL_VELOCIDADE, nullable = false)
private Integer velocidade;
}
Listagem 4. Utilitario.java
package br.com.jm.locadora.model;
import javax.persistence.*;
@Entity
@DiscriminatorValue(U)
public class Utilitario extends Veiculo {
@Column(name = NR_PASSAGEIROS, nullable = false)
private Integer passageiros;
}
33
15/8/2006 18:17:29
Persistncia no Java EE 5
Mapeamento da reserva
J apresentamos a entidade Reserva
(Listagem 5), que descreve a reserva de um
veculo, relacionando-se com as entidades
Veiculo e Cliente. Reserva representa o lado
filho dos relacionamentos veiculo-reserva
e cliente-reserva, e armazena o cliente e o veculo nas propriedades cliente e veiculo. Para
Listagem 5. Reserva.java
package br.com.jm.locadora.model;
import java.util.Date;
import javax.persistence.*;
@Entity
@NamedQueries({
@NamedQuery(name = Reserva.listarPorPeriodo,
query = SELECT r FROM Reserva r WHERE +
r.inicio >= :inicio AND r.fim <= :fim),
@NamedQuery(name = Reserva.ultima,
query = SELECT r FROM Reserva r WHERE r.codigo = +
(SELECT MAX(r1.codigo) FROM Reserva r1))
})
public class Reserva {
@Id
@Column(name = CD_RESERVA)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer codigo;
@ManyToOne
@JoinColumn(name = CD_CLIENTE, nullable = false)
private Cliente cliente;
@ManyToOne
@JoinColumn(name = DS_PLACA, nullable = false)
private Veiculo veiculo;
@Column(name = DT_INICIO, nullable = false)
@Temporal(TemporalType.DATE)
private Date inicio;
@Column(name = DT_FIM, nullable = false)
@Temporal(TemporalType.DATE)
private Date fim;
}
Listagem 6. Locacao.java
package br.com.jm.locadora.model;
import java.util.Date;
import javax.persistence.*;
@Entity
public class Locacao {
@Id
@Column(name = CD_LOCACAO)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer codigo;
@OneToOne
@JoinColumn(name = CD_RESERVA)
private Reserva reserva;
}
15/8/2006 18:17:37
Mapeamento da locao
O mapeamento da entidade Locacao
(Listagem 6) simples. Alm das anotaes @Id e @GeneratedValue abordadas
anteriormente, essa entidade apresenta
um relacionamento um-para-um com
a entidade Reserva, pois uma locao s
pode existir para uma reserva criada
anteriormente.
O relacionamento descrito pela anotao
@OneToOne, e possui uma sintaxe semelhante
de um mapeamento um-para-muitos:
@OneToOne
@JoinColumn(name = CD_RESERVA)
private Reserva reserva;
EntityManagerFactory factory =
Persistence.createEntityManagerFactory(locadora);
EntityManager manager =
factory.createEntityManager();
Listagem . persistence.xml
<?xml version=1.0 encoding=UTF-8?>
<persistence xmlns=http://java.sun.com/xml/ns/persistence
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance version=1.0
xsi:schemaLocation=http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd>
<persistence-unit name=locadora>
<provider>
oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider
</provider>
<class>br.com.jm.locadora.model.Cliente</class>
<class>br.com.jm.locadora.model.Reserva</class>
<class>br.com.jm.locadora.model.Locacao</class>
<class>br.com.jm.locadora.model.Veiculo</class>
<class>br.com.jm.locadora.model.Utilitario</class>
<class>br.com.jm.locadora.model.Esportivo</class>
<properties>
<property name=toplink.logging.level value=INFO />
<property name=toplink.jdbc.driver value=com.mysql.jdbc.Driver />
<property name=toplink.jdbc.url
value=jdbc:mysql://127.0.0.1:3306/locadora />
<property name=toplink.jdbc.user value=root />
<property name=toplink.jdbc.password value= />
</properties>
</persistence-unit>
</persistence>
35
15/8/2006 18:17:37
Persistncia no Java EE 5
15/8/2006 18:17:42
Apoio de ferramentas
possvel perceber que a JPA
oferece recursos avanados de consulta
Concluses
A Java Persistence API traz diversos benefcios para o desenvolvedor Java e para os
fabricantes de produtos relacionados persistncia de objetos. A criao de um padro
baseado em frameworks lderes de mercado
incentiva o uso da API e facilita a migrao
de softwares existentes. Desenvolvedores
com alguma vivncia em ferramentas como
Hibernate e TopLink no tero dificuldades
em utilizar a nova API.
Com um padro de persistncia, a escolha
de uma determinada implementao passa
a ser guiada por critrios como preo, robustez e tradio do fabricante, e no mais
por operaes suportadas por um fabricante
especfico ou simplicidade de mapeamento
O/R provida por um framework.
Os servidores de aplicaes j iniciaram
a incorporao do novo padro e s
jcp.org/aboutJava/communityprocess/
final/jsr220
Especificao do EJB 3.0 e JPA
java.sun.com/developer/
technicalArticles/J2EE/jpa
Introduo JPA
eclipse.org/dali
Dali JPA Tools
oracle.com/technology/products/ias/toplink
Pgina do Oracle Toplink
glassfish.dev.java.net/javaee5/persistence/
entity-persistence-support.html
Sobre o suporte persistncia no projeto
GlassFish
javamagazine.com.br/downloads/jm39/
jm-jpa.zip
Andr Dantas Rocha
([email protected]) mestre
em Engenharia de Software pela
USP e arquiteto da Fidelity SA.
3
15/8/2006 18:17:55
AJAX Avanado c
Criando componentes e servios com
15/8/2006 18:18:05
o com GWT
Preparao
Para a construo do exemplo, vamos
utilizar o IDE Eclipse com dois plug-ins:
WTP (Web Tools Project) e Googlipse. No
site do WTP (eclipse.org/webtools) existe
uma verso do Eclipse com este plug-in
incluso. Se voc j tem o Eclipse instalado,
pode baixar e instalar o WTP pelo prprio
IDE, acessando o site de atualizaes do
Callisto (veja um artigo sobre o Callisto
na edio anterior).
Tendo instalado o WTP, faa o download do JAR do Googlipse (em googlipse.
com) e coloque-o dentro da pasta eclipse/
plugins. Depois, dentro do Eclipse, abra
o menu Window|Preferences, escolha a
opo Googlipse e defina a pasta onde
est instalado o GWT (download em
code.google.com/webtoolkit). Com isso sua
IDE fica preparada para o desenvolvimento dos exemplos mostrado neste artigo.
Como banco de dados usaremos o
MySQL. A Listagem 1 mostra o script
para a criao da nica tabela que precisamos. Todo o cdigo aqui demonstrado
est disponvel no site da Java Magazine.
Para facilitar os testes, o download inclui
tambm uma classe que carrega o banco de
dados com nomes e endereos aleatrios.
Construo de componentes
O exemplo que construiremos ser uma
lista de contatos (veja a Figura 1), formada
por uma tabela com paginao e uma rea
de exibio de fotos. Alm disso, criaremos
uma caixa de dilogo que mostra mais
informaes sobre um contato selecionado
na tabela. Veja algumas particularidades
do exemplo:
Iniciando o projeto
jm39.indb 39
39
15/8/2006 18:18:12
br.com.jm.gwt.client.JMListaContatos.
java Classe responsvel por inicializar
os componentes e posicion-los dentro
do HTML. chamada pelo GWT de
Entry Point.
br.com.jm.gwt.JMListaContatos.gwt.xml
Documento que define as configuraes
do mdulo GWT e seus servios.
Deixe a classe JMListaContatos e o arquivo JMListaContatos.gwt.xml inalterados
por enquanto. Mas modifique o arquivo
JMListaContatos.html deixando-o igual
Listagem 2. Este arquivo inclui dois
componentes que so referenciados pelos
seus ids (contatos e fotografia) dentro de uma
tabela HTML:
<table>
<tr>
<td id=contatos></td>
<td id=fotografia valign=top></td>
</tr>
</table>
Componente Fotografia
O primeiro componente que vamos criar
mostra a fotografia do contato selecionado, e estende a classe Image do GWT. Uma
funcionalidade adicional da nossa classe
Fotografia (mostrada na Listagem 3) que se no houver
imagem cadastrada para o
contato, ser mostrada uma
imagem padro. A classe
tambm demonstra o tratamento de eventos na leitura
de imagens.
Observe que o construtor de Fotografia recebe um
ob j e to da c l a s s e Contato
(Listagem 4). Na instanciao j definido o tamanho,
o estilo CSS e qual a URL da
imagem. Outro fato importante est na implementao
da interface LoadListener, atravs dos mtodos onError() e
onLoad(). O mtodo onError()
Componente MeuDialogBox
A API do GWT inclui o componente
DialogBox, que permite mostrar janelas
popup com informaes ou avisos. Em
nosso exemplo vamos criar uma classe que
estende DialogBox, para aproveitar caractersticas desse componente, como a exibio de uma rea de ttulo, a possibilidade
de arrast-lo e sua caracterstica modal
(enquanto a janela estiver ativa o restante
da aplicao fica bloqueado).
A Figura 1 mostra como ficar o layout da
nossa caixa de dilogo. Utilizamos um pouco
de CSS para ajudar na formatao do ttulo e
bordas. Colocamos a definio dos estilos no
arquivo estilosListaContatos.css (Listagem 5),
dentro da pasta br.com.jm.gwt.public. O CSS
importado pela pgina JMListaContatos.
html.
A maioria dos componentes grficos
(widgets) do GWT possui um estilo CSS
pr-definido, ou seja, voc precisa apenas defini-lo no seu arquivo CSS, que
o componente j o usar. O DialogBox
utiliza dois estilos, um para a janela e
outro para a rea de ttulo: gwt-DialogBox e
gwt-DialogBox .Caption.
A Listagem 6 mostra o cdigo do componente MeuDialogBox. No construtor foram
definidos o ttulo, o tamanho e a localizao da caixa de dilogo. A fotografia,
o contedo e o boto foram posicionados
dentro de um componente DockPanel. Para
entender mais sobre painis como este e
outros componentes grficos do GWT, veja
o quadro Panels e Widgets.
15/8/2006 18:18:13
Componente BarraNavegacao
A barra de navegao, cujo cdigo mostrado na Listagem 7, ter trs elementos:
dois botes (prximo e anterior) e um
Label. Seu construtor configura o posicionamento dos elementos dentro de um
HorizontalPanel, e recebe uma fonte de dados.
No se preocupe com a fonte de dados por
enquanto; veremos mais sobre ela ao tratar
dos servios do GWT.
A principal funo da barra de navegao
41
15/8/2006 18:18:15
//posicao do DialogBox
setPopupPosition(DESLOCAMENTO_ESQUERDA,
DESLOCAMENTO_SUPERIOR);
setWidth(TAMANHO_JANELA);
Listagem 4. Contato.java
public class Contato implements IsSerializable {
public long contatoId;
public String nome;
public String telefone;
public String celular;
public String email;
public String endereco;
public Contato() {}
}
setText(titulo);
Listagem 7. BarraNavegacao.java
Listagem 5. Arquivo CSS com estilos utilizados pelos componentes GWT estilosListaContatos.css
.gwt-TextBox {
border-width: 0px;
height: 15;
width: 140;
font-size: 12;
}
.gwt-DialogBox {
border: 2px solid #AAAAAA;
background-color: white;
}
.gwt-DialogBox .Caption {
background-image: url(imagens/back_degrad.gif);
background-repeat: repeat-x;
padding: 4px;
padding-bottom: 8px;
font-weight: bold;
cursor: default;
}
this.horizontalPanel.add(btnAnterior);
this.horizontalPanel.add(btnProxima);
this.btnAnterior.setEnabled(false);
setWidget(horizontalPanel);
}
.gwt-Button {
border: 1px solid #8E8E8E;
width: 70;
}
15/8/2006 18:18:15
Listagem 8. TabelaEditavel.java
public class TabelaEditavel extends Composite
implements TableListener
{
public TabelaEditavel(FonteDeDados fonteDeDados,
String[] nomesColunas,int nroRegistrosPagina)
{
//... config. dos atributos com os valores dos parmetros
// configura esta instncia como o Listener do Grid
// para receber informaes sobre o clique, linha e coluna
grid.addTableListener(this);
//adiciona a barra de navegao e o Grid ao DockPanel
panelBase.add(barraNavegacao, DockPanel.NORTH);
panelBase.add(grid, DockPanel.CENTER);
//configura o Composite com o DockPanel
setWidget(panelBase);
}
dialogBox.show();
43
15/8/2006 18:18:20
Componente TabelaEditavel
O componente TabelaEditavel o mais
complexo que criaremos neste artigo.
Veja seu cdigo na Listagem 8. A estrutura interna do componente construda
dentro de um DockPanel, com um componente BarraNavegacao na posio NORTH, e um
Grid (da API do GWT) no centro, onde sero
exibidos os dados dos contatos.
O construtor instancia a barra de navegao j com uma fonte de dados, guarda o
nmero de registros por pgina, configura
a prpria instncia como o listener do Grid
(para capturar os cliques sobre ele), e determina o layout dos componentes dentro
do DockPanel.
O mtodo onCellClicked() chamado quando algum evento de clique ocorre na grade. Caso o clique tenha sido na primeira
coluna, mostrada uma caixa de dilogo
com o endereo do contato. Um clique nas
outras colunas tornar a clula correspondente editvel.
O mtodo mostraDialogBox() instancia a
caixa de dialogo j com uma fotografia
e o endereo do contato configurados.
A caixa de dilogo exibida atravs do
mtodo show(). E editaCelula() substitui
o Label na clula clicada por um TextBox
(da API do GWT) para edio do valor.
Este TextBox ter dois listeners. Um para
eventos de foco, FocusListener, e outro para
eventos de teclado, KeyboardListener. Quando o TextBox perder o foco ou o usurio
pressionar Enter, ser chamado o mtodo
atualizaRegistro() para persistir no banco de
dados a alterao efetuada.
Por fim, o mtodo atualizaRegistro() substitui o TextBox por um Label, atualiza o campo
Componente ListaContatos
O componente ListaContatos, com cdigo
mostrado na Listagem 9, rene uma fonte
de dados (objeto FonteDeDados) e um componente TabelaEditavel. A fonte de dados
recebe o nmero de registros por pgina,
e a tabela editvel recebe os nomes das
colunas, o nmero de registros por pgina
e a prpria fonte de dados.
Servios no GWT
Para fazer acesso aos dados dos contatos
no banco, utilizaremos a classe FonteDeDados.
Esta classe faz uso da infra-estrutura de
servios remotos do GWT, assim antes
15/8/2006 18:18:21
Panels e Widgets
Panels
Os panels so recipientes de componentes
grficos utilizados para facilitar o posicionamento e o agrupamento. Utilizamos trs tipos
de painis no exemplo: HorizonalPanel, DockPanel
e RootPanel.
HorizontalPanel
Este tipo de painel organiza seus componentes
da esquerda para direita em uma mesma linha,
e o utilizamos para organizar os Buttons e o Label
de mensagem na barra de navegao.
TextoBox
Campo simples para entrada de texto. Seu
estilo CSS padro : gwt-TextBox. Principais
mtodos:
getText():: retorna o texto digitado no campo;
getSelectedText():: retorna o texto selecionado
dentro do campo;
selectAll():: seleciona todo o texto dentro do
campo;
setText(String):: configura o valor do campo;
addChangeListener ( ) , addClickListener ( ) ,
addKeyboardListener(): adicionam listeners para
mudana do contedo, eventos de mouse e
teclado, respectivamente.
DockPanel
O DockPanel possiciona os seus elementos
seguindo a numerao da Figura Q1 (extrada
da documentao do GWT). Aps colocar um
widget na posio central nenhum outro widget deve ser adicionado ao DockPanel. Se no
for indicado o posicionamento ao adicionar os
componentes, o ltimo a ser adicionado ocupar a posio central. No exemplo, utilizamos o
DockPanel para fazer o layout da caixa de dilogo
e da tabela editvel.
RootPanel
O RootPanel o ltimo painel no qual um componente deve ser adicionado. Sua localizao
definida dentro do HTML principal (Host Page),
normalmente utilizando-se um id. O RootPanel
instanciado pelo GWT e obtido atravs de dois
mtodos estticos:
RootPanel.get(): retorna o RootPanel padro
da aplicao.
RootPanel.get(String id): retorna o RootPanel associado a um elemento/id definido no HTML.
O RootPanel no possui um layout definido.
Sua funo apenas receber componentes e
exibi-los.
Widgets
A API do GWT fornece componentes grficos
(widgets) para vrios fins, por exemplo campos
de texto, checkboxes, tabelas, menus, janelas
popup, rvores de navegao e grades. Veja a
Button
Um boto HTML normal. Seu estilo CSS padro
: gwt-Button. Principais mtodos:
click(): equivalente a clicar no boto;
addClickListener(), addKeyboardListener(): adiciona listeners para eventos de clique e de
teclado.
Image
Componente para exibio de imagens a
partir de uma dada URL. Seu estilo padro :
gwt-Image{}. Principais mtodos:
setUrl(): configura a URL da imagem a ser
exibida;
addClickListener () , addLoadListener () ,
addMouseListener(): adiciona listeners para eventos
de clique, carregamento de imagem e mouse.
DialogBox
Caixa de dilogo que possui rea de ttulo e a
possibilidade de arrast-la. O DialogBox utiliza dois
estilos, um para a janela e outro para a rea de
ttulo: gwt-DialogBox e gwt-DialogBox .Caption.
No nosso exemplo, estendemos este componente para customiz-lo conforme nossas
necessidades de layout, e para tratar eventos de
teclado. Principais mtodos:
setText(): configura o ttulo da caixa de dilogo.
setHTML(): configura o contedo da caixa de
dilogo com um cdigo HTML.
addWidget(): configura o contedo da caixa
com um widget.
Grid
Tabela redimensionvel que pode
conter texto, html ou widgets. No
possui estilo padro. Principais mtodos:
resize(int, int): redimensiona a
tabela;
setWidget(int linha, int coluna, Widget w):
adiciona um widget em uma determinada clula;
setText(int linha, int coluna, String str):
adiciona uma String em uma determina
clula;
north (0)
west
(1)
west
(2)
center
(5)
east
(3)
south (4)
Figura Q1. Ordem de posicionamento de componentes em um
DockPanel
45
15/8/2006 18:18:25
- Java no Governo
- Apache FOP
- JSTL Guia Completo
- Cocoon Inicial
- Pacotes WAR e JAR
- Cdigos no Eclipse
- New I/O Fundamental
- Game API
- Criando Plug-ins para Eclipse
- Preferences API
- Multimdia no celular
- Automao com Ant
- Robocode
- Tag Libraries JSP
- Processando XML em Java
- Ec
-O
- Se
- In
- Ex
Edio 14
Edio 13
- Dados em J2ME
- JavaServer Faces
- Jogos wireless
- Certificao J2EE
- Montando um ambiente Java
Edio 12
- Tutorial de NetBeans
- API New I/O (java.nio)
- Cesta de compras com Struts
- Testes de carga com JMeter
- Concorrncia e a JVM
Edio 4
Edio 3
Edio 2
- Ferramentas livres
- Introduo ao J2EE 1.4
- Introduo a J2ME
- J2EE Fundamental
- Dados com JDBC
Edio 11
Edio 9
Edio 10
Complete
a sua
coleo!
Edio 1
- Relatrios Corporativos
- Grficos com Java 2D
- Java.net na Prtica
- Raio-X do Tiger
- Paginao na Web
- Fo
- AN
- JB
- Ex
- Me