Sei sulla pagina 1di 56

jm6-book.

indb 1 3/4/2003, 17:48:25


jm6-book.indb 2 3/4/2003, 17:48:41
Contedo
06
Java News Dicas e Solues
Lanamentos de produtos, novas MICHAEL NASCIMENTO SANTOS
tecnologias e especificaes Java Problemas e solues prticas: recuperao 32
de sesses, transaes em EJBs e usos
de final

08
Comunidade
LEONARDO GALVO
JustJava 2003, a participao brasileira no Automao com XDoclet
JavaOne, listas de discusso e PBJUG MARCUS BRITO
Retirar do programador a tarefa entediante 46
de criar cdigo repetitivo, adicionando mais
significado e poder ao cdigo o objetivo
do XDoclet
10
A Vida, o Universo e Tudo Mais
BRUNO SOUZA
Java no desktop, parte 2:
toolkits web, distribuio e instaladores Jakarta Velocity
PAULO SILVEIRA E RAFAEL STEIL
O uso de templates na camada de apresen- 50
tao de aplicaes web simplifica a manu-
teno e a separao de responsabilidades
16
Java Livre
FERNANDO LOZANO
Aprenda o essencial sobre o container web mais
usado no mercado

Asseres no J2SE 1.4


22 FELIPE LEME
Java de Bolso Sintaxe e melhores prticas para o uso
CLUDIO MIRANDA de comandos assert para a deteco
Integrao de aplicaes J2ME e servios de rede antecipada de erros
atravs do Generic Connection Framework
36

28
Alm das Fronteiras
JLIO CSAR LINS
JSP 2.0: linguagem de expresses, JSTL padro,
fragmentos e tag files so algumas extenses Struts: primeiros passos
MIGUEL NGELO GALLINDO,
RICHARDSON OLIVEIRA E DANIEL FREITAS
Conhea a arquitetura e o funcionamento
54 bsico do framework lder para o
Livros desenvolvimento web
DANIEL DEOLIVEIRA
Existem bons escritores brasileiros sobre Java 40

Edio 6 Java Magazine 3

jm6-book.indb 3 3/4/2003, 17:48:55


Direo
Diretor Editorial
Leonardo Galvo
Diretor Comercial
Espao do L
Casseano Filho
Diretor de Marketing
Gladstone Matos

Edio
Publisher e Editor
Leonardo Galvo
Editor Adjunto
Fernando Lozano
Q uando, em 2001, a Sun decidiu oficializar a separao de Java em trs platafor-
mas as hoje to conhecidas J2EE, J2SE e J2ME parecia ser uma delimitao
adequada e suficiente por muitos anos. Mas uma tecnologia rica e dinmica
como Java parece desafiar qualquer categorizao.
Jornalista Responsvel Em que plataforma entraria, por exemplo, o novo J2EE Client Provisioning, para a
Srgio Moraes C. Brando (MTb: 15183-68-148) integrao entre aplicaes servidoras e clientes conectados, tanto os sem-fio quanto os
Corpo Editorial desktop? Micro, Enterprise ou Standard Edition? Um pouco dos trs... E o que dizer de
Alexandre Denes dos Santos, Bruno Souza, Edgar Silva, ferramentas como o XDoclet, para gerao de cdigo, baseada no Javadoc (J2SE, claro...),
Hyalen Caldeira, Jlio Csar Lins, Osvaldo Doederlein mas que se supera na gerao de EJBs (ento no seria J2EE?). E o Jakarta Velocity?
Colaboraram nesta edio Este deixa para trs qualquer delimitao afinal, templates (o corao do Velocity)
Bruno Souza, Cludio Miranda, Daniel deOliveira, Daniel Freitas,
podem ser usados em aplicaes que precisam gerar pginas HTML, documentos XML,
Felipe Leme, Fernando Lozano, Gustavo Nalle Fernandes,
Jlio Csar Lins, Leonardo Galvo, Marcus Brito, componentes EJB, telas MIDP... As linhas que dividem as plataformas realmente esto
Michael Nascimento Santos, Miguel ngelo Gallindo, cada vez menos claras, principalmente devido evoluo e integrao das APIs.
Paulo Silveira, Rafael Steil, Richardson Oliveira A inte(g)rao entre plataformas um tema recorrente nos artigos, colunas e sees
desta edio. Na coluna Java de Bolso demonstrado o framework de conectivida-
Arte de oficial do J2ME/MIDP, para a comunicao de celulares com servios no back-end
Editor de Arte atravs de protocolos wireless e internet o end-to-end chegando maturidade.
Tarcsio Bannwart (tarcisio@javamagazine.com.br)
Ainda dentro do assunto de capa, temos trs textos sobre temas queridos pelos de-
Capa
senvolvedores: o JSP, que na verso 2.0 vem com extenses que prometem aumentar
Ivan Sria Fernandez (ivansf@brturbo.com)
muito a produtividade; o Struts, framework web que faz boa parte do trabalho braal
Ilustraes internas
Felipe Machado (felipe_m@ibest.com.br) e facilita a programao em equipe; e o Tomcat, o container e servidor web que, voc
sabe, referncia para a execuo de servlets e JSPs.
Produo A rede das redes tambm ocupa espao privilegiado na segunda parte do artigo so-
Gerente de produo bre Java no Desktop (coluna A Vida o Universo e Tudo Mais), que mostra tcnicas e
Rosngela Mattos ferramentas para trazer os benefcios da web para o desktop e apresenta idias para
Assessoria de Imprensa
levar algumas vantagens do ambiente local para aplicaes web.
Kaline Dollabella (kalined@hotmail.com)
Focando na linguagem, o artigo sobre asseres explora o uso da palavra-chave
Impresso
Grfica Bandeirantes assert, que simplifica o chamado design-by-contract, criado pelo guru da orientao a
Distribuio objetos Bertrand Meyer. Finalizando, temos uma novidade que deve agradar a muitos:
Fernando Chinaglia Distribuidora S.A. a coluna Dicas e Solues, que soluciona problemas encontrados freqentemente pelos
Rua Teodoro da Silva, 907, Graja - RJ desenvolvedores.
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362 isso. Boa Pscoa e muita paz para todos.
Leonardo Galvo
Publicidade Publisher e Editor
publicidade@javamagazine.com.br

Contato
Assinaturas
assinaturas@javamagazine.com.br , (021) 2213-0941 ou no site
Cartas e informaes gerais
info@javamagazine.com.br Servlets com J2SE
Na web Quando tento acessar a API de servlets, o Eclipse
Estou utilizando o JBoss e o Tomcat como servi-
www.javamagazine.com.br dores em meu micro com o J2SDK 1.3.1.03 insta- reclama como se ela no existisse no meu SDK. O
lado. Uso o 1stPage para a edio de JSP e HTML, que preciso fazer?
e o Eclipse para a gerao de arquivos .class e .jar. Mrcio Alex

Neofcio Editora

jm6-book.indb 4 3/4/2003, 17:49:23


eitor
Edio 5
Desktop Esse erro indica que, ou no foi possvel localizar as no lugar de ponto-e-vrgula (separao entre as
classes do pacote javax.naming (da entradas), esquecer de prefixar o
Gostaria de parabenizar a Java Magazine e o sr.
API JNDI, que padro no J2EE mas caminho com a letra de drive no
Bruno Souza pelo artigo Java no Desktop (Edi-
no fornecida com o J2SE), ou que Windows, ou de outro modo gerar
o 5). Trabalho com aplicaes comerciais em
no foi possvel localizar uma confi- um classpath que contm apenas
outra linguagem e pretendo convert-las para
gurao para acesso ao servidor de parte dos pacotes.
Java. Lendo o artigo, pude perceber que no se
nomes JNDI. Supondo que o cliente Alm disso, se voc utiliza o
trata apenas de um sonho Java pode sim rodar
web tenha rodado sem problemas Windows 98, pode ter ficado sem
no desktop. Obrigado!
e que voc conseguiu navegar pelo espao de ambiente. Nesse caso,
JBoss inicial console JMX do JBoss (chamando a adicione o seguinte comando ao
arquivo config.sys e reinicialize o
URL http://127.0.0.1:8080/jmx-con-
J comprei todas as edies dessa revista e, computador:
sole), sua instalao est correta; fal-
a cada edio, percebo que cresce mais e mais. shell=\windows\command.com
ta apenas incluir no classpath todos
Meus parabns pelo produto. A matria que /e:4096 /p
os pacotes JAR presentes no diretrio
mais me encantou foi a JBoss Inicial, que me Concluindo, importante lembrar
client do JBoss. Os pacotes devem ser
fez baixar o JBoss e fazer o cdigo no artigo. que os pacotes no diretrio client do JBoss so
includos um-a-um, com o caminho completo.
Contudo, encontrei um erro ao conectar ao necessrios apenas para executar um cliente da
Como isso ir gerar um classpath bem grande (so
JBoss: NoInitialContext.... aplicao, mas no para compilar esse cliente ou
24 pacotes a serem adicionados), tenha cuidado: fcil
Udo (m_udo@uol.com.br) para executar ou compilar um cliente web.
errar na digitao de um caminho, usar dois pontos

Basicamente, todas as APIs que dependem de ser- projeto no Eclipse para que seja possvel compilar de modo que voc deve copiar todos os pacotes JAR
vidores especializados (servidores de nomes, web, e servlets. no diretrio lib da distribuio (jakarta-taglibs/
de aplicao, monitores de transao, servidores de As edies 4 e 5 fornecem instrues detalhadas standard-1.0.3/lib) para o diretrio WEB-INF/lib de
e-mail etc.) esto includas apenas no J2EE. Servi- sobre a localizao dos pacotes contendo as APIs no sua aplicao web, ou ento para o diretrio shared/
dores J2EE (como o JBoss) ou containers web (como o JBoss e como configurar o Eclipse para utilizar APIs classes do Tomcat. L elas ficaro visveis para todas
Tomcat) fornecem as APIs necessrias em pacotes JAR definidas em pacotes externos. as aplicaes hospedadas pelo servidor.
que devem ser adicionados ao seu classpath para a Importante: no mais necessrio copiar os arquivos
compilao dos programas. Mudanas em Taglibs .tld. Eles esto includos nos pacotes JAR e sero local-
Entretanto, a maioria dos IDEs ignora o classpath Estou com problemas para montar o exemplo izados sem problemas pelas pginas JSP.
do sistema operacional, de modo que voc deve con- Frum de Debates da Edio 5. O arquivo citado
figurar sua ferramenta para incluir as APIs adicionais. jakarta-taglibs-20021014.zip no est mais disponv- 100 vezes Java
No Eclipse, voc deve selecionar o cone do seu projeto, el e os novos no incluem os arquivos utility.tld ou Acho a revista demais as primeiras edies so
clicar com o boto direito e mostrar a janela de pro- utility.jar. imperdveis. Toro para que a Java Magazine tenha
priedades; depois selecionar a opo Java Build Path Ronaldo Jnior (link_rjr@terra.com.br) sucesso, pois faltava um veculo especfico para pro-
e clicar no boto Add External JAR para adicionar os gramadores e especialistas na linguagem Java. Meus
pacotes contendo as APIs necessrias. A verso citada no artigo para a biblioteca de parabns. Espero me manter assinante da Revista
A API de servlets fornecida pelo JBoss no arquivo tags JSTL fornecida pelo projeto Jakarta Taglibs at a Edio 100 e o que vier alm!
(JBOSS_HOME)/server/default/lib/javax.servlet.jar. (jakarta.apache.org/taglibs) era um snaphot, uma
Rodrigo Ferreira (rodrigo2k@visualnet.com.br)
Este o pacote JAR que deve ser adicionado ao seu verso de desenvolvimento. J esto disponveis
verses de produo no momento de fechamento
Erramos desta edio, a mais recente 1.0.3. Voc pode
Na coluna Livros da Edio 5, foram pub- baixar qualquer verso de produo (release) em Participe!
licadas informaes incorretas sobre o livro www.apache.org/dist/jakarta/taglibs/standard/ Envie sua dvida, pedido, sugesto ou crtica
Aprenda Java em 21 Dias, da Editora Campus. binaries, por exemplo jakarta-taglibs-standard- para info@javamagazine.com.br, ou para:
Correo:
1.0.3.zip, pois todas funcionaro sem problemas com o
Editor - Java Magazine
cdigo nos artigos do frum (e do mural, na Edio 4),
Aprenda Java em 21 Dias, Av. 7 de Setembro, 4698, Conj.1501-1503
com qualquer verso do Tomcat de 4.0.3 em diante.
Professional Reference Curitiba-PR, CEP 80240-000
Laura Lemay e Rogers Cadenhead As novas verses da JSTL modificaram a distribuio Fax: (041) 242-4580.
531 pginas, R$ 109,00 dos tags em pacotes JAR e passaram a incluir pacotes
Cartas publicadas podem ser editadas por
ISBN 8535208658 externos necessrios para o suporte a algumas tags
motivos de clareza ou extenso.
(como o Xerces para as tags relacionadas com XML),

Edio 6 Java Magazine 5

jm6-book.indb 5 3/4/2003, 17:49:26


Java Ne w
Animais, hacks e livros

V oc f dos livros da OReilly, famosa por


seus animal books? Ento vale a pena
conhecer trs lanamentos importantes
Com foco mais tcnico, Java Data Objects
(dos autores David Jordan, Craig Russell)
trata da tecnologia para persistncia de ob-
Gerenciamento livre com Maven*
dessa editora norte-americana. jetos JDO, que vem causando frisson entre

O Maven nasceu para facilitar o geren-


ciamento dos subprojetos do Jakarta
Turbine, mas seus desenvolvedores perce-
os desenvolvedores e despontando como
alternativa (ou importante complemento)
ao mecanismo de persistncia dos EJBs.
beram que poderia ir muito mais longe. As-
sim, por uma deciso recente do comit do Um dos autores Craig Russel, lder da
Grupo Apache, a ferramenta foi promovida especificao de JDO na Sun portanto o
a Top Level Project . O Maven ainda est em leitor estar em boas mos. Procure por um
beta e ainda existe um longo caminho at o captulo de amostra em www.oreilly.com/
release final, no qual sero eliminados bugs catalog/jvadtaobj.
www.oreilly.com

e instabilidades em alguns plugins impor-


tantes, mas j vale a pena considerar o uso
da ferramenta em seus projetos.
O Maven se prope a automatizar e geren-
ciar vrios aspectos de um projeto, desde a O livro Java Extreme Programming
compilao, at a gerao de relatrios so- Cookbook (por Eric Burke e Brian Coyner)
bre a aderncia a convenes de codificao, demonstra a popularidade da combinao
passando pela documentao e download de Java com o Extreme Programming (XP),
de bibliotecas. A ferramenta se baseia em um processo de desenvolvimento leve es-
um arquivo XML chamado POM (Project Ob- pecialmente adequado para projetos com
www.oreilly.com

ject Model), contendo informaes tais como equipes pequenas ou mdias e adorado
nome, URL, desenvolvedores envolvidos,
por muitos desenvolvedores ressentidos
listas de discusso, testes a serem feitos e
dependncias. Para usar completamente as com processos burocrticos.
funcionalidades do Maven, os projetos deve- O livro explora as principais ferramentas
ro seguir uma certa estrutura de diretrios usadas no desenvolvimento Java seguindo O terceiro lanamento, Google Hacks
e arquivos (que nem sempre intuitiva mas os princpios do XP, tais como Ant, JUnit, (por Tara Calishain e Rael Dornfest), no
bem documentada). Cactus, Tomcat e XDoclet num atestado animal nem tampouco se concentra na
A documentao do projeto tambm da fora da tecnologia na criao de sof- tecnologia Java, mas igualmente importan-
pode ser gerada e gerenciada pelo Ma- tware de qualidade. O captulo sobre JUnit te, especialmente para o desenvolvedor que
ven. Configurando um arquivo chamado
pode ser baixado gratuitamente do site precisa se encontrar na abundncia de APIs,
navigation.xml, voc indica como deve ser
www.oreilly.com/catalog/jextprockbk. especificaes e notcias tecnolgicas.
gerado o site do projeto e como associ-
lo aos javadocs. Para auxiliar em projetos "Google Hacks" inclui 100 dicas sobre o
grandes, so identificadas dependncias, uso eficaz do Google, o mecanismo de
que depois so baixadas de repositrios busca usado para mais de 70% das pesqui-
na internet. sas realizadas da internet. So desde dicas
A flexibilidade do Maven se deve aos seus simples sobre configuraes avanadas,
muitos plugins, que j passam de 30. A maio- at o uso da API do Google com vrias
ria escrita sem usar Java diretamente, mas linguagens (incluindo Java, claro). O site
www.oreilly.com

sim com Jelly, uma linguagem de scripts do


hacks.oreilly.com/pub/ht/2 contm um
Jakarta.
resumo das cem dicas e libera oito para
Veja mais em maven.apache.org.
acesso gratuito.
*por Paulo Silveira

6 Java Magazine Edio 6

jm6-book.indb 6 3/4/2003, 17:49:27


Lanamentos e atualizaes de

e ws
produtos, novas tecnologias,
especificaes e estratgias

X-News*
Novo JAXP jaxp-api.jar contm as interfaces que faz parte do Java Web Services Developer Pack
Includa no pacote da Sun para desenvolvi- definem as APIs de parsing e transformao 1.1. Na nova verso, so suportados subcon-
mento de web services(JWSDP 1.1), a verso de XML, definidas na especificao final do juntos dos padres XML Schema e XML Na-
1.2.2 da implementao de referncia do JAXP 1.2 (JSR-63). As classes dos diferentes mespaces, e oferece recursos mais flexveis
JAXP (Java API for XML Processing) tem novi- fornecedores devem implementar essas para marshalling e unmarshalling, alm de
dades importantes. A principal a incluso do interfaces. novas funcionalidades de validao.
XLSTC (Compiling XSLT Processor), e a criao O download do JAXP feito como parte Com o JAXB possvel fazer um
de novas propriedades no parser XML que do JWSDP, em: java.sun.com/webservices/ mapeamento bidirecional entre documentos
aumentam a segurana no processamento downloads/webservicespack.html. XML e objetos Java, permitindo a manipulao
de mensagens SOAP. de XML atravs de Java em vez das APIs SAX e
Caminhos com JXPath DOM, isolando o desenvolvedor de detalhes
A especificao do JAXP define uma camada
J est disponvel a verso 1.1 do JXPath, internos do XML como parsing, namespaces
de abstrao para o processamento de XML,
biblioteca do Jakarta Commons que define e eventos. Para comear a usar a API, deve-se
que inclui parsing (usando DOM ou SAX)
um interpretador para a linguagem XPath. definir um XML Schema. O schema tem um
e transformaes de documentos usando
XPath (XML Path Language) uma lingua- objetivo semelhante a um DTD, porm mais
uma folha de estilos XSL. A implementao
gem de expresses criada pelo W3C para uti- abrangente e escrito em XML.
de referncia inclui vrias bibliotecas do
lizao em folhas de estilos XSL e expresses O suporte a schemas a grande novidade na
grupo Apache:
XPointer (usadas para referenciar fragmentos nova verso do JAXB as verses anteriores
xercesImpl.jar Xerces, parser XML pa-
de um documento XML qualquer atravs de suportavam apenas DTDs. O desenvolvedor
dro do JAXP. A nova verso includa (2.2.1)
uma URI). Com XPath, possvel selecionar que usa DTDs em seus sistemas poder fazer
contm vrias correes de bugs e melhorias
ns de um documento XML de acordo com a migrao para schemas usando ferramentas
de desempenho;
critrios especificados. livres como o Trang (ver nota neste quadro).
xalan.jar Xalan, processador XSLT
Com o JXPath possvel ir alm, usando O JAXB define trs operaes principais:
padro do JAXP, suporta XSLT 1.0 e XPath 1.0,
XPath sobre JavaBeans, colees, arrays, Binding, Marshal e UnMarshal :
e implementa as interfaces definidas pelo
ns DOM/JDOM, contextos de servlets, ou Binding a partir de um schema, um utili-
TraX (Transformation API for XML). A verso
em combinaes desses. Outra vantagem trio fornecido pelo JAXB, chamado de bind
do Xalan foi atualizada da 2.3.1 para a 2.4.1,
do JXPath a reduo do nmero de linhas compiler, gera automaticamente classes
que tem maior desempenho e muitos bugs
de cdigo para a navegao em estruturas e interfaces que mapeiam os
corrigidos;
complexas, evitando o uso de intenso de elementos definidos;
xsltc.jar XSLTC, uma alternativa oferecida
loops aninhados, expresses condicio- UnMarshal usando um ob-
pelo Xalan para a realizao de transforma-
nais e casts. jeto UnMarshaller, possvel
es XSLT. Compila a folha de estilo XSL
Entre as novidades do JXPath 1.1 criar uma rvore de objetos que
dando origem a um Translet, formado por
est o suporte completo a JDOM e reflete a organizao e a hierarquia
bytecodes Java que realizam a transformao.
a contextos relativos, e a cober- do documento XML so instncias
A abordagem XSLTC aumenta o desempenho
tura estendida da sintaxe do das classes geradas pelo bind compi-
de transformaes XSLT, visto que uma folha
XPath para modelos no-XML. ler. O JAXB permite que seja feito um
de estilo compilada uma s vez e todas as
Foram adicionadas tambm unMarshal em arquivos XML, em
transformaes subseqentes so realizadas
funcionalidades aos objetos dados XML obtidos de um InputS-
pelo Translet gerado;
Pointer, que podem armazenar tream, URL ou eventos SAX, entre
dom.jar implementa suporte a DOM a localizao de um elemento ou outras fontes possveis.
(Document Object Model) level 2. O DOM le- grupo de elementos dentro de uma hierar- Marshal um objeto Marshaller cria docu-
vel 3, que incluir suporte ao XPath e vrias quia, para uso posterior. mentos XML a partir de uma rvore de obje-
melhorias (por exemplo, o tratamento de Documentao e download em: tos que representam a estrutura do schema.
eventos de teclado e a possibilidade de alte- jakarta.apache.org/commons/jxpath possvel fazer uma validao baseada no
rao dinmica do documento), suportado
schema antes de realizar a converso.
experimentalmente no Xalan; Mapeamento XML/Java
Veja mais em java.sun.com/xml/jaxb.
sax.jar implementao do suporte a SAX A verso 1.0 final do JAXB (Java Architecture
2.0 (Simple API for XML); for XML Bindind) outra importante API que * por Gustavo Nalle Fernandes

Edio 6 Java Magazine 7

jm6-book.indb 7 3/4/2003, 17:49:35


Comunida
A fora de Java no Brasil
Listas SouJava*
Q uando precisamos resolver um problema para
o qual no conseguimos encontrar a soluo,
o ideal contar com um amigo ou colega mais
Java. E a [dicas-list] , com cerca de 2.400 assinan-
tes, fornece dicas gerais sobre a tecnologia Java.
Veja na tabela os assuntos tratados em cada lista,
Duke do Cangao experiente, para servir de guru. s vezes, um pro- alm do e-mail para inscrio e o nmero de ins-
blema que nos aflige por horas pode ser imedia- cries (em abril de 2003). Para realizar pesquisas

O Nordeste ganhou mais um importante


JUG. o PBJUG, Grupo de Usurios
Java da Paraba, inaugurado no dia 15 de
tamente resolvido ou pelo menos encaminhado
com um simples comentrio de quem j passou
por isso. Pena que nem sempre podemos contar
no histrico, use URLs com o formato:
www.mail-archive.com/<lista>@soujava.org.br
Por exemplo:
maro no auditrio do CEFET-PB. A primeira com algum assim no nosso dia-a-dia. Mas, para www.mail-archive.com/java-list@soujava.org.br
reunio contou com a presena de 80 pes- ajudar nessas horas, que existem as listas de dis- A participao nas listas gratuita, e os partici-
cusso, baseadas em e-mail ou fruns na web. pantes so muito colaborativos. Mesmo assim, veja
soas e se estendeu por um dia inteiro.
Na Sociedade de Usurios Java (SouJava), algumas dicas simples que certamente tornaro
A abrangncia das palestras foi grande
milhares de profissionais se renem em algumas sua participao mais produtiva:
no evento de lanamento. Na apresentao das mais importantes listas de discusso sobre a Antes de enviar uma questo para a lista, tente
de abertura, foi demonstrada a ferramenta tecnologia Java no Brasil. Com mais de 10 mil resolver o problema e, ao perguntar, indique o que
e-Gen Developer em desenvolvimento por inscries, as listas do SouJava so uma opo voc j tentou fazer para resolv-lo;
uma equipe liderada por Ronaldo Costa e para voc ajudar e solicitar ajuda nas mais diversas Se voc um usurio novo na lista, participe
Anderson Teixeira, gerentes das Lojas tecnologias Java. As listas so segmentadas por por alguns dias como ouvinte. Acompanhe as
Maia. Seguiram-se duas palestras sobre rea de interesse, todas as mensagens so arqui- discusses para entender o comportamento e
experincias prticas em projetos Java, vadas e possvel realizar pesquisas no histrico os tpicos, sem submeter perguntas. Assim, voc
por Marcelo Castro (Politec) e Jos Marco- de cada lista, tendo assim acesso ao conhecimento passa a conhecer melhor os participantes da lista
ni (Qualiti). Retomando o enfoque tcnico, acumulado nas centenas de milhares de mensa- e evita fazer perguntas que no condizentes com
gens enviadas. o estilo da lista;
o professor Frederico Guedes (CEFET-PB)
O SouJava mantm tambm duas listas de in- Ao enviar uma pergunta, inclua toda a infor-
tratou da API de Collections, uma das mais
formao bastante populares. A [noticias-list] , mao relevante, especialmente as mensagens
elegantes e ricas do J2SE. A seqncia de com mais de 3.900 assinantes, divulga notcias de erros que voc encontrou.
palestras foi concluda com uma viso ge- sobre a tecnologia e a comunidade Java, even- Mais informaes sobre as listas do SouJava
ral do mercado Java no Pas, por Rodrigo tos e atividades do SouJava e de outros grupos podem ser obtidas em www.soujava.org.br/
Assad do C.E.S.A.R. (Centro de Estudos e de usurios de todo o Pas. Atravs dessa lista, listas.html.
Sistemas Avanados do Recife). publicado o SouJava News, um boletim que traz,
Durante o evento, patrocinado pela semanalmente, notcias e links importantes sobre *por Bruno Souza
Oracle do Brasil e Connect Solues In-
Listas de discusso
tegradas, e apoiado pela Java Magazine e
CEFET-PB, ocorreram sorteios de brindes Lista Contedo Inscritos Inscrio
da Oracle e exemplares da Java Magazine. Discusses gerais sobre a tecnologia Java: linguagem, java-list-subscribe@
Para participar dos sorteios, foi solicitado [java-list] 1.800
compilao, ferramentas e APIs soujava.org.br
um quilo de alimento; o arrecadado foi do-
Uso de Java no ambiente servidor. Acesso a bancos de
ado Casa de Apoio Criana com Cncer enterprise-list-subscribe@
[enterprise-list] dados, servidores de aplicaes, servlets/JSP, EJB e J2EE 910
de Joo Pessoa. soujava.org.br
em geral so os principais assuntos
Os coordenadores Herval Freire (Con-
nect), Marcelo Castro (Politec) e Frederico
Java em pequenos dispositivos, abordando J2ME, j2me-list-subscribe@
[j2me-list] 570
Guedes (CEFET-PB) j planejam as prximas
JavaCard, celulares com suporte a Java e ferramentas. soujava.org.br
reunies (mensais). Alm das obrigatrias Padronizao da tecnologia Java, o processo JCP, padronizacao-list-subscribe@
[padronizacao-list] 450
palestras tcnicas, esto previstas apre- especificaes soujava.org.br
sentaes sobre casos de sucesso e novos Discusses sobre o evento JavaOne. Ajuda na submisso javaone-list-subscribe@
[javaone-list] 340
produtos. O PBJUG mantm uma lista de de palestras, formao de caravana para o evento etc. soujava.org.br
discusso em groups.yahoo.com/group/ Listas de informao
pbjug. Participe!
Notcias, eventos, SouJava News, anncios de noticias-list-
[noticias-list] 3.900
empregos subscribe@soujava.org.br
dicas-list-
[dicas-list] Dicas gerais sobre a tecnologia Java 2.400
subscribe@soujava.org.br

8 Java Magazine Edio 6

jm6-book.indb 8 3/4/2003, 17:49:37


de Pessoas, grupos e
empresas que tornam
forte o Java no Pas

l
LEONARDO GALVO

JustJava se aproxima
O primeiro grande evento de Java do ano j
est com data, local e principais patrocina-
dores confirmados. O JustJava 2003 acontecer
Ofcio (problemas e solues do dia-a-dia do
desenvolvedor).
Funcionando em paralelo s palestras, haver
cimento nas apresentaes, poder fazer os dois
no JustJava 2003 sem peso na conscincia.
Alm das palestras, haver trs keynotes (apre-
nos dias 26 e 27 de abril, no Centro de Conven- um Pavilho de Exposies, que incluir, alm sentaes especiais usando o espao de vrias
es Frei Caneca (Rua Frei Caneca, 569, Cerquei- de estandes de empresas, um amplo espao salas) dois no primeiro dia (manh e tarde) e
ra Csar, So Paulo-SP). O evento tem apoio da de convivncia. Um dos principais objetivos do um na manh do domingo. Fechando o sbado,
SUCESU-SP e j conta com dois patrocinadores Pavilho promover o networking haver um coquetel e um conjunto de
Master: IBM e Oracle. Mais de mil participantes e a troca de conhecimentos entre os discusses informais, no estilo dos
so esperados e intenso o interesse de empresas participantes. Para maximizar essa in- antigos BOFs das primeiras edies do
em fazer parte do evento. terao, os intervalos entre palestras JavaOne.
As cerca de 40 de palestras tcnicas e geren- tero durao estendi- H ainda muitas sur-
ciais do Evento da Comunidade Java Brasileira da ser reservado pelo pre sas prometidas.
ser dividido em sete tracks : Java no ambiente menos meia hora para Acom panhe as ltimas
servidor, Java em Pequenos Dispositivos, Core cada coffee-break, com novidades no site
Java: Linguagem e APIs, Ferramentas, Solues e a possibilidade de intervalos maiores. Portanto, www.justjava.com.br, ou inscreva-se na lista de
Produtos; Casos de sucesso; Outras Tecnologias se voc rato de palestra e fica divido entre a notcias do evento, enviando um e-mail para
Relacionadas a Java (Jini, JXTA etc.); e Ossos do animao dos corredores e a aquisio de conhe- evento-justjava-subscribe@soujava.org.br.

Brasil 10 no JavaOne 2003

A presena brasileira no JavaOne 2003 (So


Francisco, EUA, de 10 a 13 de junho) ser pelo
menos duas vezes maior neste ano que na ltima
tes conseguido por equipes brasileiras duas
business sessions (abreviadas por BUS), duas
technical sessions (TS) e seis BOFs (birds-of-a-
A tabela apresenta os palestrantes e as pales-
tras (com ttulos originais em ingls) observe a
variedade e a relevncia das palestras aprovadas.
edio do evento. J so 10 palestras aprova- feather, palestras mais especficas, ministradas mais uma prova da crescimento, tanto quantita-
das, algumas com destaque especial nunca an- no perodo da noite ou madrugada). tivo quanto qualitativo da nossa comunidade.

Ttulo Id. Palestrantes


The Brazilian National Health Card Project: Building the National Health Informatics Rosani Cunha, Beatriz Leo (Ministrio da Sade); Manoel Lemos
BUS-2680
Infrastructure (Singularity Systems)

Webhosting JavaServer Pages (JSP)/Servlets Securely Using open-source products BUS-1771 Renato Weiner (LocaWeb)

Felipe Leme, Antonio Gois (Seed Technology Solutions) e Wladimir


Java Technology Logging: The Past, the Present and the Future TS-2148
Domingues (SeedTS Technology Solutions)
Beyond Web Services: Combining Jini Network Technology and Project JXTA to take Bruno Souza (SouJava); Carlos Queiroz (IME/USP); Einar Saukas (Summa
TS-2220
Advantage of Edge Computing Technology)

Automatic Internationalization using Web Services BOF-1205 Diueine Monteiro (Bluebox Technologies); Cludio Teixeira (Procwork)

Java Technology and Financial Systems Integration in Brazil BOF-1610 Diueine Monteiro e Carlos Villela (BlueBox Technologies)

Enterprise Java Technology-Based Projects that Fail: What Can We Learn from Them? BOF-1824 Michael Santos (Tesla Tecnologia)

Real-Time Human Motion Capture Using Java Technology BOF-2059 Nilton Guedes (Sun Microsystems do Brasil); Analvia Cordeiro (PUC-SP)

Introduction to Enterprise Application Integration (EAI) and the J2EE Connector


BOF-2534 Rodrigo Abreu (Beng Informtica); Yara Hornos (Globalcode)
Architecture
Gustavo de Paula (C.E.S.A.R); Fernando Nascimento (Motorola Brazil Design
Considerations in Implementing a MIDP IM Client BOF-2985
Center)

Edio 6 Java Magazine 9

jm6-book.indb 9 3/4/2003, 17:49:42


A Vida, o Univeso e Tudo Mais

Java no De s
Parte 2: Toolkits, distrib u

controle. Nesses casos, quais as al- todo um modelo de tratamento de eventos


ternativas para gerar aplicaes que que no faz parte do mundo web.
paream locais? Aplicaes que se pa- Mas no se desespere Java pode vir em
ream mais com uma srie de janelas, seu socorro. Existem alguns toolkits que
com botes e menus, do que um conjunto se propem a fazer exatamente isso: dis-
de pginas? A maioria segue o caminho ponibilizar uma interface local usando
de criar aplicaes usando uma mistura de tecnologias web e fornecendo o suporte
HTML e (toneladas de) JavaScript. necessrio para faz-lo corretamente. Es-

N
a primeira parte deste artigo (In- muito comum encontrar sistemas nessa ses chamados toolkits so, na verdade,
terfaces, usurios e alternativas, situao centenas de pginas HTML que frameworks de desenvolvimento web
Edio 5) tratamos dos tipos de parecem mais descries do layout de uma que simulam, em uma aplicao baseada
usurios de uma aplicao e vimos como janela do que documentos; milhares de li- no browser, um toolkit de janelamento
diferenciar os usurios internet, intranet nhas de JavaScript, simulando funcionali- completo.
e extranet. Vimos tambm quais tecnolo- dades bsicas que encontramos em botes e Trabalhando, por trs, com servlets e JSPs,
gias nos permitem criar aplicaes locais campos de texto to comuns em aplicaes e com HTML e JavaScript pela frente, mas
(desktop) sofisticadas com a tecnologia locais; e em geral, uma grande confuso de forma componentizada e transparente
Java. para juntar essas duas coisas. para o desenvolvedor, os toolkits web per-
Mas existe muito mais em fornecer uma Tudo isso quase sempre feito para criar mitem que voc desenvolva uma aplicao
aplicao local do que apenas criar jane- uma aplicao local que no precisa ser web da mesma forma que desenvolve uma
las com o Swing. A tecnologia Java traz instalada. E num esforo de criar uma local. Em vez de criar servlets e tratar cha-
o suporte necessrio para a integrao aplicao-web-com-cara-de-local, esses madas e parmetros HTTP, permitem que
de clientes e servidores em uma soluo sistemas acabam num emaranhado de voc desenvolva aplicaes baseadas em
nica. Como distribuir e atualizar essas cdigo JavaScript difcil de manter, difcil eventos, como em aplicaes locais tpicas.
aplicaes? Mas como podemos distribuir de componentizar e, em particular, quase Ao invs de codificar e devolver pginas
essas aplicaes, e a prpria JVM? Vamos impossvel de portar para vrios browsers HTML cheias de cdigo JavaScript escri-
juntos conhecer as tecnologias que resol- (s vezes, at para verses diferentes de to mo, voc cria janelas, botes, abas,
vem essas questes. um mesmo browser). Procurando evitar a checkboxes, todos os componentes com
E o que fazer quando uma aplicao local instalao local da aplicao, esses sistemas os quais voc est acostumado em uma
no uma opo, mas sua aplicao tem muitas vezes tornam obrigatria a instala- aplicao local.
muito mais caractersticas de aplicao o de uma nova verso do browser, sob Assim, o cdigo de aplicaes web fica
local do que web? Vimos na primeira par- pena de excluir usurios. to similar a uma apli-
te que essas aplicaes so exigidas pelos E o pior, nem ao menos cao tradicional que,
nossos usurios intranet ou extranet, mas conseguem a interativi- Toolkits web permitem de- pelo menos no wingS
na prtica nem sempre temos a opo de dade desejada! senvolver aplicaes web da (um desses toolkits),
instalar algo local. Podemos ento comear Portanto se voc no mesma forma que locais, base- transform-las de local
por conhecer algumas solues Java que tem como evitar fazer ando-se em eventos, como em para web uma questo
nos ajudam nessa tarefa. uma aplicao baseada aplicaes locais tpicas de trocar Js por Ss
no browser, pelo menos (trocar por exemplo um
Toolkits web no caia na armadilha de JButton do Swing por um
Existem situaes nas quais voc precisa tentar simular uma aplicao local "na mar- SButton do WingS).
gerar interfaces sofisticadas, mas fica preso ra". Desenvolver uma aplicao baseada em Existem vrios desses toolkits, todos
ao browser, prefere no ter a interatividade servlets e JSP, mas com aparncia e interati- voltados para a criao de aplicaes com
de uma aplicao local, ou simplesmente vidade quase local, no uma tarefa fcil, aparncia, interao e modelo de desen-
no tem opo, por motivos fora do seu especialmente porque voc precisa simular volvimento de aplicaes locais, mas para

10 Java Magazine Edio 6

jm6-book.indb 10 3/4/2003, 17:49:44


Tcnicas e ferramentas para

e sktop facilitar a disseminao


de Java no desktop

b uio e instalao
BRUNO SOUZA

serem executadas no ambiente web, sem servlets/JSP tradicional, voc usa apenas (onde as informaes do usurio no trafe-
nenhum tipo de plugin ou instalao. No um componente integrado. gam na rede, ou no so armazenadas fora
so perfeitos para todos os tipos de aplica- da mquina dele); desempenho (por mais
es e certamente no resolvem todos os Distribuio de aplicaes rpida que seja a rede, sempre queremos
problemas citados (afinal, continuam no Toda essa histria de interatividade pode mais velocidade). E, certamente, olhando
sendo uma aplicao local, mas sim uma parecer muito interessante no papel, mas suas aplicaes locais, voc vai encontrar
aplicao web, rodando no servidor), mas a realidade que de nada adianta ter uma outros motivos para us-las localmente ao
para quem no tem opo, pode ser uma aplicao interativa se for necessrio voltar invs de mant-las rodando sempre no
excelente opo! ao passado e ficar instalando aplicaes servidor.
Entre os mais sofisticados toolkits desse nas mquinas dos usurios. Relembrando, as aplicaes que precisam
tipo est o j citado wingS, que se posiciona Afinal, no foi para eliminar isso que a dessas funcionalidades so em geral para
como Swing na web; segue exatamente a web foi inventada? Bem, na verdade, no. o usurio intranet, aquele que usa a aplica-
mesma API do Swing (se voc um progra- A web foi inventada o sempre e quer algo
mador Swing, ir se surpreender ao se tor- para disponibilizar melhor, mais rpido,
nar, do dia para a noite, um programador documentos, no apli- A web foi criada para dis- menos repetitivo, mais
web). A aplicao de demonstrao desse caes. Se conseguimos ponibilizar documentos, no interativo, menos co-
toolkit, por exemplo, reproduz boa parte chegar aonde estamos aplicaes. Se conseguimos nectado, mais seguro.
das funcionalidades do demo do Swing. porque, como acontece chegar aonde estamos porque Se no o caso do sua
Outro toolkit que vale a pena ser inves- em muitos casos com foramos muito a barra aplicao, tudo bem.
tigado o Millstone. Ele possui uma API a tecnologia, foramos Se for, mesmo com os
prpria e no segue o Swing, mas suas muito a barra. Mas, toolkits web que citei,
funcionalidades so to impressionantes ainda assim, muitas aplicaes podem ser voc estar em maus lenis se tentar forar
quanto s do wingS. As customizaes encaradas como uma srie de documentos. uma aplicao com essas necessidades em
dos diversos componentes e a capacidade Essas aplicaes so parte importante do um ambiente web. E com certeza voc j
de serem executados mesmo em browsers mundo web e funcionam muito bem. viu isso acontecer, seja como usurio, seja
sem suporte a JavaScript (com um certo Mas e no caso de aplicaes precisam de como desenvolvedor. Em geral, aquela
prejuzo em relao apresentao, mas uma interatividade maior? Voc pode for- nova verso da aplicao que no tem
no s funcionalidades) fazem do Mills- ar a barra (mas nesse caso, no reinvente a as funcionalidades nem as facilidades que
tone um toolkit a ser analisado se voc roda use um toolkit web como os citados). seu usurio contava na verso antiga.
precisa elevar a inteligncia do browser, Mas porque no fazer o que o usurio est Mas o fato de uma aplicao rodar local-
nosso terminal burro colorido. realmente pedindo e desenvolver uma mente, no significa que no possa tirar
Se voc precisa de uma aplicao com aplicao local? proveito da rede! Se temos a rede, podemos
mais cara de aplicao web mesmo, tal- Alm de apresentar interatividade com o fazer o processo de instalao automtico;
vez queira dar uma olhada no Tapestry, usurio muito melhor, existem diversas ra- assim, seu usurio faz tudo integrado ao
um framework mais tradicional, voltado zes para termos aplicaes locais mani- browser. Ser que isso tambm no um
para a gerao de HTML. Mas, em vez pulao visual de elementos grficos (gr- tipo de aplicao web?
voc ter que lidar com a integrao de ficos, diagramas, imagens); processamento
JavaScript com seus servlets, o Tapestry distribudo (onde queremos que algumas Applets e Java Web Start
fornece a noo de componentes que inte- coisas no rodem no servidor); cache local Com o browser HotJava, a tecnologia Java
gram os lados servidor (servlets) e cliente de informaes (para acelerar o acesso); uso introduziu, em 1995, a noo de aplicaes
(HTML+JavaScript) em um componente desconectado da aplicao (nem sempre d carregadas automaticamente via rede: os
reutilizvel. Assim, ao invs de ficar se pra contar com a rede); replicao de infor- applets Java. Foi uma revoluo. Por causa
debatendo para juntar as duas coisas maes (tanto para velocidade, como para desse conceito, que hoje parece simples, a
froa, como em um desenvolvimento de diminuir a carga no servidor); segurana web ganhou uma nova expresso e a tecno-

Edio 6 Java Magazine 11

jm6-book.indb 11 3/4/2003, 17:49:49


A Vida, o Universo e Tudo Mais

logia Java foi parar em todos os jornais. um futuro prximo. tem uma aplicao local que, a partir da
Muitos desenvolvedores Java de hoje O funcionamento do JWS simples e segunda execuo, inicializa imediata-
desconsideram applets como uma soluo afeta muito pouco o trabalho de desenvol- mente (sem download), completamente
vivel para a distribuio de aplicaes, vimento de uma aplicao. Basicamente, interativa, pode funcionar desconectada da
parte disso graas ao esforo que a Micro- uma aplicao gerenciada pelo JWS rede e tirar proveito de todas as vantagens
soft fez para destruir ao mesmo tempo Java automaticamente baixada e instalada lo- da execuo local.
e a Netscape. calmente, na primeira vez que o usurio a Se voc considerar o usurio intranet e o
A Justia norte-americana exps os deta- utiliza. Para instalar a aplicao, o usurio usurio extranet, que usam a aplicao dia-
lhes srdidos e declarou precisa apenas clicar em riamente, o JWS permite que voc fornea a
que essa tentativa foi um um link. A partir da, a aplicao com as funcionalidades que eles
No tente simular uma aplica-
esforo premeditado e aplicao fica em uma precisam: verdadeiramente multiplatafor-
ilegal. Se voc daque-
o local: fornea a aplicao espcie de cache local ma, independente da verso de browser e
les que ouviu dizer que local que seu usurio precisa, e no precisa mais ser livre de milhares de linhas de JavaScript
a Microsoft melhorou mas com as vantagens de uma baixada. A cada execu- (praticamente impossveis de manter). No
a mquina virtual Java, aplicao web o da aplicao, o JWS tente simular uma aplicao local, fornea
sugiro que leia o proces- verifica se necessrio a aplicao local que seu usurio precisa,
so para ver o que eles tentaram fazer com baixar uma nova verso e, caso positivo, mas com as vantagens de uma aplicao
a sua liberdade de escolha jogar no lixo, carrega apenas as diferenas entre a verso web.
como fizeram ao lanar o .NET e de que atual e a nova. Uma vez instalada localmen-
forma eles prejudicaram a JVM. Juntamente te, a aplicao pode ser executada a partir Instaladores
com o grande prejuzo causado aos usu- do browser, ou inicializada a partir de um A criao de instaladores outra pos-
rios em diversas reas, no que diz respeito cone no desktop do usurio, sem qualquer sibilidade para distribuir de aplicaes
a Java tivemos uma estagnao das JVMs dependncia do browser. Java e permitir seu uso em um ambiente
existentes nos browsers, o que afastou os O JWS tambm pode fazer uma atualiza- no necessariamente web. O mais conhe-
desenvolvedores dos applets, exatamente a o automtica da mquina virtual: se sua cido gerador de instaladores e votado o
tecnologia que causou uma das mais revo- aplicao solicitar uma verso especfica da melhor pela comunidade Java o Ins-
lucionrias mudanas de mentalidade no JVM que no esteja disponvel, ela au- tallAnywhere da ZeroG. Suporta vrios
desenvolvimento de aplicaes... tomaticamente baixada e instalada. Alm tipos de instalao e capaz de gerar
Por outro lado, outra parte da culpa recai disso, vrias verses da JVM podem co- instaladores nativos (.exe, .rpm etc.), auto-
sobre ns mesmos desenvolvedores Java, existir em uma mesma mquina. instalar a JVM e realizar a instalao dire-
que, como vimos, decidimos nos refugiar No Windows, se na primeira vez que ten- tamente da web, alm de suportar outras
na utilizao da interface web. Desde a tar executar a aplicao no for encontrado funcionalidades e configuraes teis na
verso 1.2 da tecnologia Java que temos o JWS ou no houver uma mquina virtu- distribuio de aplicaes Java.
primeiro com o Java Plugin e, mais al instalada, o download e a instalao de O InstallAnywere possui uma verso
recentemente, com o Java Web Start as ambos acontecer automaticamente, sem gratuita, o InstallAnywhere Now! , que
ferramentas que precisamos para distribuir a necessidade de interao do usurio. E suporta as funcionalidades bsicas de um
aplicaes Java para qualquer browser, o download da JVM pode ser feito a partir instalador e pode ser utilizada comercial-
mesmo as verses mais antigas. Conhe- de um servidor na sua mente. Com essa ver-
cendo e utilizando o que j temos h tanto prpria rede local, o que so, desenvolvedores
tempo, podemos nos libertar da priso do torna o JWS uma solu- Uma aplicao gerenciada pelo Java no tm desculpa
browser, e em grande estilo. o muito eficiente para Java Web Start automati- de no fornecer uma
O Java Web Start (JWS) uma soluo aplicaes internas. camente baixada e instalada aplicao local fcil
completa de distribuio, atualizao e O Java Web Start pos- localmente. Para fazer a insta- de instalar para seus
gerenciamento de aplicaes. Gratuito, faz sui outras caractersti- lao basta clicar em um link usurios.
parte do Java Runtime Environment (JRE) e cas que esto definidas A ZeroG oferece tam-
instalado automaticamente quando ins- na especificao do Java bm o PowerUpdate,
talada a plataforma Java (1.4.x em diante). Network Launching Protocol (JNLP), uma espcie de concorrente do Java Web
No caso do MacOS X e do Solaris, o JWS j que trata do download e da instalao de Start, que permite atualizar aplicaes
faz parte da instalao do prprio sistema aplicaes atravs da rede veja o quadro automaticamente pela internet. Apesar de
operacional, e pelo menos quatro distri- JNLP. possuir funcionalidades adicionais interes-
buies Linux incluem o JRE contendo o Portanto, utilizando o JWS voc passa a santes, como o registro do uso da aplicao
JWS. Por conta de uma deciso recente da ter as vantagens de uma aplicao web, com (para eventuais cobranas), o PowerUpdate
justia americana, que considerou a Micro- integrao com o browser e acesso via link no gratuito.
soft culpada de aes monopolistas contra no site, sem a necessidade de ter a aplicao
a tecnologia Java, at mesmo possvel que instalada localmente, e acessando a ltima O .NET morde?
o JWS passe a fazer parte do Windows, em verso disponvel. Ao mesmo tempo, voc Muito se tem falado da disputa entre o

12 Java Magazine Edio 6

jm6-book.indb 12 3/4/2003, 17:49:50


J2EE e .NET, ultimamente. Apesar de ser Java, importante sair do casulo. No se A separao bem definida que temos no
um assunto para outro artigo, no contexto iludam. Apesar das bvias deficincias, mundo do J2EE, entre lgica de negcios
de aplicaes desktop, vale fazer algumas .NET tem um ponto a seu favor: a Micro- e lgica de apresentao, existe com esse
consideraes. Para quem no lembra, o j soft conhece o cliente e sabe que interfa- objetivo. Esse o principal ganho dos En-
renomeado e mais uma vez adiado .NET ces meramente web no bastam. Espere terprise JavaBeans.
uma reao (ou inao?) da Microsoft, que ver no futuro prximo a concorrncia de Outras tecnologias Java tambm do su-
passou muito tempo negando a importn- aplicaes interativas, baseadas em clientes porte no backend para diferentes tipos de
cia da tecnologia Java e dos servidores de Windows e que, por isso mesmo, sero mais interao com o usurio. o caso da tecno-
aplicao J2EE. atraentes do que as vitaminadas mas j logia Jini e seu sensacional ServiceUI, que
Como resposta ao que eles repetiram, no to poderosas interfaces web. O risco permite a criao de sistemas camalees,
exausto, ser um modelo errado, lana- para a nossa liberdade de escolha no o capazes de fornecer diferentes interfaces
ram no mercado um conjunto de tecnolo- .NET monopolizar o servidor, mas sim vir para o mesmo servio, de acordo com
gias que so uma verdadeira rendio ao a expandir o monoplio do cliente. as necessidades e a forma de acesso do
modelo Java: existncia de uma mquina E a verdade que, h muito tempo, Java usurio.
virtual (mas para uma nica plataforma possui as tecnologias para tirarmos pro- Ao contrrio de outros ambientes, em
escreva uma vez e rode s nela mesmo!), veito das interfaces sofisticadas no cliente, particular o .NET, que procura transfor-
linguagem semelhante a Java e, em par- tecnologias muito mais sofisticadas do que mar tudo em web services na verdade
ticular, o modelo do servidor .NET, ab- as que o ambiente Microsoft proporciona. engessando seu desenvolvimento , a
surdamente semelhante ao modelo J2EE Precisamos apenas conhec-las e comear tecnologia Java no se limita a um nico
(semelhante, mas sem funcionalidades a utiliz-las, e as tecnologias apresentadas modelo; pode ser utilizada de diferentes
importantes como integrao com outros neste artigo j indicam o caminho. formas. J2EE, Jini, JavaSpaces, P2P, JXTA
sistemas, session beans ou persistncia au- e Grid Computing so algumas que j
tomtica). E tudo isso, sendo uma tecnolo- Java no backend, sempre! citamos nesta coluna, e que suportam o
gia proprietria sobre a qual, s eles (e logo De tudo que falamos nas duas partes des- desenvolvimento dos servios que sero
eles!) tm controle. Em suma, um daqueles se artigo, fica claro que fundamental que acessados por seus usurios, no impor-
casos patolgicos da indstria onde uma a sua arquitetura seja capaz de suportar tando o tipo de interao que exijam. Ou-
empresa prope que agora mudamos de diferentes tipos de interfaces. Aplicaes tros modelos existem como, por exemplo,
idia, televiso de fato divertida, mas a locais em desktops, MIDlets em celulares o uso de JavaSpeech, JMX, ou mesmo web
nossa preto-e-branco e sem som muito e PDAs, interfaces web para clientes no services? A tecnologia Java muito mais do
melhor que a colorida!. Com o histrico browser... voc vai precisar delas. Para que apenas servidores web turbinados.
de instabilidade dos ambientes Windows, isso, a tecnologia Java oferece o suporte no Como o suporte a mltiplos tipos de inter-
a melhor definio que vi at agora do .NET backend para voc definir e implementar faces fundamental, dentro da tecnologia
foi write once, crash everywhere... sistemas que possibilitam suportar diferen- Java a especificao J2EE Client Provisio-
Apesar disso, para os desenvolvedores tes interfaces com o usurio. ning (JSR-124), que trata exatamente de for-

JNLP

O Java Network Launching Protocol,


definido pela JSR-56, a especifica-
o que permite a mgica do Java Web
itens que estaro disponveis para a exe-
cuo da aplicao, e podem ser baixados
parte;
de verses que j estejam presentes;
JARDiff: comparao das verses e carre-
gamento de apenas o que for preciso para
Start (JWS). A especificao define como Suporte para carregamento imediato, completar o .jar da nova verso, diminuindo
integrar esse protocolo a um servidor web, ou somente quando for necessrio, tanto drasticamente o tamanho da atualizao;
como o cliente deve acessar a informao, da aplicao como de bibliotecas exter- Suporte ao carregamento e instalao
o formato dos arquivos, enfim, tudo o que nas, permitindo com que a aplicao seja de JVMs diferentes;
necessrio para se criar instaladores em carregada aos poucos, e somente as partes Interao com o ambiente nativo, in-
Java que suportem a atualizao dinmica necessrias; cluindo manipulao de arquivos, uso do
de aplicaes. Algumas das funcionalidades Carregamento de bibliotecas e arquivos clipboard e da persistncia local de dados,
interessantes do JNLP incluem: .jar especficos de plataforma, permitindo mesmo para aplicaes no assinadas;
Empacotamento padro para aplica- que s sejam carregadas as bibliotecas Segurana: assinatura de aplicaes, do-
es, incluindo informaes sobre a apli- nativas referentes ao sistema operacional wnload seguro, ambiente controlado para
cao, fornecedor, pgina web e cone da do usurio; execuo de aplicaes no-assinadas.
aplicao; Versionamento da aplicao e de biblio- O Java Web Start uma implementao
Suporte a recursos externos: bibliotecas tecas: a aplicao pode ser atualizada para do JNLP; portanto, suporta todas essas
Java, bibliotecas nativas e propriedades as verses necessrias, evitando downloads caractersticas.

Edio 6 Java Magazine 13

jm6-book.indb 13 3/4/2003, 17:49:51


A Vida, o Universo e Tudo Mais

necer clientes diferentes para uma mesma consultores, gerentes tcnicos e diretores for? J que j ganhamos a fama de ser o
aplicao de servidor. Com essa especifica- de tecnologia o entendimento do que pas da pirataria, vamos piratear algo
o que j est disponvel e possui uma possvel fazer, alm da capacidade de que gratuito, e colocar Java em todos os
implementao de referncia voc pode mostrar o melhor caminho. lugares.
disponibilizar o mesmo backend para v- E, se para isso necessrio fazer um do- Como desenvolvedores Java, temos
rias aplicaes clientes, e o seu servidor de wnload de alguns megabytes da mquina condies de dar aos nossos usurios as
aplicaes ir escolher a interface adequa- virtual, uma nica vez, dentro de nossas aplicaes que eles precisam. No existe
da, dependendo da forma que seu usurio redes internas, vamos fazer! Na verdade, problema nenhum em disponibilizar uma
acessa a aplicao. O usurio recebe uma que tal j aproveitar e levar a JVM em um aplicao web para os usurios espordicos;
aplicao local atravs do Java Web Start se CD e instalar em todos os lugares que voc apenas no fuja de fornecer uma aplicao
estiver utilizando um ambiente de desktop, sofisticada para o seu usurio intranet. Ou
java.sun.com/products/javawebstart ele quem vai fugir de voc!
ou uma aplicao MIDP se estiver em um
Java Web Start e JNLP
celular, ou ainda uma interface web se esti-
ver em um browser. Alm disso, possvel java.sun.com/j2ee/provisioning
programar e expandir seu servidor para J2EE Client Provisioning
suportar outros tipos de interfaces.
wings.mercatis.de
Assim, a tecnologia Java mais uma vez
WingS
est anos luz na frente, porque, em vez de
tentar forar o que algum acha melhor millstone.org
para voc, fornece o suporte e as tecnolo- Millstone
gias adequadas para voc escolher o que tapestry.sourceforge.net
precisa. Tapestry
Bruno F. Souza, o JavaMan (bruno.souza@javaman.
E agora? www.zerog.com com.br), veterano da tecnologia Java e um dos
Nossas equipes de marketing dizem que ZeroG lderes do movimento Java no Brasil. fundador da
querem aplicaes web, mas esto apenas www.jgoodies.com Sociedade de Usurios Java (SouJava) e membro do Java
repetindo o que ouviram falar ou leram em Community Process.
Exemplos de aplicaes Swing
jornais. Mas cabe a ns desenvolvedores,

14 Java Magazine Edio 6

jm6-book.indb 14 3/4/2003, 17:49:52


Edio 6 Java Magazine 15

jm6-book.indb 15 3/4/2003, 17:50:06


Java Livre

Tomcat fu
Arquitetura, instalao e

porado a um nmero crescente de Fornece suporte execuo de pginas


servidores de aplicaes e IDEs Java JSP, gerando e compilando o servlet cor-
e continua sendo a implementao respondente a cada pgina. Algumas IDEs
oficial das mais novas especificaes chegam a executar o Jasper em separado do
para aplicaes Java para web. Tomcat para facilitar a depurao e execu-
O Tomcat j nasceu na verso 3.0, trazen- o passo a passo de pginas JSP.
do novidades como o formato de pacote Conectores os conectores facilitam a
WAR (Web Application Archive). Desde a integrao do Catalina com outros servido-

A
Apache Foundation foi formada verso 4.0, o Tomcat implementa no s as res web ou servidores de aplicao J2EE. O
em torno da comunidade de especificaes de servlets conector HTTP (Coyote)
desenvolvedores e usurios do e JSP, mas tambm todas escrito inteiramente em
Apache, o servidor web mais popular da as exigncias para con- Java e parte da distri-
O Tomcat nasceu quando a
internet (tanto acadmica como comercial) tainers web definidas nas buio do Tomcat. Este
e se tornou um guarda-chuva para dezenas
Sun doou Apache Founda-
especificaes do J2EE. conector efetivamente
de projetos de software livre relacionados Futuros requisitos dessas
tion o cdigo inacabado da transforma o Tomcat em
com contedo web, em especial os rela- especificaes costumam implementao de refern- um servidor web e pode
cionados com gerao de sites dinmicos ser implementadas ante- cia de servlets 2.1 e JSP 1.1 ser configurado para
a partir de lgica de negcios hospedada cipadamente no Tomcat, suportar outros recur-
no servidor. tais como o suporte a JMX sos de um servidor web
Talvez o mais bem-sucedido desses (que s ser obrigatrio nas especificaes padro, como a execuo de programas
projetos seja o Jakarta, voltado para tec- de servlets 2.4 e J2EE 1.4). CGI e interpretao de SSI (Server-Side In-
nologias Java no servidor. O Jakarta foi cludes). Outros conectores, como o mod_jk
iniciado quando o Java ainda estava em Arquitetura do Tomcat e mod_jk2, devem ser instalados separa-
sua infncia, por isso esse projeto precisou Nosso foco neste artigo o Tomcat 4.x, a damente e permitem integrar o Tomcat aos
desenvolver uma srie de tecnologias de atual srie estvel. A verso 4.x possui trs servidores Apache, IIS e Netscape/iPlanet.
infra-estrutura cuja aplicao vai alm de componentes principais: Mais adiante, veremos em que situaes
aplicaes web, como o Ant (apresentado Catalina a segunda gerao de con- esta integrao desejvel.
na Edio 2). tainer web fornecida pelo Tomcat, que deu O Tomcat tambm utiliza vrios outros
O Tomcat nasceu quando a Sun decidiu origem srie 4.x e continua evoluindo no pacotes desenvolvidos pelo projeto Jakarta
doar ao projeto Jakarta, e Apache Foun- 5.x. Sua funo gerenciar o ciclo de vida e pela Apache Foundation, como o Xerces,
dation, o cdigo (inacabado) da implemen- dos servlets, decidindo quando gerar no- para o processamento dos arquivos de
tao de referncia da especificao 2.1 de vas instncias ou quando descart-las para configurao em XML.
servlets e 1.1 de JavaServer Pages (JSP). Esse poupar memria. O Catalina tambm o
foi um movimento sbio da empresa: em responsvel por mapear URLs para servlets Tomcat x servidores web
vez de prosseguir no desenvolvimento de e por devolver o documento gerado (em Muitos desenvolvedores e administra-
uma implementao de referncia capen- geral uma pgina HTML) para o navega- dores de rede perguntam: necessrio
ga para uma API crucial ao sucesso da dor. Note, entretanto, que o Catalina no configurar um servidor web para rodar o
plataforma Java, colaborar com a comuni- interage diretamente com o navegador ou Tomcat?. A resposta inicialmente no,
dade de usurios e desenvolvedores para com o servidor web que requisita a URL; pois o Tomcat capaz de fornecer pginas
construir uma implementao robusta, em vez disso, deve ser configurado um HTML estticas e outros tipos de documen-
pronta para produo e liberada como conector para realizar esta interao. tos, como imagens PNG e JPEG ou vdeos,
software livre. Assim toda a comunidade Jasper um servlet padro que pode desde que eles sejam empacotados no
pde se beneficiar. ser instalado em qualquer container web formato WAR.
Desde ento, o Tomcat vem sendo incor- aderente especificao 2.2 de servlets. Por outro lado, o Tomcat otimizado

16 Java Magazine Edio 6

jm6-book.indb 16 3/4/2003, 17:50:15


Aprenda o essencial sobre

ndamental o container web mais


usado no mercado

e configurao
FERNANDO LOZANO

apenas para lidar com os componentes fazem uso de EJBs e que no necessitam, ou sesses HTTP hospedadas neste servidor
Java, e suas capacidades como servidor no utilizam de modo adequado, os recur- sero perdidas, gerando efeitos como a per-
web so limitadas. Ele no suporta outras sos de clustering destes servidores. da de cestas de compras em sites de comr-
linguagens de servidor (PHP, Zope, ASP, A srie 4.1.x do Tomcat suporta todas as cio eletrnico, enquanto que um servidor
Cold Fusion etc.), e no fornece esquemas caractersticas previstas para containers J2EE completo ser capaz de replicar estas
elaborados de cache de contedo ou ou- web J2EE, como um pool de conexes JDBC sesses em memria, evitando a perda de
tros recursos presentes em servidores web e a localizao de recursos via JNDI (Java informaes das sesses dos visitantes.
topo-de-linha como o Apache. Tambm Naming and Directory Interface), de modo possvel configurar o Tomcat para ar-
tem desempenho inferior maioria dos que no h necessidade de um servidor mazenar as informaes de sesses HTTP
outros servidores web do mercado no for- de aplicaes J2EE completo para desen- em um banco de dados relacional e utilizar
necimento de contedo esttico (imagens volver aplicaes web avanadas. Mesmo os recursos deste banco para tolerncia a
e pginas HTML). que seja necessrio interagir com servios falhas, mas o overhead desta soluo
Por isso comum configurar o Tomcat fornecidos por EJBs, basta incluir as classes excessivo, comprometendo o desempenho
como subordinado a um servidor web na- de cliente do seu servidor de aplicaes no das aplicaes. Por isso a maioria dos servi-
tivo (seja hospedado no mesmo host ou em diretrio WEB-INF/lib do pacote WAR en- dores J2EE opta pela replicao das sesses
um n separado da rede), mas possvel tregue para deployment no Tomcat. diretamente entre os containers web.
configurar um ambiente de desenvolvi- Separar aplicaes web no Tomcat dos Podemos, por exemplo, configurar um
mento perfeitamente funcional utilizando EJBs em outro servidor de aplicaes pode servidor JBoss sem os servios de EJB e
apenas o Tomcat, sem a necessidade de ter vrias vantagens com relao distri- JMS, de modo a rodar apenas o Tomcat
qualquer software adicional. buio de carga e economia de licenas. incluso em sua distribuio junto com e
Outra situao onde interessante in- Provavelmente o Tomcat ser mais rpido os servios de suporte a clustering. Assim
tegrar um servidor web ao Tomcat na do que seu servidor de aplicaes para ro- obtemos as vantagens de um ambiente
construo de uma fazenda de servido- dar servlets e pginas JSP, devido ao me- mais leve e baseado em software livre,
res (server farm) para atender a um nico nor overhead, mesmo porque muitos dos sem abrir mo da tolerncia a falhas.
conjunto de aplicaes web, ganhando em servidores J2EE comerciais
escalabilidade. Alguns conectores do Tom- utilizam o prprio Tomcat Tomcat e especificaes
cat, como o mod_jk e sua verso aprimorada como container web.
mod_jk2 permitem utilizar o Apache e ou-
tros servidores web como balanceadores de
Alguns servidores J2EE
agregam ao Tomcat um re- H duas verses atualmente suportadas do Tomcat
(sries 3 e 4), alm da srie 5 ainda em desen-
volvimento. Todas elas continuam sendo ativamente
carga, com suporte a recursos avanados curso que no est presente
como session affinity, mas sem recursos nele isoladamente: o suporte suportadas (incluindo correes de bugs e melhorias
robustos de tolerncia a falhas. a clustering com tolerncia de desempenho), pois aplicaes em produo podem
a falhas. Como vimos na exigir verses diferentes das especificaes, que nem
Tomcat x servidores J2EE comparao com servidores sempre so compatveis retroativamente.
H duas situaes onde o Tomcat sozinho web, a natureza sem-estado A tabela abaixo indica a correspondncia entre as
no ser suficiente, mas ser necessrio uti- (stateless) do protocolo HTTP verses do Tomcat, de servlets e de JSP:
lizar um servidor J2EE completo: torna possvel atender a
Suporte a EJBs ou JMS muitas aplicaes web uti- Srie/Verso do Tomcat Verso de servlets/JSP
Necessidade de clusters com tolerncia lizando apenas servidores
3.x (3.3.1) 2.2/1.1
a falhas Tomcat espelho, que no
Muitas empresas desenvolveram o hbito interagem entre si, bastando 4.0.x (4.0.6) 2.3/1.2 ou 2.2/1.1
pouco recomendado de adquirir e configu- acrescentar um balanceador 4.1.x (4.1.18) 2.3/1.2
rar servidores J2EE completos apenas para de carga. Caso um dos ns do 5.x (5.0.0 Alpha) 2.4/2.0
hospedar aplicaes web simples, que no Tomcat fique indisponvel, as

Edio 6 Java Magazine 17

jm6-book.indb 17 3/4/2003, 17:50:21


Java Livre

Note que no suficien- alguns componentes isoladamente, como


te fornecer um JRE para o Jasper;
a execuo do Tomcat. common classes utilizadas pelo Tom-
Como pginas JSP so cat e disponibilizadas tambm para as
transformadas em servlets aplicaes web hospedadas por ele, como
e compiladas durante o de- o parser XML Xerces;
ployment, necessrio que conf arquivos de configurao do Tom-
o Jasper tenha acesso a um cat. Em geral no h necessidade de modifi-
compilador Java. Portanto c-los para iniciar o desenvolvimento, mas
no esquea de configurar deve ser feito um ajuste fino em ambientes
seu classpath para incluir o de produo, especialmente com relao
Figura 1. Mensagens de inicializao do Tomcat pacote tools.jar do J2SDK. segurana;
Tanto as verses forne- jasper classes que compem o Jasper
cidas pela Sun quanto os (compilador de JSP);
portes da IBM (superiores logs arquivos de log do Tomcat. onde
em vrios benchmarks) so
devemos buscar informaes quando algo
suportados.
sai errado;
Podemos ainda utilizar
server classes que compem o Catalina,
o Tomcat compilado para
o container web em si, alm das aplicaes
cdigo nativo com o GCJ. O
de administrao do servidor;
projeto RHUG da Red Hat
shared diretrio inicialmente vazio
fornece binrios pr-compi-
onde devem ser instaladas classes a serem
lados para Linux e scripts
disponibilizadas para todas as aplicaes
de compilao no padro
web, como drivers JDBC e bibliotecas de
GNU autoconf para outros
Figura 2. Pgina inicial do Tomcat 4 tags;
sistemas Unix. Alguns usu-
webapps diretrio padro para o de-
Distribuies rios tambm reportam sucesso com as
verses pr-release do GCJ para Windows ployment de aplicaes web. Inclui uma s-
Na pgina de download do projeto
disponibilizados pelo projeto MingW. Ser rie de aplicaes de exemplo, mas note que
Jakarta, encontramos, para cada verso
interessante observar o impacto da compi- algumas podem no funcionar de primeira,
recente do Tomcat, duas distribuies:
tomcat- <verso>.zip e tomcat- <verso> - lao no desempenho e na confiabilidade pois dependem de configurao prvia de
LE.zip (os pacotes *.exe e *.tar.gz so apenas das aplicaes web em Java. fontes de dados JDBC ou de acesso a EJBs
convenincia para usurios de plataformas em outros servidores, no fornecidos pelo
Windows e Unix todos contm os mesmos Instalao e diretrios Tomcat. Tambm neste subdiretrio est a
bytecodes Java do Tomcat). Vamos examinar apenas a instalao documentao do Tomcat;
A verso LE exige o J2SDK 1.4.0 ou supe- do Tomcat 4.1.18 no-LE utilizando o work diretrio utilizado pelo Tomcat
rior, pois no inclui as classes relacionadas Java2 SDK 1.4.1. Outras verses do Java ou como rea de trabalho (por exemplo, para
com XML (ausentes em verses anteriores do Tomcat seguiro passos similares. Na armazenar servlets gerados pela compila-
do Java 2). Tambm no inclui os recursos verdade no h muito a fazer. Desde que o de uma pgina JSP);
voltados para J2EE, como servio de no- o seu ambiente de desenvolvimento Java temp diretrio temporrio para a JVM
mes JNDI. Por isso um download menor esteja configurado corretamente (variveis (propriedade java.io.tmpdir).
e fornece um ambiente mais leve para os java_home e classpath), basta
interessados apenas em desenvolver e descompactar a distribui-
hospedar aplicaes web independentes, o, tomando o cuidado de
no estilo pr-J2EE. Note, no entanto, que preservar a sua estrutura de
isto no significa abrir mo de bibliotecas diretrios.
de tags e outros recursos avanados das O resultado a criao
especificaes mais recentes de servlets do diretrio jakarta-tomcat-
e JSP. <verso>, que voc pode
A verso no-LE a distribuio com- renomear para algo mais
pleta do Tomcat e inclui todos os pacotes simples como tomcat4. Ele
necessrios, mesmo que oriundos de ou- possui os seguintes subdi-
tros projetos da Apache Foundation. Exige retrios:
apenas o J2SDK 1.2.2 ou superior e oferece bin contm scripts para o
todos os recursos especificados para con- incio e o trmino do servi-
tainers web J2EE. dor ou para a invocao de Figura 3. ndice da documentao do Tomcat

18 Java Magazine Edio 6

jm6-book.indb 18 3/4/2003, 17:50:22


abrangente e completa podemos recarreg-la a partir do Manager
Listagem 1. Arquivo conf/tomcat-users.xml para permitir o acesso a aplicaes de
administrao (modificaes em negrito) (Figura 3), com refe- e ento evitar a necessidade de reiniciar o
rncias e how-tos para servidor.
<?xml version=1.0 encoding=utf-8?>
<tomcat-users>
praticamente todos os J o Tomcat Admin (Figura 5) um front-
<role rolename=tomcat/> aspectos da adminis- end para a edio dos arquivos de configu-
<role rolename=role1/>
<role rolename=manager/>
trao do servidor ou rao do Tomcat e mesmo dos descritores
<user username=tomcat password=tomcat do desenvolvimento de deployment das aplicaes web hospe-
roles=tomcat/>
<user username=role1 password=tomcat
de aplicaes, incluin- dadas. Ele baseado no framework Struts
roles=role1/> do javadocs para as (veja artigo nesta edio) e permite modi-
<user username=both password=tomcat
roles=tomcat,role1/>
APIs de servlets e JSP. ficar on-the-fly as configuraes do Tomcat,
<user username=admin password=secreta Apesar da qualidade por exemplo definindo novos usurios, sem
roles=manager,admin/>
</tomcat-users>
da documentao for- necessidade de reiniciar o Tomcat. Pode-
necida, recomendo que mos acessar a aplicao Admin pelo link
voc tenha em mos as na pgina inicial do servidor ou pela URL
Operao bsica especificaes de servlets e JSP para sanar http://127.0.0.1:8080/admin.
Para iniciar o Tomcat, basta executar o eventuais dvidas. As duas aplicaes, Admin e Manager,
script startup.sh (ou startup.bat) presente apesar de bem diferentes na sua constru-
no diretrio bin. Em ambiente Windows, Administrao remota o, so complementares: o Manager per-
so abertas duas janelas de comandos, uma A configurao padro do Tomcat no mite adicionar ou remover aplicaes web
para a execuo do script (batch) em si e ou- permite o acesso s aplicaes de adminis- do servidor, enquanto que o Admin mo-
tra para a execuo da JVM que hospeda o trao, como forma de prevenir eventuais difica parmetros de operao do prprio
Tomcat. A primeira janela pode ser fechada brechas de segurana em servidores aces- servidor e das aplicaes hospedadas, mas
imediatamente, mas a segunda janela no, sveis pela internet. Voc ter que editar o no capaz de instalar novas aplicaes.
pois isto provocar o trmino imediato do arquivo conf/tomcat-users.xml, que fornece
Tomcat e poder segurar conexes e locks o mapeamento padro de usurios e roles Configurao
em servidores de banco de dados. A forma (para mais detalhes sobre esse tema, veja o O principal arquivo de configurao do
recomendada de se encerrar uma instncia artigo sobre segurana em aplicaes web Tomcat conf/server.xml. Ele defi ne uma
do Tomcat rodar o script shutdown.sh (ou na Edio 4). Deve haver um usurio com hierarquia encabeada pelo elemento ser-
shutdown.bat) tambm presente no diret- o role manager para a aplicao Manager vidor (server), que representa a JVM onde
rio bin. ou admin para a aplicao Admin. Por o Tomcat executado.
A configurao padro do Tomcat inicia exemplo, a Listagem 1 defi ne o usurio Cada servidor contm um ou mais servi-
dois conectores: o conector HTTP (Coyote) admin com senha secreta. os (service) que so conjuntos de conec-
na porta 8080 e o conector mod_jk na porta Vamos iniciar pelo Tomcat Manager. tores (connector) associados ao mesmo
8009, como podemos ver pelas mensagens Podemos seguir o link na pgina inicial container web (engine). Cada container
de inicializao do servidor (Figura 1). ou ento utilizar a URL http://127.0.0.1: pode por sua vez conter um ou mais hosts
Apenas o conector HTTP necessrio para 8080/manager/html (veja a Figura 4). Esta (host, para suporte a domnios virtuais
desenvolvimento; o conector mod_jk pode aplicao permite instalar, remover, pa- web), que, por sua vez, hospedam um ou
ser desabilitando pela edio do arquivo rar, (re)iniciar ou recarregar aplicaes mais contextos (context). Cada contexto
conf/server.xml como veremos adiante. Te- web hospedadas pelo Tomcat. Fornece associa uma URL a uma aplicao web,
nha certeza de que nenhum outro servio uma API simples, baseada em requisies mas no necessrio definir contextos
esteja utilizando a porta 8080 (ou desabilite HTTP, para que o administrador crie o para todas as aplicaes, pois o atributo
o servio em conflito, se houver). Alm dis- seu prprio front-end para a
so, o Tomcat aceita na porta 8005 comandos administrao do servidor.
administrativos como shutdown, portanto A mesma API disponibili-
tenha certeza de que esta porta tambm zada tambm como tarefas
esteja livre e desbloqueada no firewall (tasks) do Ant, de modo que
interno do seu servidor. um build file possa atualizar
Para testar o funcionamento do Tom- aplicaes web no Tomcat
cat basta abrir, em qualquer navegador, sem interveno manual.
a URL http://127.0.0.1:8080/ para ver a O Tomcat no capaz de
pgina inicial padro do Tomcat (Figura recarregar aplicaes web a
2). Observe no canto superior esquerdo os partir de um pacote WAR. A
links Tomcat Administration e Tomcat aplicao deve ser removida
Manager, seguidos pelo link Tomcat Do- e reinstalada. Entretanto, se a
cumentation. A documentao em formato aplicao for instalada como
HTML fornecida com o Tomcat bastante um subdiretrio de webapps, Figura 4. Tomcat Manager

Edio 6 Java Magazine 19

jm6-book.indb 19 3/4/2003, 17:50:24


Java Livre

arquivo conf/web.xml, que fornece valores


Listagem 2. Pgina JSP: index.jsp
padro para as entradas no especificadas
<%@ page import=java.util.Date,java.text.DateFormat %> no arquivo WEB-INF/web.xml das apli-
<html><body>
<h1>Aplicao Web mnima<hr></h1> caes hospedadas. A especificao de
<P>Hoje dia servlets determina que servlets annimos
<%= DateFormat.getDateInstance().format(new Date ()) %>
<P>Tambm temos uma verso (aqueles para os quais no foi definido um
<a href=servlet/Hello>Servelt</a> desta mesma pgina. mapeamento de URL) sejam acessveis pela
<hr><center>
Leia <a href=http://www.javamagazine.com.br>Java Magazine</a> URL /servlet/<nomeCompletoDaClasse>.
</center> O Tomcat fornece um servlet chamado
</body></html>
Invoker que implementa esse compor-
Listagem 3. Servlet: Hello.java tamento, mas ele est desabilitado na
configurao padro. Por isso modifico
import javax.servlet.*;
import javax.servlet.http.*; a configurao de modo a fornecer um
import java.io.*; mapeamento padro para o Invoker, des-
import java.util.Date; comentando a entrada abaixo no arquivo
import java.text.DateFormat; conf/web.xml:
public class Hello extends HttpServlet {
public void doGet (HttpServletRequest req, <!-- The mapping for the invoker servlet -->
HttpServletResponse res) <servlet-mapping>
throws IOException, ServletException { <servlet-name>invoker</servlet-name>
res.setContentType (text/html);
PrintWriter pw = new PrintWriter (res.getOutputStream());
<url-pattern>/servlet/*</url-pattern>
pw.println(<HTML>); </servlet-mapping>
pw.println(<BODY>);
pw.println(<H1>Servlet Mnimo<HR></H1>);
pw.println(<P>Hoje dia + Aplicaes web para o Tomcat
DateFormat.getDateInstance().format(new Date ()));
pw.println(<P>Tambm temos uma verso ); Como o Tomcat a implementao de
pw.println(<A href=\../index.jsp\>JSP</A> desta mesma pgina); referncia das especificaes de servlets
pw.println(</BODY>);
pw.println(</HTML>); e JSP, no h nada especfico para ele no
pw.flush(); desenvolvimento de aplicaes web em
pw.close();
} Java. Tambm no necessrio baixar
} nenhum pacote ou SDK externo (como o
Listagem 4. Descritor de deployment web.xml J2EE SDK), pois o Tomcat fornece todas as
APIs necessrias.
<?xml version=1.0 encoding=ISO-8859-1?> Em princpio, tudo o que devemos fa-
<!DOCTYPE web-app
PUBLIC -//Sun Microsystems, Inc.//DTD Web Application 2.3//EN zer para compilar servlets adicionar o
http://java.sun.com/dtd/web-app_2_3.dtd> pacote common/lib/servlet.jar ao classpath.
<web-app>
<display-name>Hello</display-name> Caso sejam utilizados recursos adicio-
<description>Exemplo de aplicao web mnima</description> nais previstos no J2EE, deve-se adicionar
</web-app>
tambm os respectivos pacotes fornecidos
no mesmo diretrio, como mail.jar para o
appBase do element host determina um Pessoalmente, costumo fazer
diretrio no qual qualquer arquivo WAR ou duas modificaes na configura-
diretrio seguindo a mesma estrutura ser o padro do Tomcat para um
automaticamente ativado e associado a um ambiente de desenvolvimento. A
contexto criado dinamicamente. Este dire- primeira envolve o elemento host
trio webapps na configurao padro. no arquivo conf/server.xml, modifi-
Em cada nvel da hierarquia server/ cando o atributo unpackWARs de
service/engine/host/context podemos true para false. Se for mantido
definir recursos JNDI (resource e environ- o valor padro true, a atualizao
ment), configuraes de logging (logger), de pacotes WAR no surtir efeito,
restries de autenticao (realm) e filtros pois o Tomcat ir sempre utilizar a
de contedo baseados em IP ou em outros verso descompactada durante a
critrios (valve). primeira instalao.
Tendo em mente a hierarquia de elemen-
<Host name=localhost debug=0
tos configurados pelo Tomcat, torna-se
appBase=webapps unpackWARs=false
fcil especificar configuraes de rede ou autoDeploy=true>
de segurana do servidor, com auxlio da
documentao de referncia fornecida. A segunda modificao no Figura 5. Tomcat Admin, baseado no Struts

20 Java Magazine Edio 6

jm6-book.indb 20 3/4/2003, 17:50:25


ginas JSP. Crie em um diretrio isso nosso objetivo neste artigo foi, prin-
qualquer o subdiretrio hello, que cipalmente, orientar o leitor na instalao
ser a raiz da aplicao web. Crie e configurao do Tomcat e na deciso de
tambm abaixo dele o subdiretrio adot-lo ou no, sozinho ou em conjunto
WEB-INF/classes para hospedar as com outros servidores, em ambientes de
classes de servlets. desenvolvimento ou produo.
Crie os arquivos hello/index.jsp,
hello/WEB-INF/classes/Hello.java e
hello/WEB-INF/web.xml conforme
as Listagens 2, 3 e 4. Compile
a classe Hello.java (note que ela
est no pacote default, portanto
no h necessidade de ajustes no jakarta.apache.org
Figura 6. Pgina JSP da aplicao mnima classpath desde que este contenha Site do projeto Jakarta, que inclui o Tomcat
o ., que representa o diretrio java.sun.com/j2ee/tutorial
atual) e monte um pacote WAR www.apl.jhu.edu/~hall/java/Servlet-
com o comando a seguir, execu- Tutorial
tado de dentro do diretrio hello: Tutoriais sobre servlets e JSP
jar cvf ../hello.war * www.onjava.com/pub/a/onjava/2002/07/31/
(Lembre-se de trocar a barra de tomcat.html
diviso pela barra invertida em Sobre o arquivo de configurao do Tomcat
sistemas Windows). www.theserverside.com/resources/articles/
Copie o arquivo hello.war gerado Tomcat/article.html
por esse comando para o subdi- www.ubeans.com/tomcat
retrio webapps do Tomcat e rei- Configurao e limitaes do Tomcat para
nicie o servidor. Teste a aplicao clustering
Figura 7. Aplicao mnima reconhecida pelo Tomcat Admin visitando a URL http://127.0.0.1: sources.redhat.com/rhug
8080/hello para obter uma pgina Site do projeto RHUG, que fornece instrues e
JavaMail e activation.jar para o Java Activa- semelhante exibida na Figura 6. binrios para compilao nativa do Tomcat
tion Framework (JAF). Alguns pacotes esto Se algo der errado, confirme que o Tom-
presentes apenas para uso por IDEs, como cat reconheceu a aplicao visitando as mingw.sourceforge.net
jasper-compiler.jar.
Site do projeto MingW, que fornece um porte para
aplicaes Manager ou Admin (Figura 7).
Windows do GCJ, compilador Java nativo
H trs formas de realizar o deployment Verifique nos arquivos de log do Tomcat
de uma aplicao web no Tomcat: no subdiretrio logs alguma indicao da blueskytime.sourceforge.net
Copiar um pacote WAR para o diretrio causa do problema e confira a estrutura Plugin para desenvolvimento de aplicaes web
webapps; do seu pacote WAR com o comando jar no Eclipse. O Eclipse utiliza o Tomcat para fornecer
Criar um subdiretrio em webapps se- a estrutura deve estar de acordo com a help on-line, mas no fornece uma maneira para
guindo a mesma estrutura de um pacote seguinte listagem: rodar suas prprias aplicaes no Tomcat incluso.
WAR; Este plugin resolve o problema.
$ jar tvf hello.war
Utilizar o Tomcat Manager 0 Sun Mar 09 22:04:58 BRT 2003 META-INF/
Nas duas primeiras opes, o Tomcat 71 Sun Mar 09 22:04:58 BRT 2003 META-INF/MANIFEST.MF
384 Sun Mar 09 21:47:44 BRT 2003 index.jsp www.javamagazine.com.br/downloads
dever ser reiniciado (embora na segunda 0 Sun Mar 09 17:51:46 BRT 2003 WEB-INF/ /jm6/jm6-flozano-tomcat.zip
possamos recarregar a aplicao pelo Ma- 330 Sun Mar 09 17:53:30 BRT 2003 WEB-INF/web.xml
nager). A aplicao ser associada ao con- 0 Sun Mar 09 17:51:46 BRT 2003 WEB-INF/classes/
1016 Sun Mar 09 17:54:50 BRT 2003 WEB-INF/classes/Hello.java
texto cujo nome o nome do pacote WAR 1371 Sun Mar 09 17:55:02 BRT 2003 WEB-INF/classes/Hello.class
sem a extenso ou o nome do diretrio. As-
sim o diretrio webapps/examples est asso- Concluses
ciado URL http://127.0.0.1:8080/examples O Tomcat um container web poderoso Fernando Lozano (fernando@lozano.eti.br)
e o pacote webapps/app.war ser associado e capaz de atender s necessidades de uma consultor independente e detentor de vrias
URL http://127.0.0.1:8080/app. certificaes Java, Linux e Microsoft. um ativista
vasta gama de aplicaes, especialmente
antigo do software livre e autor do livro Java em
quando no necessrio o suporte a EJBs
GNU/Linux pela Ed. Alta Books. Sua pgina pessoal em
Exemplo de aplicao ou a separao fsica da camada web. www.lozano.eti.br contm os slides de vrias palestras
Para encerrar o artigo, vamos criar uma Vrios outros artigos da Java Magazine apresentadas pelo autor em congressos como a COM-
aplicao web mnima com o Tomcat, apresentam os primeiros passos no desen- DEX-SUCESU e o One Day Java.
exemplificando tanto servlets como p- volvimento de aplicaes web em Java, por

Edio 6 Java Magazine 21

jm6-book.indb 21 3/4/2003, 17:50:27


Java de Bolso

Conectivida d
Interoperabilidade com s

Uma grande largura de banda DatagramConnection , OutputConnection , Input-


necessria apenas quando so Connection , StreamConnectionNotifier e Stream-
transportados grandes volumes de Connection. Essas interfaces definem suporte
dados, o que no o caso para aplica- para conexes seriais, datagramas (UDP),
es mveis, que devem poupar a bateria HTTP e TCP (cliente e servidor).
do dispositivo e operar com restries de No MIDP 2 so adicionadas uma classe e
memria e capacidade do processador. E sete interfaces. As principais novidades em
mesmo que haja uma boa largura de ban- conectividade no novo MIDP so:

U
m recurso crtico para aplicaes da, com uma alta latncia de rede o grande Implementao de HTTPS todo dis-
MIDP a comunicao com tempo de resposta pode tornar-se inaceit- positivo MIDP 2 deve ter suporte a HT-
servios residentes em servi- vel para o usurio. TPS (no MIDP 1, isso era
dores. Neste artigo, sero mostrados os importante destacar que opcional). O GCF no MIDP
Na rede celular, fatores
recursos de conectividade existentes no a rede de uma operadora de
telefonia celular bastante
como a cobertura de sinal, 2 tambm disponibiliza
CLDC/MIDP usando o Generic Connection suporte a conexes TLS,
Framework (GCF) e as situaes em que diferente de uma rede grandes taxas de erro SSL e WAP/TLS (interfa-
cada recurso se aplica, cobrindo protocolos TCP/IP convencional (a e alta latncia exigem ce SecureConnection), alm
e formatos de dados, alm de boas prticas que usamos normalmente tratamento diferenciado do suporte a certificados
e tcnicas de otimizao. para acessar a internet em pelos protocolos para a autenticao de
casa e no trabalho). Na rede conexes seguras (pacote
MIDP e a internet da operadora, os protocolos tm de ser im- javax.microedition.pki);
Aplicaes para internet geralmente tm plementados usando tecnologias de trans- Suporte tecnologia push pode-se
funcionalidades de pesquisa e envio de misso wireless, passando por satlites e registrar aplicaes MIDP para responder
mensagens interagindo com servios lo- antenas. Fatores como a cobertura de sinal, a eventos de conectividade, mesmo que a
calizados em outras mquinas. As mesmas reas de sombra, grandes taxas de erro e mquina virtual Java no esteja ativa; por
funcionalidades tambm so importantes alta latncia exigem tratamento diferencia- exemplo, um MIDlet pode ser invocado ao
em aplicaes para telefones celulares e ou- do pelos protocolos de comunicao. Em receber uma notificao originada de uma
tros dispositivos com suporte a J2ME. No redes de telefonia celular, existem vrias URL registrada anteriormente;
meio wireless, isso envolve fatores como maneiras de realizar o trfego de dados. As Suporte obrigatrio a OTA (Over The
a escolha de protocolos de comunicao, principais so: CSD (Circuit-Switched Data), Air) pode-se realizar o download de apli-
formatos de dados, largura de banda e GPRS (General Packet Radio Service), CDPD caes MIDP (usando WAP) para o telefone
latncia de rede. (Cellular Digital Packet Data) e HSCSD (High- atravs da rede wireless.
A latncia de rede determinada pelo Speed Circuit-Switched Data). Veja a seguir alguns exemplos de cone-
tempo transcorrido desde o incio de uma xes com o GCF.
transmisso a partir da origem at o incio O Generic Connection Framework HTTP:
do seu recebimento pelo destino. Em alguns O Generic Connection Framework (GCF) HttpConnection c1 = (HttpConnection) Connector.open(
casos, como na comunicao via satlites, a API J2ME padro para conectividade. http://www.jm.com.br?ed=5&imp=1);
a latncia pode ser maior do que o tempo Oferece suporte a vrios protocolos de co- TCP (Sockets):
gasto na transmisso da mensagem. J a municao, entre eles HTTP/HTTPS, TCP, StreamConnection c2 = (StreamConnection) Connector.open(
largura de banda pode ser definida como UDP, serial, e infravermelho, sem no entan- socket://192.168.7.3:7070);
a quantidade de informao que pode ser to se ater a implementaes especficas.
Serial:
transmitida em uma nica conexo, j es- O GCF reside no pacote javax.microedition.io.
InputConnection c3 = (InputConnection) Connector.open(
tabelecida, por unidade de tempo. No MIDP 1, o framework inclui a classe
comm:0;baudrate=9600, Connector.READ);
Para aplicaes MIDP, a caracterstica da Connector e nove interfaces: Connection,
rede mais importante a baixa latncia. Con tentConnection, Datagram, HttpConnection , Como se pode deduzir a partir dos exem-

22 Java Magazine Edio 6

jm6-book.indb 22 3/4/2003, 17:50:30


Integrao de aplicaes

a de com MIDP J2ME/MIDP com servios


de rede atravs do Generic
Connection Framework
m servios externos
CLUDIO MIRANDA

plos, a URL passada como argumento obe- quer implementao de CLDC/MIDP antes da conexo ao servidor.
dece ao seguinte esquema: o HTTP, mas alguns fornecedores (como Uma conexo HTTP (representada por
<protocolo>:<endereo>;<parmetros> Nokia, Motorola, Siemens, IBM-J9, Jeode, um objeto do tipo HttpConnection) pode estar
Symbian, Sony-Ericsson e HP) implemen- em trs estados: setup (configurao), em
Essa URL utilizada pela classe Connector tam protocolos adicionais, por exemplo que a conexo ainda no est estabelecida
para criar os objetos implementadores TCP, HTTPS, infravermelho e UDP. Apesar com o servidor e podem ser definidos os
da interface Connection especializados no de o MIDP 2 j definir interfaces para cone- parmetros da solicitao; connected, no
protocolo especificado. Os parmetros xes seriais (CommSerial), SSL/TLS (SecureCon- qual a conexo com o servidor est ativa,
especificados depois do ponto-e-vrgula nection) e sockets no lado do servidor (Ser- os parmetros da solicitao foram envia-
so consumidos pelo objeto xxxConnection verSocketConnection), a implementao desses dos e uma resposta aguardada; e closed,
especfico. protocolos continua sendo opcional. onde o servidor j enviou mensagens para
As implementaes do Generic Connec- O protocolo HTTP bastante fcil em o cliente e fechou a conexo. Observe que
tion Framework seguem uma nomencla- comparao com os outros, pois trafegam depois de entrar no estado closed, qualquer
tura de pacotes padro, para simplificar o apenas mensagens textuais no h troca tentativa de reuso da conexo provocar
carregamento dinmico de classes. O nome de dados em formato binrio. E as requi- uma IOException.
do protocolo includo no nome da classe, sies e respostas podem ser entendidas Os parmetros HTTP devem ser confi-
que instanciada utilizando reflection. No por pessoas, sem que antes precisem passar gurados no estado de configurao. So
caso da implementao de referncia da por um parser. cabealhos HTTP como: User-Agent e
Sun (o J2ME Wireless Toolkit), o nome da A interface HttpConnection do GCF trata Content-Type. Observe o exemplo na
classe para o protocolo HTTP com.sun.cldc da comunicao com um servidor HTTP Listagem 1.
.io.j2me.http.Protocol.class. e possui algumas peculiaridades, por se Vamos discutir alguns pontos do cdigo.
O mtodo open possui mais trs verses, tratar de um protocolo de requisio/ Esteja atento para pequenos detalhes que
duas delas apresentadas nos exemplos resposta (request/response) sem estado, em no mundo J2SE/J2EE no fazem muita dife-
anteriores: open (String), open (String , int) e que devem ser configurados parmetros rena, mas no J2ME importam muito.
open (String, int, boolean). O argumento in-
teiro determina o modo de acesso: leitura Cabealhos HTTP
(READ), escrita (WRITE) ou leitura/escrita
(READ_WRITE) este ltimo o padro. O User-Agent Informa o tipo de cliente que est se conectando ao servidor HTTP
argumento booleano ativa um tempori-
Indica o formato do contedo enviado alm da URL e deve ter a codificao
zador (timer) interno da implementao Content-type x-www-form-urlencoded para mtodo POST, a no ser que sejam enviados
com isso uma exceo ser lanada caso arquivos anexados no padro MIME
o tempo transcorrido no estabelecimento
Indica o tamanho dos dados enviados, especialmente no caso de dados
da conexo seja excessivo. Content-length
binrios
Nos prximos exemplos enfatizamos os
conectores baseados em HTTP (HttpConnec- Utilizado quando uma aplicao MIDP ser instalada por OTA. O servidor
tion e ContentConnection). A implementao de usa esses cabealhos junto com User-agent para saber qual a verso do
Accept-Language
CLDC/MIDP e o idioma/pas suportados pelo dispositivo, fazendo que uma
HTTP pode ser diretamente sobre a rede
aplicao customizada possa ser instalada automaticamente.
de telefonia celular ou atravs de gateways
(assim como em WAP). A implementao Indica se a conexo com o cliente deve ser reutilizada entre vrias requisies
dos demais protocolos previstos pela espe- (tambm conhecida como conexo persistente ou keep-alive). Caso contr-
cificao opcional. rio, o servidor fecha a conexo ao fim de cada resposta enviada ao cliente.
Connection
Com conexes persistentes, se vrias conexes ao mesmo servidor forem
estabelecidas em um breve espao de tempo, haver ganhos de tempo e de
Protocolos e HttpConnection bateria caso a conexo seja reutilizada.
O nico protocolo obrigatrio em qual-

Edio 6 Java Magazine 23

jm6-book.indb 23 3/4/2003, 17:50:34


Java de Bolso

GET, mas retorna apenas o cabealho da


Listagem 1. Conexo com HTTP
resposta, o que til para verificar a dispo-
01: HttpConnection http = null; nibilidade de determinada URL. Para mais
02: InputStream httpIn = null;
03: OutputStream httpOut = null; informaes sobre as outras propriedades
04: String url = http://site.com.br/pesq; estabelecidas para a conexo, veja o quadro
05: try {
06: String post = cod=34&pesq=JavaMagazine; Cabealhos HTTP.
07: // Conexo em estado de configurao Nota : os cabealhos Connection e
08: http = (HttpConnection) Connector.open(url);
09: http.setRequestMethod(HttpConnection.POST); Content-length esto presentes apenas
10: http.setRequestProperty(User-Agent, no HTTP 1.1. por isso que a especificao
Profile/MIDP-1.0, Configuration/CLDC-1.0);
11: http.setRequestProperty(Content-Type, MIDP requer a implementao do HTTP
application/x-www-form-urlencoded ); 1.1. Nas linhas 17 e 18, escrevemos no corpo
12: http.setRequestProperty(Connection, close);
13: http.setRequestProperty(Content-Length, da requisio os dados a serem enviados ao
Integer.toString(post.length()) ); servidor; mas at esse ponto a requisio
14: // Neste ponto todos os cabealhos necessrios foram configurados
15: no foi enviada. Somente na linha 21, ao
16: // Escreve os dados a serem enviados ao servidor capturarmos a resposta do servidor, os da-
17: httpOut = http.openOutputStream();
18: httpOut.write(post.getBytes()); dos so enviados. A resposta obedece ao
19: padro HTTP (cdigos 404, 500, 200 etc.).
20: // A conexo efetuada e os dados so enviados
21: int httpResponseCode = http.getResponseCode(); Na linha 31 verificamos se o servidor
22: // Verifica o cdigo da resposta HTTP retornou o tamanho da resposta, permi-
23: if (httpResponseCode!= HttpConnection.OK) {
24: System.out.println(Nao foi possivel efetuar conexao: + tindo a leitura em um nico bloco, ou se
httpResponseCode); teremos que ler a resposta byte a byte at
25: return;
26: } o seu trmino (final de arquivo).
27: // Efetua a leitura da resposta -
// o que seria exibido em um navegador
28: httpIn = http.getInputStream(); Formatos de dados
29: Agora vamos tratar do formato dos da-
30: // verifica o tamanho da resposta
31: int len = (int) http.getLength(); dos a serem transferidos. Podemos utilizar
32: // Veja o comentrio no texto sobre esta parte do cdigo formatos textuais (CSV, texto delimitado,
33: if (len > 0) {
34: // content-length foi fornecido pelo servidor - ler de uma s vez XML), formatos binrios personalizados
35: int actual = 0; ou serializao de objetos.
36: int totalLidos = 0 ;
37: byte[] data = new byte[len]; O desenvolvedor Java est habituado aos
38: while ((totalLidos!= len) && (actual!= -1)) { mecanismos de serializao e refl ection,
39: // Tenta ler todo o contedo de uma s vez
40: actual = httpIn.read(data, bytesread, len - totalLidos); entretanto estes no so suportados dire-
41: totalLidos += actual; tamente no CLDC/MIDP. A serializao,
42: }
43: // Efetua algum processamento com os dados no entanto, pode ser feita manualmente,
44: process(data); usando as classes java.io.DataInputStream e
45: } else {
46 // Ler byte a byte java.io.DataOutputStream da maneira mostra-
47: int ch; da na Listagem 2. Um exemplo de classe
48: while ((ch = httpIn.read())!= -1) {
49: // Efetua algum processamento com os dados serializvel mostrado na Listagem 3.
50: process((byte) ch); Como se pode ver nos exemplos, no
51: }
52: } difcil criar um mecanismo prprio de se-
53: } catch (ClassCastException e) { rializao. O desenvolvedor deve apenas
54: // Ocorre quando a url no corresponde
// interface de conexo especificada no cast observar a ordem de escrita e leitura, pois
55: throw new IllegalArgumentException( um erro pode ser difcil de detectar em
No uma url do tipo HTTP.);
56: } finally { classes com muitos atributos.
57: if (httpIn!= null) httpIn.close();
58: if (httpOut!= null) httpOut.close(); CSV
59: if (http!= null) http.close();
60: } O tipo de arquivo CSV (Comma-Separated
Values) existe desde a poca do MS-DOS.
Nele, como indica o nome, dados so sepa-
Nas linhas 9 a 13, definimos algumas pro- am=valor). Nesse caso, existe a limitao do
rados por vrgulas; a primeira linha deter-
priedades (cabealhos) para iniciar a con- tamanho da URL e os dados a serem envia-
mina os nomes dos campos. Por exemplo:
versa com o servidor HTTP e definimos dos somente podem ser textuais.
Nome,Idade,Origem
o mtodo de requisio ao servidor como Quando usado POST, no h limite Duke,8,java.sun.com
POST (outras opes so GET e HEAD). para o tamanho dos dados, que podem Tigre,50000,Asia
Internet,25,ArpaNET
Lembre-se que, usando GET, os dados so ainda ser binrios (figuras, mensagens
Humano,500000,Terra
enviados como parte da URL (por exemplo: criptografadas etc.). J o mtodo HEAD
http://site.com.br/processa?cod=1&tit=2&par tem funcionalidade semelhante de O formato CSV no difere muito de outros

24 Java Magazine Edio 6

jm6-book.indb 24 3/4/2003, 17:50:35


formatos textuais delimitados, mas tem a usurio (concentrando-se em operaes (sincronizao de dados com a origem).
vantagem de ser simples e aceito por vrias relacionadas conectividade) Normalmente, a verificao de cache efe-
aplicaes, como planilhas eletrnicas. tuada com base em timestamps de quando
Cache de dados
A aplicao MIDP deve implementar a l- foi efetuada a leitura, e em um mecanismo
gica de leitura/escrita especfica para cada Para minimizar operaes de conexo de de notificao do servidor, ativado quando
formato de dados utilizando mtodos como rede, parsing, converso de tipos etc. im- os dados so modificados. No MIDP, im-
substring e indexOf. Mas observe que esse pro- portante que seja definido um mecanismo portante que o cache tenha seu crescimento
cesso gera vrios objetos temporrios de cache, para reduzir o nmero de leituras limitado para no comprometer o espao
aconselhvel apontar esses objetos para null do mesmo dado. Esse mecanismo capaz disponvel no dispositivo.
o mais cedo possvel, de modo a economi- de saber quando um dado est sujo (de-
zar recursos do dispositivo consumidos no satualizado em relao ao mesmo dado na Thread para operaes assncronas
processo de coleta de lixo. origem) e efetuar a sua leitura novamente Em MIDP, a conexo e a transferncia

XML Listagem 2. Serializao manual de objetos (mtodos get/set omitidos)


Um documento XML muito simples de // Escrita
entender segue uma estrutura hierrqui- DataOutputStream dataOut = //... obter um DataOutputStream
dataOut.writeInt(5);
ca evitando a repetio de dados e permite dataOut.writeBoolean(true);
armazenar contedo binrio. Documentos dataOut.writeUTF(isto eh um teste);
XML podem ser validados usando um DTD // Leitura
(Document Type Definition) ou um XML DataInputStream dataIn = //... obter um DataOutputStream
int i = dataIn.readInt();
Schema (documento XML que descreve boolean b = dataIn.readBoolean();
tags, atributos e tipos permitidos). Com String s = dataIn.readUTF();
Java, existem basicamente duas maneiras
Listagem 3. Exemplo de classe manualmente serializvel
de acessar um documento XML: atravs de
SAX (Simple API for XML) ou DOM (Docu- 01: public interface Serializer {
02:
ment Object Model). Detalhes sobre a ma- 03: public byte[] serialize() throws IOException;
nipulao de documentos XML com Java 04: public void deserialize(byte[] b) throws IOException;
05: }
podem ser vistos no artigo Processando 06:
XML em Java (Edio 2). 07: public class Pessoa implements Serializer {
08:
Em MIDP no h uma API padro para 09: static final byte TOKEN_INICIO = 33;
tratar XML, mas existem bibliotecas que 10: static final byte TOKEN_FIM = 51;
11: public String nome;
podem ser usadas como a kXML e a Nano- 12: public String endereco;
XML. Entretanto, ao usar XML em aplica- 13: public boolean leJavamagazine;
14:
es wireless Java, deve-se levar em conta 15: public byte[] serialize() throws IOException {
o espao ocupado, os custos de processa- 16: ByteArrayOutputStream byteOut = new
17: ByteArrayOutputStream(nome.length() + endereco.length() + 3);
mento com a coleta de lixo e o consumo de 18: DataOutputStream dataOut = new DataOutputStream(byteOut);
19: dataOut.writeByte(TOKEN_INICIO);
energia. No recomendo o uso intensivo de 20: dataOut.writeUTF(nome);
XML com MIDP, salvo em situaes onde 21: dataOut.writeUTF(endereco);
22: dataOut.writeBoolean(leJavamagazine);
no seja possvel realizar a troca de men- 23: dataOut.writeByte(TOKEN_FIM);
sagens em formatos mais simples, como os 24: dataOut.flush();
25: return byteOut.toByteArray();
apresentados anteriormente. 26: }
27:
28: public void deserialize(byte[] data) throws IOException {
Desempenho e tempo de resposta 29: ByteArrayInputStream byteIn = new ByteArrayInputStream(data);
Ao pensar em desempenho, devemos 30: DataInputStream dataIn = new DataInputStream(byteIn);
31: byte b = dataIn.readByte();
estar atentos ao que queremos melhorar e 32: if (b!= TOKEN_INICIO) {
a qual o tempo de resposta aceitvel. co- 33: throw new IOException(Inconsistncia na desserializao,
token inicial: + b);
mum, ao buscar aumento de desempenho 34: }
em uma aplicao, no se determinar qual 35: nome = dataIn.readUTF();
36: endereco = dataIn.readUTF();
o tempo considerado ideal, mas apenas 37: leJavamagazine = dataIn.readBoolen();
estabelecer como objetivo quanto mais 38: b = dataIn.readByte();
39: if (b!= TOKEN_FIM) {
rpido melhor. No entanto, necessrio 40: nome = endereco = ;
estabelecer limites para sabermos at onde 41: leJavamagazine = false;
42: throw new IOException(Inconsistncia na desserializao,
vale a pena investir nessa rea. token final: + b);
A seguir, reno algumas dicas que re- 43: }
44: }
duzem os tempos resposta em aplicaes 45: }
MIDP, ou melhoram a experincia do

Edio 6 Java Magazine 25

jm6-book.indb 25 3/4/2003, 17:50:36


Java de Bolso

de dados no so operaes rpidas, pois, possam ser executadas de uma s vez em cessrios esto disponveis se servidores
como visto anteriormente, a rede pode ter apenas uma conexo de rede. esto ativos e funcionando corretamente ou
baixa largura de banda ou alta latncia. se existe espao suficiente no dispositivo.
Com nossos equipamentos mveis e pes-
Uso de servio de proxy
Assim o usurio no perde tempo aguar-
soais, no temos muita disposio para es- Freqentemente necessrio extrair dando por uma operao que no poder
perar por operaes demoradas. No mundo dados de documentos HTML/XML for- ser finalizada.
wireless, no incomum situaes em que necidos por servios sobre os quais no
o usurio desista de uma transao banc- temos controle. Essas so operaes de Concluses
ria se houver uma demora maior que dez alto custo para o dispositivo, mas podemos A construo de aplicaes MIDP envolve
segundos, por exemplo. J no desktop, es- usar um servidor sob nosso controle para consideraes que no so necessrias em
tamos acostumados a esperas mais longas efetuar previamente a extrao dos dados aplicaes desktop ou de servidor. Mas, to-
e quase nem percebemos as demoras. e deix-los em um formato mais leve para mando alguns cuidados, podemos garantir
No caso de operaes de longa durao a aplicao MIDP. ao usurio uma experincia agradvel.
que usem conectividade, importante co- Outra situao ocorre quando a aplica-
locar a operao de conexo em uma thre- o MIDP consulta um servio que retorna
ad separada e notificar o usurio (usando uma grande quantidade de dados. Pode-
uma barra de status ou caixa de dilogo, mos delegar a consulta para um servio
por exemplo), de que a operao foi con- de proxy do MIDP, localizado em outro java.sun.com/products/cldc
cluda. Isso normalmente ocorre quando servidor sob nosso controle, que quebre Connected Limited Device Configuration (CLDC)
os dados em pedaos mais adequados aos
uma conexo efetuada para buscar dados java.sun.com/products/midp
recursos limitados do dispositivo.
em servidores e escrever registros usando Mobile Information Device Profile (MIDP)
RMS Record Management System. Indicador de operaes demoradas
Alm disso, evite criar mais que duas www.ietf.org/rfc/rfc2616.txt
importante que, para tarefas que no
threads nos seus aplicativos para no exi- Hypertext Transfer Protocol (HTTP) 1.1
sejam instantneas (com durao de, diga-
gir muito do dispositivo, mesmo porque mos, mais que 3 segundos), seja mostrado www.ietf.org/rfc/rfc768.txt
algumas implementaes da JVM tm um indicador de que a operao esteja em User Datagram Protocol (UDP)
restries quanto ao nmero de threads processamento e no travou ou foi cance- www.ietf.org/rfc/rfc2246.txt
ativas concorrentemente. lada. O indicador pode ser atualizado com Transport Layer Security (TLS) 1.0
base na porcentagem efetuada da tarefa, ou
Minimizao de conexes de rede
em nmeros que indiquem a quantidade www.javamagazine.com.br/downloads
No ciclo de vida de uma aplicao que
processada com relao ao total (por exem- /jm6/jm6-cmiranda-j2me.zip
necessite se conectar com servidores em plo, 20 de 135), ou ainda um aviso grfico
uma operao do usurio (por exemplo, de progresso como o Gauge do MIDP.
uma consulta fatura de um carto de
crdito) quantas conexes so necessrias Testes de disponibilidade Cludio Miranda (claudio.miranda@uol.com.br),
para chegar ao resultado final? Podemos Antes da aplicao MIDP ser disponibi- consultor da Summa Technologies, certificado em
minimizar as operaes de rede em proces- lizada para o usurio, conveniente que a Java, palestrante em vrios eventos sobre a tecnolo-
aplicao possa verificar se os recursos ne- gia e moderador da lista J2ME do SouJava.
sos batch, fazendo com que vrias tarefas

26 Java Magazine Edio 6

jm6-book.indb 26 3/4/2003, 17:50:37


Edio 6 Java Magazine 27

jm6-book.indb 27 3/4/2003, 17:50:53


Alm das Fronteiras

Novidades
Expressividade e abstra

facilitar a manuteno das pginas. Preo: <%= ((database.BookDetails)


Isso alcanado com uma melhora request.getAttribute(book)).getPrice() %>
significativa nos recursos para cria-
Com a introduo da EL, esse cdigo pode
o de bibliotecas de tags (tag libraries
ser reduzido para:
ou taglibs), e com a introduo de uma
linguagem de expresses. Preo: ${book.price}
Vamos explorar os novos recursos ana-
As expresses entre ${ e } so analisadas
lisando uma parte do exemplo BookStore,
em tempo de execuo pelo container web.

A
prxima verso do J2EE 1.4 com distribudo com o J2EE Tutorial Addendum.
lanamento previsto para o meio No exemplo, o objeto representado pela cha-
O exemplo roda na verso beta da imple-
desse ano inclui uma srie de no- ve "book" procurado num dos possveis
mentao de referncia do J2EE 1.4 veja
vidades, como o suporte a web services, o contextos (page, request, session ou application).
no quadro Primeiros passos como fazer
EJB 2.1, JMX, Deployment API, Servlets 2.4 O analisador de expresses ento traduz o
a instalao.
e JSP 2.0 (para uma viso geral das novida- operador . (ponto) em mtodos getXXX
A aplicao consiste numa livraria on-line
des do J2EE 1.4, veja o primeiro artigo desta onde XXX o nome da propriedade na
com as funcionalidades de exibir a lista de
coluna, na Edio 1). expresso e navega na hierarquia de ob-
livros disponveis, detalhar um determina-
Nesta edio, vamos explorar com de- jetos usando introspeco.
do livro, adicionar livros cesta de compras
talhes as novidades do JSP 2.0 e apontar Para manipular objetos dessa forma
e finalizar um pedido. A Figura 1 mostra
algumas boas prticas para o uso dos novos preciso seguir o padro JavaBeans, ou seja,
a listagem dos livros disponveis, gerada
recursos. os objetos devem ser definidos em classes
pela pgina bookcatalog.jsp.
com um construtor vazio e mtodos get e set
Facilidade de programao para leitura e escrita dos atributos.
Linguagem de expresses
O objetivo principal da nova especificao Para o acesso a atributos de objetos
A linguagem de expresses (Expression
JSP melhorar a legibilidade do cdigo e e elementos de listas, a linguagem de
Language EL) melhora bastante a sintaxe
expresses defi ne dois operadores: . e
do JSP, aumentando o nvel de
[] (colchetes). Os dois tm aplicaes
abstrao dos comandos. Um
semelhantes, porm [] permite o uso de
container web do novo J2EE 1.4
variveis como argumentos. Usando esse
inclui um analisador de expres-
operador, o exemplo anterior poderia ser
ses. As expresses podem ser
escrito da seguinte maneira:
usadas em qualquer lugar da
pgina misturadas ao cdigo Preo: ${book[price]}
HTML ou em atributos de tags
Porm, o uso mais indicado para os col-
exceto em scriptlets (cdigo
chetes no acesso a listas indexadas. Por
Java dentro da pgina JSP).
exemplo, imagine que exista um atributo
Por exemplo, imagine que
chamado allBooks no request, contendo uma
precisamos exibir o preo de
coleo de BookDetails do tipo java.util.ArrayList.
um determinado livro. Va-
O preo do primeiro livro da lista poderia
mos supor que um objeto da
ser lido dessa forma:
classe database.BookDetails (que
representa a entidade Livro) Preo: ${allBooks[0].price}
passado para o JSP como um
atributo do request. At o JSP 1.2, J no caso dos livros estarem armazena-
o preo do livro poderia ser exi- dos num java.util.Map, o preo do livro com
Figura 1. Exemplo BookStore: livros disponveis (lista reduzida) bido da seguinte forma: chave 001 poderia ser lido assim:

28 Java Magazine Edio 6

jm6-book.indb 28 3/4/2003, 17:51:05


Nova linguagem de expresses,

s do JSP 2.0 padronizao da JSTL, fragmentos


JSP e tag files so algumas
extenses na verso 2.0
a o no novo JSP
JLIO CSAR LINS

Preo: ${allBooks [001].price} Operadores Apesar de essas novas palavras-chave


A linguagem de expresses tambm serem bastante intuitivas, uma boa
A leitura de atributos tambm permitida
suporta operadores aritmticos, lgicos e idia evit-las, optando pelos operadores
para vrios nveis de hierarquia. Supondo
relacionais. As seguintes so expresses j usados na linguagem Java, para evitar
que a classe BookDetails tenha um atributo do
vlidas: confuses.
tipo Author, tendo por sua vez um atributo
firstName do tipo String. O primeiro nome ${100 == 100}
${5 < 10} Tag Files
do autor seria exibido assim:
${10 % 3} Os Tag Files permitem a implementao
Nome: ${book.author.firstName} Alm disso, curiosamente, foram defi- de bibliotecas de tags sem o uso de cdigo
nidas novas palavras-chave equivalentes Java. So arquivos XML contendo a defini-
Objetos implcitos o e o comportamento das tags. Permitem
aos operadores lgicos e relacionais. O
Alm de acesso aos JavaBeans, a lingua-
conjunto de expresses a seguir tem o o uso de outras tags dentro do corpo da tag
gem de expresses tambm facilita a leitura
mesmo efeito do anterior: definida e no requerem conhecimento da
de informaes tais como os parmetros
${100 eq 100} linguagem Java.
da requisio, o cabealho HTTP, cookies
${5 lt 10} Um Tag File um arquivo com extenso
e parmetros de inicializao. A leitura
${10 mod 3} .tag, semelhante a um JSP convencional
feita atravs de objetos implcitos:
param usado para acessar parmetros
do request. Por exemplo, o campo ID de um Primeiros passos
formulrio submetido poderia ser acessado
usando ${param.ID};
header para acessar informaes do
P ara instalar e executar o exemplo
apresentado nesse artigo, siga estes
passos:
cado anteriormente, digite o comando ant
package-bookstore.
6. A verso usada no exemplo foi a BookS-
cabealho da requisio HTTP, como o 1. Faa o download Java 2 Enterprise Edi- tore3 (so quatro exemplos BookStore). Para
servidor (host) onde a aplicao executa, ou tion SDK Beta 1.4 (J2EE 1.4) e do J2EE Tutorial compilar essa verso, entre no diretrio
o tipo de browser do cliente. Por exemplo: Addendum e instale-os (veja referncias). %J2EE_HOME%\doc\tutorial\examples\
${header.host}; 2. Defina a varivel de ambiente J2EE_ web\bookstore3 e digite o comando ant
cookie retorna um cookie a partir de seu HOME, apontando para o diretrio de build.
nome. Por exemplo, ${cookie.ultimoAcesso} aces- instalao do J2EE 1.4. Configure tambm 7. Compacte o contedo do diretrio
sa o cookie criado com o nome ultimoA- a varivel de ambiente PATH para incluir o %J2EE_HOME%\doc\tutorial\examples\
cesso. diretrio %J2EE_HOME%\bin. web\bookstore3\build e chame o arquivo
initParam d acesso aos parmetros de 3. Usando a linha de comando, inicie o de bookstore3.war.
inicializao da aplicao, obtidos atravs banco de dados Cloudscape, com o co- 8. Inicie a ferramenta de deploy do J2SDKEE
do seu nome. ${initParam.defaultLocale}, por mando cloudscape start. Inicie tambm o 1.4 atravs do comando deploytool e abra o
exemplo, obtm o valor do parmetro com servidor J2EE, usando o comando j2ee. arquivo bookstore3.war. Clique o boto de
nome defaultLocale. 4. Para criar a base de dados do exemplo, deploy e, quando solicitado, abra o arquivo
Existem ainda os objetos implcitos entre no diretrio %J2EE_HOME%\doc\ sun-j2ee-ri.xml que se encontra no diretrio:
paramValues e headerValues, usados para tutorial\examples\web\bookstore e digite %J2EE_HOME%\doc\tutorial\examples\
obter arrays de Strings com mltiplos o comando ant -create-book-db. web\bookstore3\build\META-INF.
valores para parmetros contidos no Nota: o arquivo WAR do exemplo pode ser 9. Pronto. A aplicao j pode ser acessada
request e no header, respectivamente. baixado do site da Revista. Com ele possvel pelo endereo:
Tambm possvel acessar JavaBeans pular os passos 5, 6 e 7. http://localhost:8000/bookstore3/
num contexto especfico, usando os 5. O prximo passo compilar os arquivos bookstore.jsp
objetos pageScope, requestScope, sessionScope e do exemplo BookStore. No diretrio indi-
applicationScope.

Edio 6 Java Magazine 29

jm6-book.indb 29 3/4/2003, 17:51:14


Novidades do JSP 2.0

pode conter cdigo HTML, expresses conter chamadas a outras tags e expres- mento. Observe tambm na listagem o uso
(em EL) e chamadas a outras tags. A di- ses; a nica restrio no poder usar das aes <jsp:invoke> e <jsp:param>.
ferena est na declarao dos atributos scriptlets.
recebidos e nas variveis utilizadas, que No exemplo da Listagem 2, podemos ver Configuraes globais
devem ser especificados no cabealho do um trecho do JSP bookcatalog.jsp, que chama Com as configuraes globais (Global Con-
arquivo. Observe as declaraes sendo fei- a tag <sc:catalog> passando dois atributos figurations) possvel definir propriedades
tas com o uso das diretivas <%@ atributo %> que so trechos de cdigo JSP. Nesse caso, para um conjunto de JSPs. As opes de
e <%@ varivel %> na Listagem 1. a tag chamada decide qual trecho ser configurao so avaliao de expresses
executado dependendo do livro estar ou da EL, execuo de scriptlets, definio da
Fragmentos no em promoo. codificao da pgina (encoding) e incluso
Fragmentos (JSP fragments) so pores Os fragmentos passados como argu- de cabealho e rodap.
de cdigo JSP escritas para serem reusadas mentos tambm podem conter variveis As configuraes so descritas no
dentro de uma aplicao. Por conveno, a serem preenchidas pela tag chamada. descritor web (web.xml) dentro do
fragmentos devem ser salvos em arquivos As variveis so declaradas na forma elemento <jsp-config>, usando elemen-
com terminao .jspf. Esses arquivos devem ${varivel}, como ${origPrice} e ${salePrice} usa- tos <jsp-property-group>. O exemplo da
ser includos em outros JSPs usando o co- das no exemplo. Esse recurso acrescenta Listagem 3 faz a incluso de um cabe-
mando include do JSP. Fragmentos tambm s tags o poder de manipular o fragmento alho e um rodap em todas as JSPs da
podem ser passados como atributos de sem muito esforo de codificao, pois as aplicao.
tags, na forma de pores de cdigo JSP variveis podem receber valores atravs de
(usando a nova ao jsp:attribute) e podem parmetros passados na execuo do frag- JSTL
A JSP Standard Tag Library (JSTL) foi
lanada em julho de 2002 e compatvel
Listagem 1. Exemplo de Tag File com a verso 1.3 do J2EE; no J2EE 1.4 j
<!-- Declara a utilizao de outras bibliotecas --> includa como parte da plataforma. A
<%@ taglib uri=/jstl-c prefix=c %> JSTL contm uma srie de tags bastante
<%@ taglib uri=/jstl-fmt prefix=fmt %>
teis na programao JSP, divididas em
<!-- Declara os atributos recebidos --> quatro bibliotecas:
<%@ attribute name=bookDB required=true
rtexprvalue=true type=database.BookDB %> Ncleo (Core) contm tags usadas para
<%@ attribute name=color required=true %> controlar o fluxo da pgina e a sada de
<!-- Declara um atributo do tipo fragment (que pode ser executado) --> mensagens;
<%@ attribute name=normalPrice fragment=true %> Processamento XML (XML Processing)
<!-- Declara o uso de uma varivel -->
<%@ variable fragment=normalPrice name-given=price %> tags utilitrias para processamento de
<%@ attribute name=onSale fragment=true %> XML;
<%@ variable fragment=onSale name-given=origPrice %>
<%@ variable fragment=onSale name-given=salePrice %> Internacionalizao (I18N Capable
Formatting) tags usadas para formao
<center>
<table> de textos, valores monetrios e nmeros,
<!-- Percorre os livros lidos do banco de dados --> com base na localizao do usurio;
<c:forEach var=book begin=0 items=${bookDB.books}>
<tr> Acesso a dados (Database Access) tags
<!-- OMITIDO: montagem do ttulo do livro --> para acesso a bancos de dados relacionais
<c:set var=sale value=${book.price * .85} />
de maneira simplificada, sem a necessidade
<!-- Decide qual fragmento executar verificando de cdigo Java.
se o livro est em promoo -->
<c:choose> A explorao do JSTL daria um artigo
<c:when test=${book.onSale} > parte aqui vamos nos concentrar na
<!-- Executa o fragmento onSale (veja declarao dos atributos) -->
<jsp:invoke fragment=onSale> relao desta com a tecnologia JSP.
<!-- Define o valor das variveis passadas para o fragmento -->
<jsp:param name=origPrice value=${book.price}/>
<jsp:param name=salePrice value=${sale}/> Expresses com J2EE 1.3
</jsp:invoke> importante ressaltar que a JSTL j su-
</c:when>
<c:otherwise> porta a linguagem de expresses quando
<jsp:invoke fragment=normalPrice> usada em atributos de tags. Em outras pala-
<jsp:param name=price value=${book.price}/>
</jsp:invoke> vras, o valor de um atributo na chamada de
</c:otherwise> uma tag pode ser o resultado da avaliao
</c:choose>
&nbsp;</td> de uma expresso. Com isso, todos os re-
<!-- OMITIDO: montagem dos dados do autor --> cursos da linguagem de expresses podem
</tr>
</c:forEach> ser usados num container J2EE 1.3, desde
</table> que dentro de atributos de tags, e no como
</center>
parte do texto.

30 Java Magazine Edio 6

jm6-book.indb 30 3/4/2003, 17:51:15


inteligncia do 2.0 simplificar a sintaxe, aumentando
Listagem 2. Passagem de fragmento como atributo de uma tag
componente reu- assim a produtividade e facilitando a ma-
<sc:catalog bookDB=${bookDB} color=#cccccc> svel. nuteno do cdigo. O JSP j est chegando
<!-- Exibe o preo do livro de maneira convencional -->
<jsp:attribute name=normalPrice> Com as bibliotecas a um estado maduro e o suporte de ferra-
<fmt:formatNumber value=${price} type=currency/> de tags, a criao mentas j bem rico. Segundo a equipe
</jsp:attribute>
de componentes na responsvel pela especificao, a idia
<!-- Exibe o preo normal do livro riscado camada web deu continuar avanando nas melhorias, bus-
e o preo promocional em vermelho -->
<jsp:attribute name=onSale> um grande salto e cando a sintaxe do XML.
<strike><fmt:formatNumber value=${origPrice} agora evolui ainda Com a incorporao de melhorias a cada
type=currency/></strike><br/>
<font color=red><fmt:formatNumber mais com os novos nova verso, o desenvolvimento web com
value=${salePrice} type=currency/></font> recursos do JSP 2.0 JSP est se tornando cada vez mais simples
</jsp:attribute>
</sc:catalog> o reuso passa a e ao mesmo tempo mais poderoso. Outro
ser possibilidade grande salto ser dado com o lanamento
Listagem 3. Exemplo de configurao global concreta no desen- da tecnologia JavaServer Faces - JSF (veja
<web-app> volvimento. Hoje mais nesta coluna, na Edio 3). Em breve
... j existem diversos a dificuldade para criar interfaces web
<jsp-config>
... componentes, no ricas e de fcil manuteno ser coisa do
<jsp-property-group> somente os mais passado.
<url-pattern>/*.jsp
</url-pattern> genricos como os
<include-prelude>/template/prelude.jspf da JSTL, mas tam-
</include-prelude> jcp.org/jsr/detail/151.jsp
<include-coda>/template/coda.jspf bm outros que se
JSR-151 (especificao do J2EE 1.4)
</include-coda> propem a resolver
</jsp-property-group>
</jsp-config> problemas mais jcp.org/jsr/detail/152.jsp
</web-app> especficos, como JSR-152 (especificao do JSP 2.0)
paginao de dados, java.sun.com/j2ee/download.html
Na verso 2.0 do JSP, a especificao leitura de arquivos e logging. Download do J2EE 1.4 beta e do Tutorial
melhorou a sintaxe do cdigo, delegando Por exemplo, o site jsptags.com, oferece Addendum
a avaliao da expresso para o container e uma biblioteca de tags para a paginao de
permitindo assim que qualquer biblioteca registros muito interessante, que permite java.sun.com/products/jsp/jstl
de tags possa tirar proveito da linguagem navegar para frente e para trs ou acessar JSP Standard Tag Library - JSTL
de expresses. uma pgina diretamente, alm de mudar jakarta.apache.org/taglibs
Usando a JSTL, tambm possvel usar o look-and-feel da paginao, com suporte Jakarta Taglibs
expresses para ler atributos de objetos, ao formato de sites de busca como o Google
mas necessrio usar a tag <c:out>. Com e o Altavista. jsptags.com
essa tag, a exibio do preo do livro mos- O projeto Apache Jakarta, responsvel Portal com referncias para vrias taglibs
trada anteriormente ficaria dessa forma: pela implementao de referncia da JSTL,
oferece vrias bibliotecas, como DateTime www.javamagazine.com.br/downloads
Preo: <c:out value=${book.price}/> /jm6/jm6-jlins-jsp.zip
para formatao de data/hora, Mailer para
Reuso na camada web envio de e-mails, alm das bibliotecas do
Antes das verses mais recentes do JSP, framework Struts, j muito usadas pela Jlio Cesar Lins (jcsl@cin.ufpe.br) consultor
produzir componentes reusveis na ca- comunidade de desenvolvimento web. independente de Java e J2EE, programador
mada web era uma tarefa complicada, j certificado pela Sun e certificado em anlise e
que era feita basicamente com comandos Concluses projeto pela IBM.
include em pginas JSP, o que limitava a O principal objetivo da nova verso JSP

Edio 6 Java Magazine 31

jm6-book.indb 31 3/4/2003, 17:51:16


Dicas e Solues
Uso de final e desempenho

bem conhecido o que a palavra-chave


final capaz de fazer teoricamente
campos final s podem ser atribudos
fcios prticos do uso desse modificador.
Alm de forar o uso correto das classes,
Uma boa maneira de verificar as melho-
rias selecionar algumas classes de um
sistema ou subsistema pronto que j tenha
mtodos e variveis (veja quadro Usos
uma nica vez, mtodos final no podem de final), usar final permite que compi- medidas de desempenho bem definidas e
ser redefinidos e classes final no podem ladores e mquinas virtuais faam otimi- recompil-las aps ter alterado o cdigo
ser herdadas (veja detalhes no quadro zaes como inlining (veja o quadro ao para usar final em todos os lugares poss-
abaixo). lado), aumentando consideravelmente o veis. Na maioria dos casos, o ganho ser
Mas muitos no conhecem alguns bene- desempenho do cdigo. claramente perceptvel.

Usos de final

A pesar de fazer parte de Java desde sua primeira verso, a


palavra-chave final no to usada nem como poderia.
Conhea os principais usos de final na linguagem.
realizada, visto que o mtodo realizaOperacao() final.

Em variveis de instncia
Variveis de instncia final precisam ser inicializadas na decla-
rao, ou em todos os construtores da classe. Tomando como
Em classes
base a seguinte classe, por exemplo:
Quando uma classe declarada final, ela no pode ser herdada.
Conseqentemente, o seguinte trecho de cdigo no compila: public class Exemplo {
private final int inicializado = 50;
public final class ClasseNaoExtensivel { private final int posInicializado;
//...
} public Exemplo() {
class Filho extends ClasseNaoExtensivel { //No compila posInicializado = 0;
//... }
} public Exemplo(int valor) {
posInicializado = valor;
Em mtodos }
Mtodos declarados final, no podem ser redefinidos em sub- }
classes. Uma boa razo para fazer isto garantir a segurana do
Seriam invlidos os seguintes construtores:
cdigo, como no exemplo abaixo:
//No inicializa posInicializado
public abstract class OperacaoBanco { public Exemplo(String disp) {
//... System.out.println(disp);
private void enviaDados(DadosCliente dc) }
throws ValidacaoException {
//Aqui so realizadas operaes seguras e //Tenta atribuir novamente um valor a uma varivel final
//crticas, como autenticao, compactao etc. public Exemplo(String disp, int valor) {
} System.out.println(disp);
protected abstract DadosCliente coletaDados() { inicializado = valor;
// As subclasses coletam os dados de forma especfica }
}
public final void realizaOperacao()
throws ValidacaoException { Em variveis locais
// importante que estaa operao s seja realizada
//da forma definida nesta classe
Variveis locais final precisam ser inicializadas na declarao e
enviaDados(coletaDados()); no podem depois ter outro valor atribudo. Por exemplo, para
}
}
o seguinte mtodo a segunda linha no permitida:
Nesse exemplo, as subclasses de OperacaoBanco podem definir public void metodo() {
final int i = -1;
diversas maneiras de coletar os dados para operaes especficas, i++; // Erro!
mas no podem mudar a forma como a operao de envio }

32 Java Magazine Edio 6

jm6-book.indb 32 3/4/2003, 17:51:20


Dicas e pequenas solues
para problemas comuns no
dia-a-dia do desenvolvedor

MICHAEL NASCIMENTO SANTOS

ser interpretadas como uma indicao de


rollback podem porque o container pode
Inlining de mtodos simplesmente descartar a instncia e ten-
Certos trechos podem ser modificados pelo compilador (ou em execuo, pelo JIT) tar utilizar outra no lugar, dependendo das
devido ao uso de final. Isso se aplica especialmente a mtodos. Veja um exemplo: circunstncias em que as excees forem
lanadas.
class Exemplo {
private int a;
Portanto, a nica forma de garantir
public final void setA(int a) { que uma transao seja cancelada,
this.a = a;
} chamar setRollbackOnly() na instncia de
} javax.ejb.EJBContext de seu EJB. Observe que
public class Teste { isso s se aplica a EJBs com transaes
private static void metodoTeste(Exemplo ex) { gerenciadas pelo container (CMT).
ex.setA(5);
}
java.sun.com/docs/books/jls
public static void main(String[] args) {
metodoTeste(new Exemplo()); Java Language Specification (para detalhes
} sobre o uso de final)
}
Visto que o mtodo setA no pode ser redefinido em subclasses, o compilador pode java.sun.com/j2se/1.4.1/docs/guide/
facilmente substituir a chamada ao mtodo em Teste.main pelo seu equivalente. Assim, serialization
o bytecode gerado para ex.setA(5) seria o mesmo que: Serializao
ex.a = 5;
java.sun.com/j2ee/sdk_1.3/techdocs/api/
(Esta uma instruo invlida se usada diretamente no cdigo fonte, mas possvel javax/ejb/EJBContext.html
nos arquivos .class). Descompilar as classes com e sem o uso de final revela o nmero Documentao do mtodo setRollbackOnly
de instrues economizadas.
Michael Nascimento Santos
(michael.nascimento@tesla.com.br) Sun Certified
Programmer for the Java 2 Platform 1.2 & 1.4 e Sun
Certified Web Component Developer for J2EE. H qua-
Recuperando sesses aps quedas Rollback em EJBs tro anos desenvolve com Java, trabalhando com diversas
A maioria dos containers web permite Os desenvolvedores que trabalham arquiteturas e moderador da java-list, lista de discus-
que sesses sejam persistidas e recupera- com Enterprise JavaBeans conhecem so do SouJava, alm de membro individual do JCP e
das mesmo aps uma queda do container. as interfaces javax.ejb.SessionContext e funcionrio da Tesla Tecnologia (www.tesla.com.br).
No entanto, para tirar proveito desse me- javax.ejb.EntityContext, disponveis desde a
canismo, necessrio que todos os objetos primeira verso da especificao de EJB.
armazenados nos objetos HttpSession sejam O mtodo setRollbackOnly() e st em ambas as
serializveis ou seja, suas classes devem interfaces, visto que elas so subinterfaces
implementar a interface java.io.Serializable di- de javax.ejb.EJBContext. Cham-lo indica para
reta ou indiretamente e que sejam tambm o container EJB que o nico final possvel
serializveis todas as suas variveis de para a transao atual um rollback.
instncia no-transientes. Se o seu cdigo A questo que muitos desenvolvedo-
seguir esse padro, provavelmente apenas res acreditam que lanar uma exceo
uma propriedade na configurao de seu qualquer a partir de um dos mtodos
servidor precisar ser alterada para que as de um EJB ir cancelar a transao. Mas
sesses dos usurios sobrevivam s para- no bem assim. Somente excees que
das programadas e s inesperadas. herdam de java.lang.RuntimeException podem

Edio 6 Java Magazine 33

jm6-book.indb 33 3/4/2003, 17:51:21


Ttulo

34 Java Magazine Edio 6

jm6-book.indb 34 3/4/2003, 17:51:23


Edio 6 Java Magazine 35

jm6-book.indb 35 3/4/2003, 17:51:31


Asseres no J2S
Garanta a qualidade do cdigo por ante c

A
verso 1.4 do J2SE realmente inovadora. Alm de mui- A expresso2 pode ser qualquer expresso Java, exceto chamadas
tas mudanas e melhorias nas APIs (como a introduo a mtodos void. Como uma assero s til ao desenvolvedor
de logging, expresses regulares e um novo pacote de (ou equipe de suporte tcnico da aplicao em produo), no
I/O), foi introduzida uma mudana na linguagem em si: o uso necessrio que a descrio faa sentido para o usurio final.
de asseres (assertions). Veja alguns exemplos de asseres:
Asseres so usadas para facilitar a realizao de testes de
sanidade (sanity checks) em uma aplicao. Mais precisamente, assert conexao != null;

servem para testar condies que devem ser sempre verdadeiras assert !lista.isEmpty(): lista vazia;

(caso a condio seja falsa, existe um bug no cdigo). assert a > 0: a <= 0;

Por que a mudana na linguagem?


Sintaxe O leitor pode estar se perguntando por que a linguagem Java
A sintaxe de asseres em Java muito simples. Uma assero foi modificada para realizar uma tarefa que poderia ser feita
pode ser feita de duas maneiras: com uma simples combinao if/throw? Veja alguns motivos
assert expresso; para a mudana:
ou Facilidade de uso muito mais fcil usar assert do que a
combinao if/throw. E quanto mais asseres existirem no c-
assert expresso1: expresso2;
digo, maiores as chances de serem detectados erros em tempo
A primeira maneira equivalente a: de desenvolvimento;
if (!expresso) Flexibilidade o recurso de asseres pode ser habilitado ou
throw new AssertionError(); desabilitado em tempo de execuo, tanto globalmente quanto
Ou seja, caso expresso no seja verdadeira, gerada uma ex- para pacotes ou classes;
ceo (do tipo AssertionError). Desempenho caso as asseres estejam desabilitadas, o
Com a segunda maneira, necessrio passar, alm da expresso custo em desempenho praticamente zero (ao contrrio da al-
a ser testada (expresso1), uma descrio (expresso2). O cdigo ternativa do if/throw, onde a expresso de teste sempre avaliada,
equivalente : causando impacto significativo).
if (!expresso1)
throw new AssertionError(expresso2); Usando asseres
Para garantir a mxima compatibilidade com as verses an-
teriores do J2SE, onde assert no era uma palavra-chave, o uso
Listagem 1. A.java de asseres est desabilitado por padro, tanto no compilador
public class A { quanto na mquina virtual.
public static void main( String args[] ) { Para habilit-las, necessrio passar a opo -source 1.4 ao
System.out.println( "A.main()" );
B.main(args); javac (similarmente, existe a opo -source 1.3, que a default).
assert false: "false em A: B deveria ter " + Para compilar o cdigo das Listagens 1 e 2, por exemplo, o
"terminado a execuo do programa";
} comando :
} $ javac -source 1.4 A.java B.java

Listagem 2. B.java Nesse caso, se no for passada a opo -source 1.4, o compilador
public class B { exibir uma mensagem de erro:
public static void main(String args[]) {
System.out.println("B.main()"); $ javac A.java B.java
if (false) { A.java:7: warning: as of release 1.4, assert is a
System.exit(0); keyword, and may not be used as an identifier
} assert false : false em A: B deveria ter terminado a
assert false : "false em B: deveria ter " + execuo do programa;
"terminado a execuo do programa"; ^
} [...]
} 4 errors
2 warnings

36 Java Magazine Edio 6

jm6-book.indb 36 3/4/2003, 17:51:40


S E 1.4 Como usar comandos assert
para detectar erros mais
cedo no desenvolvimento

e cipao
FELIPE LEME
J para a execuo, existem vrias opes disponveis. Veja um Para garantir pr-condies, ps-condies e invariantes
resumo das opes na Tabela 1. Portanto, para executar a classe Asseres facilitam a prtica do design-by-contract, ou seja, elas
A com as asseres habilitadas, usa-se: podem ser usadas para garantir pr-condies (condies que
$ java -ea A devem ser verdadeiras antes de uma operao), ps-condies
(condies que devem ser verdadeiras aps uma operao) e
Esta ser a sada:
invariantes (condies que devem permanecer invariveis).
Veja um exemplo:
A.main()
private double totalComJuros
B.main()Exception in thread main java.lang.Assertion
/* ... */
Error: false em B: deveria ter terminado a execuo do
public void calculeTotalComJuros() {
programa
// pr-condio
at B.main(B.java:9)
assert this.parcelas > 0;
at A.main(A.java:4)
// invariante
assert objetoValido();
Note que possvel combinar opes. Por exemplo, para exe-
cutar a classe A com as asseres habilitadas no pacote default, //Realizar clculos financeiros, alterando totalComJuros
mas desabilitadas na classe B (mostrada na Listagem 2), a // invariante
sintaxe : assert objetoValido();

$ java -ea:... -da:A B // ps-condio


assert this.totalComJuros > this.total;
E a sada: }

Aqui, o mtodo objetoValido checa se as estruturas internas do


A.main() objeto so vlidas e se os clculos esto corretos.
B.main() Exception in thread main java.lang.Assertion
Error: false em A: B deveria ter terminado a execuo do
programa
Para testar uma condio que voc supe ser verdadeira
at A.main(A.java:5) Um caso tpico na chamada de um mtodo em um objeto
retornado por outro mtodo. Por exemplo:
Object objeto3 = objeto1.getObjeto2().getObjeto3();
Boas prticas
Embora seja simples a sintaxe de assert, pode ser difcil saber Aqui estamos assumindo que objeto1.getObjeto2() sempre retorna
quando usar esse comando. Nesta seo, so listadas as princi- um objeto no-nulo. Se for retornado null, a aplicao levantar
pais situaes onde devem ser usadas asseres. Sero mostradas uma NullPointerException, o que poderia ser evitado usando-se
tambm algumas situaes onde no se deve us-las. uma assero.

Item Habilitar asseres Desabilitar asseres

todas as classes exceto as de sistema -ea (ou -enableassertions) -da (ou -disableassertions)

vrias classes -ea: classe... (ou -enableassertions: classe...), usando um -da: classe... (ou -disableassertions: classe), usando um parmetro
parmetro para cada classe para cada classe
pacote default -ea: ... (ou -enableassertions: ...) -da: ... (ou -disableassertions: ...)

pacotes especificados -ea: pacote... ou -enableassertions: pacote...), com um par- -da: pacote... (ou -disableassertions: pacote...), usando um parme-
metro para cada pacote tro para cada pacote
classes de sistema -esa (ou -enablesystemassertions) -dsa (ou -disablesystemassertions)

Tabela 1. Opes para asseres na JVM

Edio 6 Java Magazine 37

jm6-book.indb 37 3/4/2003, 17:51:42


Asseres no J2SE 1.4

assert objeto1.getObjeto2()!= null;


Object objeto3 = objeto1.getObjeto2().getObjeto3(); Idioms de asseres
Para garantir que o valor de uma varivel est em seu domnio vlido
Por exemplo:
assert (tamanho < TAM_MAXIMO && tamanho > TAM_MINIMO):
E mbora as prticas de quando usar (ou no) asseres sejam
comuns em outras linguagens de programao, existem al-
guns casos particulares na linguagem Java. So os chamados
"tamanho fora da faixa: " + tamanho;
idioms (idiom, nesse caso, refere-se a um padro de codificao
Em declaraes condicionais, para garantir que a condio vlida especfico a uma linguagem de programao). Em particular,
Por exemplo: destacamos dois idioms para asseres:

Forando a retirada de asserts do arquivo binrio


switch(naipe) {
case Naipe.PAUS: Caso seja necessrio retirar asserts do bytecode de uma classe
// ... no ambiente de produo o que s deve ser feito em casos
break;
case Naipe.COPAS: extremos, quando o tamanho da classe crtico , pode-se usar
// ... a seguinte estrutura:
break;
case Naipe.ESPADAS:
// ... static final boolean usarAssercoes = true;
break; //mude p/ false para retirar asserts do cd. compilado
case Naipe.OURO: if(usarAssercoes) assert expresso;
// ...
break;
default: Caso a varivel useAssercoes seja mudada para false, o compi-
assert false: naipe invlido: + naipe; lador no gerar a declarao de assert (j que a condio do
}
if ser sempre falsa).
ou:
Forando o uso de asseres em tempo de execuo
Em situaes onde necessrio forar o uso de asseres em
String status = comando.getStatus();
assert status!= null; tempo de execuo, use o seguinte idiom na inicializao do
sistema:
if (status.equals(status.OK)) {
// tratar status OK
} else if (status.equals(status.ERROR)) { static {
// tratar status de erro boolean usandoAssercoes = false;
} else { assert usandoAssercoes = true;
assert false: status invlido: + status; if (! usandoAssercoes )
} throw new RuntimeException(
Esta aplicao exige asseres habilitadas);
}

Para checar os parmetros de mtodos no-pblicos


Note que, nesse caso, a expresso do assert uma atribuio
Quando se tem controle sobre quem est acessando um m-
e no uma comparao, o que gera um efeito colateral: a atri-
todo (caso o mtodo seja private ou package, ou se for protected,
buio do valor true para a varivel usandoAssercoes. Caso as as-
sendo a classe com visibilidade package ou protected), possvel
seres estejam habilitadas (em tempo de execuo), a varivel
usar asseres para garantir que os parmetros sejam passados
no ser mudada e a aplicao lanar uma exceo.
corretamente. Veja um exemplo:

class FormValidator { Existe, porm, uma exceo para essa regra: os casos onde uma
// Note que o escopo da classe package e no public
/* ... */
assero esteja verificando algo referente ao sistema de asseres
protected void validate(HttpRequest request) em si (veja um exemplo no quadro Idioms de asseres).
throws ValidationError {
assert request != null; No use asseres para checar parmetros de mtodos pblicos
// validao do request aqui
} Quando no se tem controle sobre quem est acessando seus
/* ... */ mtodos (principalmente em mtodos public), no se deve usar
}
asseres para checar parmetros, por dois motivos:
No use, nas asseres, expresses que gerem efeitos colaterais As asseres servem para checar erros imprevistos, mas o
Asseres devem ser usadas para realizar testes, mas no aes, uso de parmetros invlidos (de um mtodo pblico) um erro
pois os efeitos colaterais no sero executados caso as asseres previsvel;
estiverem desabilitadas em tempo de execuo. Por exemplo: Caso as asseres estejam desabilitadas, a checagem do pa-
rmetro no ter nenhum efeito. Um exemplo:
// forma correta
assert pilha.pop()!= null; public void setParent(Object parent) {
assert parent != null // Incorreto
// forma incorreta this.parent = parent;
Object topo = pilha.pop(); }
assert topo!= null;

38 Java Magazine Edio 6

jm6-book.indb 38 3/4/2003, 17:51:44


O correto:
java.sun.com/j2se/1.4/docs/guide/lang/assert.html
public void setParent(Object parent) { Guia oficial do J2SE 1.4 sobre asseres
if (parent = = null ) { //Correto
throw new NullPointerException(
objeto pai no pode ser null); www.javalobby.org/members/jdk14/index.jsp
} Download gratuito do livro JDK 1.4 Tutorial ( necessrio registrar-se no site;
this.parent = parent;
} o registro gratuito)
www.manning.com/travis
Concluses Site do livro JDK 1.4 Tutorial (editora Manning)
Embora seja novidade em Java, o uso de asseres j bastante
difundido em outras linguagens (as asseres estavam previstas
na especificao da linguagem Oak, precursora da linguagem
www.javamagazine.com.br/downloads/jm6/jm6-fleme-assercoes.zip
Java). Assim, j existem vrias convenes do que deve ou no
ser feito (as boas e ms prticas); esse artigo visa conscientizar
Felipe Leme (felipeal@iname.com) Engenheiro de Computao, atualmente
o leitor dessas prticas.
trabalhando como Consultor Snior para a Trust Consultores (www.trust.com.br) e
E, como diz Greg Travis (autor do livro JDK 1.4 Tutorial), qual- como instrutor Java para a SeedTS (www.seedts.com).
quer assero melhor que nenhuma!

Edio 6 Java Magazine 39

jm6-book.indb 39 3/4/2003, 17:51:46


Struts: primeiros
Conceitos, arquitetura e exemplos

N
o desenvolvimento de aplicaes O framework extensvel e adaptvel. Antes de entrarmos
web, a mistura de cdigo Java Com o nome completo Apache Struts nos detalhes sobre o framework, vamos
com HTML e JavaScript pode Web Application Framework, o Struts conhecer um pouco sobre as origens e
trazer muitos problemas no desenvolvi- muito popular entre os desenvolvedores caractersticas dos padres adotados.
mento, questo que se agrava quando a de aplicaes web com Java. Alm de ser
aplicao possui design grfico complexo software livre e bem documentado (tanto Arquiteturas e variaes
e funcionalidades avanadas. Torna-se na web como em diversos livros), o Struts O padro de arquitetura MVC (Modelo-
difcil a manuteno do cdigo e a inte- flexvel, extensvel e suportado pelas prin- Viso-Controlador) divide uma aplicao
rao entre a equipe de desenvolvimento cipais ferramentas de desenvolvimento em trs partes ou papis: dados e classes
e a de design grfico fica comprometida. (entre elas JBuilder, Eclipse, JDeveloper, de negcio (modelo), apresentao (viso)
Como solucionar as divergncias, separar NetBeans e IDEA). e controle.
melhor o trabalho das equipes e faz-las O Struts baseado em uma variao do Centralizando o controle, o padro MVC
trabalhar com produtividade em suas tradicional padro de arquitetura MVC reduz a duplicao de cdigo e simplifica a
especialidades? (Model-View-Controller) e se integra bem, manuteno e a evoluo de aplicaes web,
Um passo importante padronizar a na camada de apresentao, com outras alm de fomentar o reuso dos componentes
arquitetura das aplicaes, usando as tecnologias e frameworks web tais como da viso e do modelo.
melhores prticas do mercado e evitando JSP, Jakarta Velocity e XSLT. Para a cama- O JSP j suportava parcialmente o padro
partir do zero. nesse ponto que entram os da de dados, as opes so igualmente MVC, desde a verso 0.91, com a integrao
frameworks web, entre os quais o Struts do amplas: de JDBC a Enterprise JavaBeans, de JavaBeans com pginas JSP, em um pa-
projeto Apache Jakarta o mais conhecido passando por JDO. dro que ficou conhecido como Model 1.
e respeitado. a arquitetura do Struts que o torna to O Model 1, no entanto, no traz uma se-
parao clara entre os papis so apenas
dois componentes (JSPs e JavaBeans) para
desempenhar os trs papis do MVC. O
controle descentralizado e tanto os de-
senvolvedores como os designers precisam
editar pginas JSP, dificultando o trabalho
em equipe e a manuteno. Por apresentar
essas deficincias, a arquitetura Model 1
considerada adequada apenas para apli-
caes pequenas e praticamente estticas,
sem um fluxo complexo de navegao.
Para projetos de grande porte, manter
uma clara separao entre os papis torna-
se muito importante. Isso atingido com
a arquitetura Model 2, que adiciona um
elemento: o controlador. Implementado
geralmente por um servlet, o controlador
tem a responsabilidade de receber solici-
taes, acessar classes de negcio e coor-
denar a gerao do contedo da apresen-
tao (pginas HTML, WML etc.). O pouco
cdigo Java que resta na apresentao (nas
Figura 1. Arquiteturas Model 1 e Model 2 pginas JSP) pode ser substitudo por tags

40 Java Magazine Edio 6

jm6-book.indb 40 3/4/2003, 17:52:15


passos Conhea o framework lder
no desenvolvimento web

MIGUEL NGELO GALLINDO, RICHARDSON OLIVEIRA E DANIEL FREITAS

personalizadas, que, para os designers, so


mais fceis de compreender e manter. Fluxo Bsico
Veja uma comparao dos dois padres
de arquitetura na Figura 1.

Em cena, o Struts
O Struts uma implementao completa
e madura do padro de arquitetura Model
2. As melhores prticas dos Blueprints da
Sun (veja links) recomendam que aplica-
es web, ou a camada web de aplicaes
J2EE, sejam implementadas usando um
framework web MVC. E o Struts citado
vrias vezes como uma alternativa robusta
para isso.
O framework fornece um controlador
constitudo por trs elementos princi-
pais: o ActionServlet (servlet controlador),
o RequestProcessor e as classes de ao, ou
Actions. O ActionServlet e o RequestProces-
sor so fornecidos prontos pelo framework;
as aes devem ser implementadas pelo de-
senvolvedor estendendo a classe abstrata 1. No navegador web, submetido um for- 4. A classe de ao escolhida instanciada
Action. So as aes as responsveis por mulrio (ou clicado um link), gerando uma e chamado seu mtodo execute;
acessar o modelo, fazendo a ligao entre requisio recebida pelo ActionServlet, que 5. So realizadas as chamadas ao modelo
a lgica de negcio e o servlet. determina se h necessidade de instanciar (JavaBeans ou EJBs, por exemplo);
um ActionForm para encapsular os dados 6. Ao final da execuo, a ao retorna
De modo similar, o Struts fornece os
contidos na requisio, e identifica a ao um objeto ActionForward, indicando para
ActionForms, JavaBeans criados pelo de-
responsvel pelo seu processamento. As o ActionServlet que outra ao deve ser
senvolvedor, que tm suas propriedades
duas tarefas so realizadas baseando-se executada (retornando ao passo 4), ou que
preenchidas automaticamente pelo Struts
nos mapeamentos definidos no arquivo uma pgina deve ser exibida (continuando
a partir de formulrios HTML. Os Action-
struts-config.xml; com o passo 7);
Forms fazem a ponte entre a viso (pginas
2. Caso seja necessrio popular um Ac- 7. Se tiver sido indicada uma pgina, ela
JSP) e o controlador (aes e servlet). tionForm, recuperada uma instncia pr- processada para gerar a resposta requisi-
Alm desses, o Struts inclui uma srie existente da sesso (criada numa invocao o original, ou exibida a pgina original
de elementos adicionais importantes, anterior da mesma URL, por exemplo) ou com erros de validao;
como um pool de conexes (configurado gerada uma nova instncia. O ActionForm 8. A pgina consulta os JavaBeans inseri-
no arquivo struts-config.xml), e uma vasta ento populado com os parmetros da dos pela ao na requisio ou na sesso
bibliotecas de tags, contemplando prati- requisio; (esses objetos so fornecidos como respos-
camente todas as tarefas necessrias no 3. O mtodo validate do ActionForm ta pelo modelo ou construdos pela ao);
desenvolvimento de pginas JSP. chamado e, caso retorne algum erro 9. O resultado final (geralmente cdigo
(encapsulado em objetos ActionError), a HTML) enviado para o navegador, e o
Fluxo de uma aplicao Struts pgina original reexibida (passo 7), caso usurio pode prosseguir interagindo com
O ActionServlet o nico servlet de uma contrrio o processamento continua; a aplicao.
aplicao construda com o Struts. O arqui-

Edio 6 Java Magazine 41

jm6-book.indb 41 3/4/2003, 17:52:24


Struts: Primeiros passos

da sesso HTTP, estando portanto dispo-


Listagem 1. index.jsp nveis tanto para as aes responsveis
<%@ page language=java %> por processar a requisio quanto para
<!-- tlds das tags do struts --> as pginas JSP responsveis por exibir o
<%@ taglib uri=/WEB-INF/struts-bean.tld prefix=bean %>
<%@ taglib uri=/WEB-INF/struts-html.tld prefix=html %> resultado.
<html:html locale=true>
O quadro Fluxo bsico apresenta o flu-
xo de controle de uma aplicao baseada no
<head>
<!- a tag bean:message retorna uma mensagem Struts (a figura se baseia na documentao
armazenada no arquivo application.properties--> do framework).
<title><bean:message key=index.title/></title>
<html:base/>
</head> Obteno e instalao
<body bgcolor=white> Usaremos a verso 1.1 do Struts, e o Tom-
<h3><bean:message key=application.name/></h3> cat 4.1 (veja a coluna Java Livre nesta
<hr>
<html:link page=/listar.do> edio para mais informaes sobre como
<bean:message key=link.list/></html:link><br>
<html:link page=/preencheform.do>
instalar e configurar o Tomcat). O Struts
<bean:message key=link.register/></html:link> pode ser baixado em jakarta.apache.org/site/
</body>
</html:html> binindex.cgi. Aps descompactar o pacote
zip, voc ter uma rvore de diretrios
Listagem 2. Mapeamento das aes no struts-config.xml
semelhante mostrada na Figura 2
<global-forwards> Observe na figura os arquivos subli-
<forward name=excecoes path=/jsp/error.jsp/>
. . . nhados em vermelho. No struts.jar ficam
</global-forwards> as classes do framework, arquivos *.tld
<action-mappings>
<action path=/listar (com as definies das bibliotecas de tags)
type=br.com.recjug.exemplostruts.actions.ListarAction> e arquivos de propriedades. Este jar ne-
<forward name=sucesso path=/jsp/lista.jsp/>
</action> cessrio para a distribuio de aplicaes
<action path=/preencheform baseadas no Struts.
type=br.com.recjug.exemplostruts.actions.PreencheFormAction>
<forward name=cadastro path=/jsp/cadastro.jsp/>
</action>
...
Aplicao inicial
</action-mappings> Um bom ponto de partida para criar uma
aplicao Struts o arquivo struts-blank.war,
Listagem 3. Ao responsvel por obter a listagem de funcionrios
uma aplicao web vazia com os princi-
public final class ListarAction extends Action { pais arquivos necessrios e configuraes
public ActionForward execute(ActionMapping mapping,
ActionForm form, padro. Faa uma cpia deste arquivo para
HttpServletRequest req,
HttpServletResponse res) throws Exception {
o diretrio webapps do Tomcat. Ao iniciar o
try { Tomcat o war ser descompactado (certifi-
FachadaModelo fachada = FachadaModelo.getInstance();
Collection funcs = fachada.getFuncionarios();
req.getSession(true).setAttribute(funcs, funcs);
return mapping.findForward(sucesso);
}
catch (SQLException e) {
ActionErrors erros = new ActionErrors();
erros.add(ActionErrors.GLOBAL_ERROR, new ActionError(errors.sqlerror));
saveErrors(req, erros);
return mapping.findForward(excecoes);
}
}
}

vo web.xml deve conter um mapeamento sveis pelo seu processamento. Escolhida


genrico, direcionando pginas diferentes a ao, ela instanciada e em seguida
da aplicao para esse servlet. Em geral chamado seu mtodo execute, que realiza
utilizado o padro de URL (URL pattern) chamadas ao modelo. Ao final da execuo,
*.do. a ao retorna uma indicao para o contro-
Quando o ActionServlet recebe uma re- lador sobre qual viso deve ser exibida.
quisio, ela repassada para o Request- Tambm no struts-config.xml, so listados
Processor, que processa e valida os dados os ActionForms que devem ser instancia-
recebidos. No arquivo struts-config.xml, so dos e populados para cada URL. Estes so
mapeadas as URLs para as aes respon- inseridos como atributos da requisio ou Figura 2. A rvore de diretrios do Struts 1.1

42 Java Magazine Edio 6

jm6-book.indb 42 3/4/2003, 17:52:39


que-se de que sua instalao do Tomcat URLs /preencheform.do e
est configurada para tal); teremos uma /listar.do para montar os Listagem 4. Acesso aos elementos de uma coleo
rvore de diretrios semelhante mos- links. <%@ page language=java %>
trada na Figura 3. As aes listadas na p- <%@ taglib uri=/WEB-INF/struts-logic.tld prefix=logic %>
...
importante destacar dois arquivos gina inicial no possuem <h2>Lista de funcionrios cadastrados</h2>
nessa estrutura: struts-config.xml (j apre- formulrio associado. A <table border=1>
<tr>
sentado) e application.properties. Este lti- primeira, /listar.do, faz a <th>Nome</th>
<th>Email</th>
mo o arquivo de propriedades utilizado consulta base e retorna os <th>Cargo</th>
pelo Struts para a definio de mensa- funcionrios cadastrados. <th>Sexo</th>
</tr>
gens personalizadas, que levam em con- A ao /preencheform.do re- <logic:iterate id=func name=funcs>
siderao o idioma e a regio geogrfica torna uma Collection conten- <tr>
<td><jsp:getProperty name=func property=nome/></td>
(Locale) do cliente que estiver acessando do os cargos disponveis <td><jsp:getProperty name=func property=email/></td>
a aplicao. As mensagens definidas nes- na empresa, que usada <td><jsp:getProperty name=func property=cargo/></td>
<td><jsp:getProperty name=func property=sexo/></td>
te arquivo so inclusas nas pginas JSP na pgina de formulrio </tr>
por meio dos tags da biblioteca <html:>. </logic:iterate>
para alimentar um <se- </table>
Podemos fornecer mensagens em outros lect> HTML. A Listagem ...
idiomas incluindo na aplicao arquivos 2 mostra como estas duas Listagem 5. Trecho do mtodo perform da ao que obtm a listagem de cargos
da forma application_xx.properties onde aes so configuradas no ...
xx o cdigo padro de localidades, por arquivo struts-config.xml. FachadaModelo fachada = FachadaModelo.getInstance();
Collection cargos = fachada.getCargos();
exemplo en_US ou pt_BR. A tag action possui seis req.getSession(true).setAttribute(cargos, cargos);
Nota: o arquivo web.xml da aplicao atributos, mas quando no return mapping.findForward(cadastro);
...
struts-blank j fornece o ActionServlet con- existe associao a formu-
figurado para o mapeamento padro lrios, apenas dois so usa- Listagem 6. Usando as tags <html:options> e <html:select>
*.do e normalmente no necessita ser dos: path e type. O atributo <html:form action=/cadastre>
alterado pelo desenvolvedor. path informa a URL a partir <table><tr>
<td>Nome:</td><td>
da qual a ao ser chama- <html:text property=nome/>
Ponto de entrada da. O parmetro type infor- <html:errors property=nome/> </td>
</tr>
Nossa aplicao de exemplo bastante ma ao servlet qual classe de ...
simples: consiste de um cadastro e uma <tr>
ao ser instanciada. Cada <td>Cargo:</td>
listagem de funcionrios. Veja a navega- tag action pode conter tags <td>
o bsica da aplicao na Figura 4. <html:select property=cargo>
forward indicando outras <html:options collection=cargos
Vamos comear com o ponto de en- aes ou vises que podem property=idCargo
labelProperty=nome/>
trada, a pgina index.jsp (mostrada na ser executadas aps a pr- </html:select>
Listagem 1). Observe que usamos as pria ao. No exemplo cada </td>
</tr><tr>
ao especifica uma pgi- <td><html:submit/></td>
<td><html:reset/></td>
na diferente para exibir o </tr>
resultado da requisio. </table>
</html:form>
Tambm possvel definir
forwards globais dentro do
Listagem 7. Associando os ActionForms s aes no struts-config.xml
tag global-forwards.
A Listagem 3 mostra o <form-beans>
<form-bean name=cadastreForm
cdigo da ao ListarAction, type=exemplostruts.struts.forms.CadastreForm/>
...
que est associada URL </form-beans>
/ listar.do. Seu mtodo <action-mappings>
...
execute pode realizar dois <action type=exemplostruts.struts.actions.CadastreAction
forwards: o forward local path=/cadastre name=cadastreForm
scope=request validate=true
sucesso para o caso de input=/jsp/cadastro.jsp>
tudo ocorrer conforme o <forward name=sucesso path=/listar.do/>
</action>
esperado, que, como defi- ...
nido no struts - config.xml, </action-mappings>
exibe a pgina /jsp/lista.jsp;
ou caso ocorram excees, o forward global modelo, uma listagem de funcionrios, que
excecoes. retornada em uma coleo e adicionada
Figura 3. Estrutura da aplicao struts-blank.war O propsito da ao ListarAction obter, do sesso HTTP do usurio com o nome

Edio 6 Java Magazine 43

jm6-book.indb 43 3/4/2003, 17:52:41


Struts: Primeiros passos

arquivo struts-config.xml, que a ao pos-


Listagem 8. Mtodos validate e reset sui um ActionForm associado (Listagem
public class CadastreForm extends ActionForm { 7). O mtodo validate deste ActionForm
private String cargo; invocado e, caso ocorram erros, retorna
private String email;
private String nome; um objeto do tipo ActionErrors (Listagem
private String sexo; 8) de modo similar ao realizado pela ao
// Mtodos get e set omitidos de listagem. Estes erros so exibidos pelas
public void reset(ActionMapping mapping, HttpServletRequest request) {
tags <html:errors> na pgina de cadastro.
String cargo = ; String email = ; Se os dados forem validados correta-
String nome = ; String sexo = ;
} mente, a ao CadastreAction (no exibida
public ActionErrors validate(ActionMapping mapping, nas listagens) inclui o novo funcionrio
HttpServletRequest request) {
ActionErrors erros = new ActionErrors(); e retorna para a pgina de listagem dos
if (email == null || email.trim().equals()) { funcionrios.
erros.add(email, new ActionError(errors.emptyemail));
} Chegamos ao fim de nosso pequeno
if (nome == null || nome.trim().equals()) { exemplo. O fonte completo, incluindo ins-
erros.add(nome, new ActionError(errors.emptynome));
} trues de instalao, pode ser baixado do
if (cargo == null || cargo.trim().equals()) {
erros.add(cargo, new ActionError(errors.emptycargo));
site da Java Magazine.
}
if (sexo == null || sexo.trim().equals()) {
erros.add(sexo, new ActionError(errors.emptysexo));
Concluses
} Existem muitos frameworks para desen-
return erros;
} volvimento web, como Turbine, Tapestry e
} Webmacro (com objetivos e especialidades
diferentes), mas o Struts vem se tornando
funcs. Em caso de erro, a ao instancia de scriptlets, usaremos um tag de iterao um padro mundial pelo poder de seus
um objeto da classe ActionErrors que in- para percorrer todos os elementos. Veja na recursos, facilidade de uso e pelos ganhos
serido na requisio. O mtodo add dessa Listagem 4 o trecho de cdigo que gera a de produtividade que traz.
classe recebe dois argumentos: o primeiro lista de funcionrios. Este parte da pgina Este artigo mostrou apenas conceitos
classifica o erro, que pode assim receber /jsp/lista.jsp executada em resposta ao bsicos do Struts. H muitas outras fun-
tratamento diferenciado pelas vises, e o /listar.do. cionalidades, como formulrios dinmicos,
segundo indica qual mensagem do arquivo O atributo name da tag <logic:iterate> subprojetos, templates e tiles, alm das mui-
application.properties ser exibida para o usu- especifica (como esperado) o nome sob tas novidades da verso 1.1. Certamente,
rio. A constante ActionErrors.GLOBAL_ERROR o qual a coleo foi inserida na sesso existe material suficiente para vrios novos
usada para informar a aplicao sobre erros (ou na requisio no objeto implcito artigos.
inesperados. request do JSP). A cada iterao, um Java-
Bean disponibilizado e o corpo da tag
Listagem de funcionrios processado. O nome do bean informado
Nesta parte do exemplo, vemos como as atravs da propriedade id e pode ser utili- jakarta.apache.org/struts
tags do Struts facilitam bastante o desen- zado em tags <jsp:getProperty>. Stuts: documentao, downloads e referncias
volvimento. Na sesso do usurio temos
nossa coleo contendo os dados dos fun- Cadastro de funcionrios java.sun.com/blueprints
cionrios da empresa e queremos exibir Na ao de cadastro, obtemos a cole- Java Blueprints: diretrizes, padres e exemplos
o cargos, que tambm colocada na seguindo as melhores prticas recomendadas
esses dados na pgina. Para isso, em vez
sesso do usurio (veja a Listagem 5).
pela Sun
Esta coleo utilizada pela pgina de
viso /jsp/cadastro.jsp (Listagem 6) para www.javamagazine.com.br/downloads
preencher um <select> que faz parte do /jm6/jm6-varios-struts
formulrio de cadastro de funcionrios. O
Struts fornece uma tag bastante til para
essa tarefa, <html:select> que, em conjunto
Daniel Freitas (freitas@facilit.com.br), Miguel ngelo
com a tag <html:options>, monta a lista de
Gallindo (miguel@facilit.com.br) e Richardson
acordo com as propriedades desejadas de Oliveira (richardson@facilit.com.br) so certificados
cada objeto na coleo. pela Sun (SJCP) e engenheiros de software da Facilit
Quando ocorre a submisso da pgina, Tecnologia (www.facilit.com.br).
Figura 4. Pginas JSP da aplicao de exemplo o controlador determina, pela leitura do

44 Java Magazine Edio 6

jm6-book.indb 44 3/4/2003, 17:52:44


Edio 6 Java Magazine 45

jm6-book.indb 45 3/4/2003, 17:53:28


Automao com X D
Livre-se da codificao repetitiva

D
iversas reas da programao em
Java tm uma caracterstica bem
distinta: o uso de cdigo baseado
em modelos ou templates aquelas classes
que voc sempre acaba copiando de um
exemplo, ou cria baseando-se em padres
de projeto bem conhecidos. medida que
um projeto cresce, a criao dessas classes
se torna apenas trabalho repetitivo. Esse
o cenrio ideal para a aplicao e uma
ferramenta de gerao de cdigo como o
XDoclet.

Origens Figura 2. JBossIDE mostrando as tags XDoclet disponveis para um EJB


Visando livrar o programador do traba- Hoje, berg no participa mais do desen- Com o XDoclet, voc passa a ver os co-
lho repetitivo no desenvolvimento de EJBs, volvimento da ferramenta, mas o projeto mentrios de seu cdigo com outros olhos.
Rickard berg criou uma ferramenta cha- atraiu um grupo de programadores ao Eles passam a complementar o significado
mada ejbdoclet, que gerava interfaces de redor do mundo, tornando a equipe do dos programas, expressando coisas que a
componentes e seus deployment descriptors. projeto verdadeiramente internacional. O linguagem Java no consegue expressar,
O ejbdoclet ganhou fora e, com a idia XDoclet conta atualmente com desenvol- tais como as relaes entre as vrias partes
de levar a gerao automtica de cdigo vedores na Alemanha, Frana, Noruega, de um Enterprise JavaBean: as interfaces, a
a outras reas da programao, nasceu o Rssia, Brasil e Estados Unidos, entre classe de implementao e os deployment
XDoclet. vrios outros pases. descriptors. A principal vantagem de
um modelo como esse a centralizao
da informao. Tudo o que voc precisa
@tags: metadados saber sobre um componente fica em um
para o cdigo nico local: a classe de implementao do
Informaes componente.
so fornecidas ao Algumas das principais tags do XDoclet
XDoclet atravs usadas na programao de EJBs so:
da marcao do @ejb.bean fornece informaes gerais
cdigo fonte com sobre um componente EJB, como o tipo de
tags semelhantes componente, seu nome, localizao no
s usadas para JNDI, tipos de interface (local ou remota)
gerar documen- e chave primria;
tao usando a @ejb.finder define mtodos de pesqui-
ferramenta javadoc. sa (finders) para um entity bean;
As tags adicionam @ejb.persistence especifica parme-
metadados ao c- tros de persistncia para um entity bean,
digo existente so tais como o nome da tabela em que o bean
esses metadados a persistido, ou o nome da coluna em que
fonte de informa- persistida cada propriedade.
o para a gerao
de arquivos pelo Arquitetura
Figura 1. Arquitetura e fluxo do XDoclet XDoclet. No corao do XDoclet, est o template

46 Java Magazine Edio 6

jm6-book.indb 46 3/4/2003, 17:53:42


X Doclet Retirar do programador a tarefa de
criar cdigo repetitivo, adicionan-
do mais significado ao cdigo o
objetivo do XDoclet

MARCUS BRITO

Instalao e uso Voc precisar escrever um arquivo de


A URL para download do build (buildfile) do Ant que chama as fun-
XDoclet : cionalidades do XDoclet (conhea mais
sourceforge.net/project/ sobre o Ant no artigo Builds com Ant,
s h o w f i l e s.p h p ?g ro up_ na Edio 2).
id=31602. O diretrio onde foi feita a descompac-
Baixe a verso mais recen- tao ser usado para construir o classpath
te, com o nome xdoclet-bin- de execuo do XDoclet no buildfile. Para
<verso>.zip. O pacote con- o exemplo a seguir, vamos supor que
tm diversos arquivos .jar, voc descompactou o zip no diretrio
com as classes do XDoclet c:\xdoclet.
e todos os seus mdulos.
Basta ento descompactar EJB a partir de uma classe
o zip em um diretrio Vamos montar um exemplo simples:
sua escolha. escrever a classe de um EJB incluindo as
O XDoclet executado tags do XDoclet, executar a ferramenta e
Figura 3. Middlegen: gerao de cdigo integrada ao XDoclet como uma tarefa do Ant. compilar o projeto. Note que importante

engine (mecanismo de templates), respon-


Listagem 1. ProdutoEJB.java: EJB com tags do XDoclet
svel pela interpretao dos modelos de
cdigo usados como base para a gerao. package jm;
Os templates so escritos numa sintaxe /**
particular ao XDoclet e fazem uso de tag * Um EJB representando um produto num sistema comercial (PDV)
*
handlers (manipuladores de tags), classes * @ejb.bean
que fornecem os dados necessrios para * type=CMP
* name=Produto
os templates. Ligado aos tag handlers est * primkey-field=produtoId
o xjavadoc, um analisador de cdigo Java * @ejb.persistence
* table-name=produto
responsvel por fornecer aos handlers */
public abstract class ProdutoEJB implements javax.ejb.EntityBean {
informaes sobre as tags utilizadas na /**
marcao do cdigo fonte. * O cdigo do produto.
*
A execuo de um template do XDoclet * @ejb.interface-method view-type=local
segue este fluxo: o engine carrega um * @ejb.persistence column-name=prod_id
*/
template, identifica os tag handlers utiliza- public abstract Integer getProdutoId();
dos nele e executa os tag handlers medida
public abstract void setProdutoId(Integer id);
que prossegue analisando o template. Os
handlers fazem uso do xjavadoc para obter /**
* A descrio do produto.
as informaes necessrias (as @tags) e ge- *
ram o resultado final. Veja a Figura 1. * @ejb.interface-method view-type=local
* @ejb.persistence column-name=prod_descricao
A arquitetura do XDoclet torna-o bastan- */
public abstract String getDescricao();
te flexvel. Se for necessrio modificar a for-
ma como gerado algum elemento, basta /**
* @ejb.interface-method view-type=local
modificar o template usado para ger-lo; se */
voc quiser que o XDoclet gere novos ele- public abstract void setDescricao(String descricao);
}
mentos, basta escrever mais um template e
opcionalmente alguns tag handlers.

Edio 6 Java Magazine 47

jm6-book.indb 47 3/4/2003, 17:53:45


Automao com XDoclet

entender um pouco sobre EJB para acom-


Listagem 2. build.xml: exemplo de buildfile para execuo do XDoclet para um EJB
panhar esse exemplo. Um exemplo mais
<project name=javamagazine basedir=. default=jar> extenso, demonstrando recursos adicio-
<!-- Diretrio onde esto guardados os .java -->
<property name=fontes.dir value=src/> nais, est disponvel para download no
site da Revista.
<!-- Onde o xdoclet vai gerar .java -->
<property name=srcgen.dir value=target/src-gen/> A Listagem 1 mostra o cdigo fonte de
um EJB marcado com @tags. um entity
<!-- Onde as classes sero compiladas -->
<property name=classes.dir value=target/classes/> bean CMP chamado Produto, com ape-
<!-- Onde o xdoclet vai gerar .xml -->
nas duas propriedades. Crie um diretrio
<property name=metainf.dir value=target/meta-inf/> para o exemplo usaremos xd e den-
<!-- Diretrio de instalao do xdoclet --> tro dele um diretrio com nome src. Para
<property name=xdoclet.dir value=c:\xdoclet/> manter a estrutura de pacotes, crie tambm
<property name=xdoclet.lib.dir value=${xdoclet.dir}/lib/> um diretrio src/jm. Neste ltimo, salve
<property name=xdoclet.samples.lib.dir value=${xdoclet.dir}/samples/lib/> o arquivo ProdutoEJB.java, mostrado na
<path id=xdoclet.path> listagem.
<fileset dir=${xdoclet.lib.dir} includes=**/*.jar/>
<fileset dir=${xdoclet.samples.lib.dir} includes=**/*.jar/>
A Listagem 2 mostra o buildfile (build.xml)
</path> que cria os diretrios necessrios, executa
<target name=init> o XDoclet e compila todo o cdigo fonte
<mkdir dir=${classes.dir}/> resultante. Salve esse arquivo no diretrio
<mkdir dir=${metainf.dir}/>
<mkdir dir=${srcgen.dir}/> "xd. Voc j pode executar o XDoclet,
usando o comando ant (o processo fica
<taskdef
name=ejbdoclet mais simples se voc colocar o diretrio
classname=xdoclet.modules.ejb.EjbDocletTask
classpathref=xdoclet.path/>
bin do Ant no path do sistema).
</target> So gerados dois arquivos, um no
<target name=xdoclet depends=init> diretrio target/src-gen e outro no diretrio
<ejbdoclet destdir=${srcgen.dir} ejbspec=2.0> target/meta-inf (esses diretrios foram espe-
<fileset dir=${fontes.dir} includes=**/*.java/>
<localinterface/> cificados no buildfile). Dentro de src-gen,
<localhomeinterface/> so criadas as interfaces local e local home
<deploymentdescriptor destdir=${metainf.dir} xmlencoding=ISO-8859-1>
<configParam name=Description value=Exemplo para Java Magazine/> do EJB; em meta-inf criado o arquivo
</deploymentdescriptor>
</ejbdoclet> ejb-jar.xml. As Listagens 3 e 4 mostram o
</target> contedo das interfaces geradas (o arqui-
<target name=compile depends=xdoclet> vo XML foi omitido e est disponvel para
<javac download).
destdir=${classes.dir}
classpathref=xdoclet.path
srcdir=${fontes.dir}:${srcgen.dir}/>
</target> Integrao com ferramentas
difcil memorizar todas as tags que
</project>
podem ser usadas com o XDoclet. Para
auxiliar o programador, alguns projetos
Listagem 3. ProdutoLocalHome.java
esto surgindo para integrar o XDoclet
/*
* Generated by XDoclet - Do not edit!
com outras ferramentas e facilitar a inclu-
*/ so das tags. Atualmente o mais completo
package jm;
o JBossIDE (Figura 2), um plugin para
/** o IDE Eclipse que facilita o deployment
* Local home interface for Produto.
*/ de aplicaes no JBoss e auxilia o progra-
mador, mostrando as tags disponveis e
public interface ProdutoLocalHome
extends javax.ejb.EJBLocalHome completando-as automaticamente. Mais
{
plugins esto sendo desenvolvidos para
outras ferramentas de desenvolvimento,
public static final String COMP_NAME=java:comp/env/ejb/ProdutoLocal;
public static final String JNDI_NAME=ProdutoLocal; como o IntelliJ IDEA e o Borland JBuilder.
O XDoclet tambm excelente para a au-
public jm.ProdutoLocal findByPrimaryKey(java.lang.Integer pk)
throws javax.ejb.FinderException; tomao de projetos que seguem a idia de
integrao contnua veja o quadro ciclo
}
de desenvolvimento com XDoclet.

48 Java Magazine Edio 6

jm6-book.indb 48 3/4/2003, 17:53:47


um dos desenvolvedores do XDoclet, o
Listagem 4. ProdutoLocal.java que explica a integrao prxima entre as
/* ferramentas.
* Generated by XDoclet - Do not edit!
*/
package jm; Concluses
O uso do XDoclet pode trazer um grande
/**
* Local interface for Produto. ganho de produtividade, especialmente
*/ se j for utilizado o Ant em seus projetos.
public interface ProdutoLocal
extends javax.ejb.EJBLocalObject A ferramenta ajuda no s na gerao de
{ cdigo, mas tambm na padronizao e na
/**
* A descrio do produto. documentao, auxiliando na implemen-
*/
public java.lang.String getDescricao( ) ;
tao de padres de projeto estabelecidos
e concentrando, num s lugar, todas as
/**
* O cdigo do produto.
informaes a respeito de um componente
*/ do sistema.
public java.lang.Integer getProdutoId( ) ;

public void setDescricao(java.lang.String descricao) ;


Core J2EE Patterns, Deepak Alur et al,
} Editora Campus, 2002

Abrangncia JBoss e boa parte do cdigo do servidor www.xdoclet.org


Um dos projetos mais interessantes para hoje gerado com auxlio do XDoclet. Pagina principal do XDoclet.
aqueles que esto explorando o XDoclet Existem tambm ferramentas comple-
www.martinfowler.com/articles/
o xPetstore, uma verso do famoso ex- mentares, como o Middlegen (veja a Figura
continuousIntegration.html
emplo Java Petstore da Sun, mas usando 3), uma ferramenta de gerao de cdigo
Integrao contnua
uma arquitetura diferente. um projeto a partir de bancos de dados. O cdigo ge-
J2EE completo, criado usando projetos de rado pelo Middlegen marcado com tags ant.apache.org
software livre, como o Struts e o Sitemesh XDoclet para processamento posterior. Apache Ant
(veja links). Por exemplo, voc pode usar o Middlegen www.jboss.org
Outro projeto importante em que o XDo- para gerar entity beans a partir do banco JBoss, servidor J2EE livre e integrado com o
clet vem ganhando terreno no servidor de dados e usar o XDoclet para gerar ou- XDoclet
de aplicaes JBoss. Ele desempenha um tros arquivos. Vale lembrar que o criador
papel importante no desenvolvimento do do Middlegen (Aslak Hellesy) tambm sourceforge.net/projects/jboss
Downloads do JBoss, incluindo o plugin JBossIDE
xpetstore.sourceforge.net
Ciclo de desenvolvimento com XDoclet Exemplo de uso do XDoclet em um projeto J2EE
jakarta.apache.org/struts
N o desenvolvimento de um grande
projeto, importante no quebrar o
que j est funcionando, ou seja, preciso
sempre orientada por uma tarefa do Ant.
Assim, um buildfile do Ant bem construdo
torna a gerao de cdigo com o XDoclet
Struts, framework para aplicaes web
www.opensymphony.com/sitemesh
testar continuamente o sistema, garantin- em apenas mais uma etapa automatizada Sistema de layout para web
do que modificaes no afetem partes em no processo de integrao contnua do
funcionamento. projeto.
boss.bekk.no/boss/middlegen
Middlegen: gerao de cdigo a partir de um
A integrao contnua, defendida pelo A gerao de cdigo traz mais um benef-
banco de dados
guru de orientao a objetos Martin Fow- cio importante alm de poupar o tempo
ler, leva essa idia ao mximo, rezando que dos programadores, fica mais fcil reforar
www.javamagazine.com.br/downloads
deve ser possvel, a qualquer momento, re- o uso de padres de projeto se o cdigo
/jm6/jm6-mbrito-xdoclet.zip
alizar todas as etapas do ciclo de implemen- gerado j utilizar esses padres.
tao de um projeto (compilao, execuo, O XDoclet utiliza alguns padres e Marcus Brito (pazu@animegaiden.com.br) mem-
testes etc.), de forma automatizada. boas prticas nas suas tarefas. As tarefas bro ativo da equipe de desenvolvedores do XDoclet
O Ant uma excelente ferramenta para a <utilobject> e <valueobject>, por exemplo, e programador Java, atualmente trabalhando na
prtica da integrao contnua. E o XDoclet so implementaes dos padres Service Unitech (www.unitech.com.br), onde presta servios
se encaixa bem neste cenrio, pois, como Locator e Value Object, como apresentados Telebahia Celular em anlise e desenvolvimento de
mostrado neste artigo, a sua execuo no livro Core J2EE Patterns (veja livros). projetos J2EE.

Edio 6 Java Magazine 49

jm6-book.indb 49 3/4/2003, 17:53:48


Jakarta Velocity
Acabe com a briga com os designers

U
ma das reas em que o desenvol-
vimento de aplicaes web com
Java mais encontra problemas
na separao entre a camada de controle,
que faz as chamadas lgica de negcio, e
a camada de apresentao, onde realizada
a montagem da interface web.
Uma forma eficaz de fazer essa separao
usando sistemas de templates (template
engines). O framework Jakarta Velocity do
Grupo Apache um dos mais populares
desses sistemas, e pode ser usado tanto em
aplicaes web quanto locais.

Sistemas de templates
Pode-se fazer muito com um sistema de
templates desde a gerao de simples ar-
quivos-texto criao de arquivos binrios,
tudo o que siga um determinado padro
de formatao. Pode-se gerar cdigo-fonte
de alguma linguagem, XML, HTML, docu-
mentos RTF e muitos outros. Por exemplo, Figura 1. O processo de merge
o Poseidon for UML, ferramenta CASE concentrados na lgica do sistema e os ou reiniciar o sistema.
desenvolvida em Java, usa o Velocity para designers se preocupam apenas com o Mas o que exatamente so templates? So
a gerao de cdigo a partir de diagramas layout, o que reduz o risco de alterarem arquivos com grande parte de sua estru-
UML. indevidamente o cdigo da aplicao. Alm tura e formatao pronta, contendo dire-
Usar templates tem uma srie de van- disso, os templates ficam em arquivos se- tivas indicando valores a serem inseridos
tagens: existe uma melhor designao parados, possibilitando mudar o visual da e aes a serem realizadas pelo sistema
de tarefas, pois os programadores ficam aplicao sem a necessidade de recompilar de templates. Com diretivas, possvel,
por exemplo, mostrar o contedo de uma
Diretivas da VTL varivel, navegar em listas e arrays, ou at
mesmo invocar mtodos de objetos.
#set($varivel = valor) do template, sem fazer o parse. Usada
Diretivas so a parte principal da Velocity
Atribui um valor a uma varivel. para incluir cdigo esttico.
Template Language (VTL) veja mais so-
#foreach ($varivel in $ itens) ... #end #parse(arquivo) bre essa linguagem no quadro Diretivas
Percorre uma coleo, iterator ou array, Inclui o contedo de um arquivo no corpo da VTL.
atribuindo o elemento atual a $varivel. do template e faz o parse do cdigo VTL
#if(condio) ... #else ... #end existente no arquivo. Funcionamento bsico
Condicional padro da VTL. Diferente- Nota: existe ainda a diretiva #stop, mas seu Uma aplicao que usa o Velocity executa,
mente de Java, a condio no precisa uso no mais recomendado. basicamente, os seguintes passos: inicializa
retornar um valor booleano (para objetos, o sistema de templates, cria um contexto,
null considerado como false). O uso do Voc pode ver mais detalhes sobre todas adiciona a ele objetos, carrega um template
#else opcional. as diretivas da VTL no VTL Reference e realiza o merge (veja a Figura 1).
#include(arquivo) Guide em jakarta.apache.org/velocity/vtl- Os contextos so a forma usada no
Inclui o contedo de um arquivo no corpo reference-guide.html. Velocity para fornecer dados para o
mecanismo de templates. Um contexto

50 Java Magazine Edio 6

jm6-book.indb 50 3/4/2003, 17:53:50


O uso de templates na camada de
apresentao de aplicaes web
simplifica a manuteno e a sepa-
rao de responsabilidades

PAULO SILVEIRA E RAFAEL STEIL

merge (mistura ou intercalao), o


Listagem 1. ProcesaEmpregados.java Velocity interpreta as diretivas e extrai os
import org.apache.velocity.app.VelocityEngine; dados necessrios do contexto, gerando a
import org.apache.velocity.VelocityContext; sada desejada.
import org.apache.velocity.Template;

import java.io.*;
import java.util.ArrayList;;
Obteno e instalao
O download da ltima verso estvel do
public class ProcessaEmpregados { Velocity pode ser feito em jakarta.apache.org/
public static void main(String args[]) {
BufferedReader reader = null; builds/jakarta-velocity/release. Para us-lo em
suas aplicaes, voc deve incluir a biblio-
try {
// Inicia o Velocity teca velocity-dep-<versao>.jar (que vem no
VelocityEngine ve = new VelocityEngine(); pacote) no classpath do sistema operacional
ve.init();
ou de seu container web.
// Abre o template
Template tmplt = ve.getTemplate(relacao_empregados.vm);
Al Velocity
// Cria um contexto para colocar os dados Nosso primeiro exemplo gera um do-
VelocityContext context = new VelocityContext();
cumento XML a partir de dados contidos
reader = new BufferedReader(new FileReader(empregados.txt)); em um arquivo-texto, e apresenta alguns
ArrayList empregados = new ArrayList();
String campos[] = new String[3]; elementos importantes do Velocity.
String linha; O arquivo-texto utilizado (empregados.txt)
// L arquivo separando as informaes e montando uma coleo bastante simples, contendo nomes, e-
while ((linha = reader.readLine())!= null) { mails e salrios:
campos = linha.split(,, 3);
empregados.add(new Empregado(campos[0], campos[1],
Double.parseDouble(campos[2]))); George Harrison,george@beatles.com,80000.00
}
Ringo Starr,ringo@beatles.com,40000.00
// Adiciona a coleo montada ao contexto Jim Morrison,jimmy@doors.com,100000.00
context.put(empregados, empregados); Manoel da Silva,mano@provedor.com.br,220.00
BufferedWriter writer = new BufferedWriter(
new FileWriter(new File(empregados.xml))); O template (RelacaoEmpregados.vm)
// Faz o merge mostrado a seguir (com o cdigo da VTL
tmplt.merge(context, writer); destacado):
writer.flush();
writer.close(); ## Macro para gerar uma entrada XML
} #macro(adicionaEmpregado
catch (Exception e) { $nome $email $salario)
e.printStackTrace(); <empregado>
} <nome>$nome</nome>
finally { <email>$email</email>
if (reader!= null) { <salario>$salario</salario>
try { </empregado>
reader.close(); #end
}
catch (Exception e) {} <?xml version =1.0 encoding=ISO-8859-
} 1?>
} <relacao-empregados>
}
} ## Cria uma entrada para
## cada item da coleo
#foreach ($e in $empregados)
uma instncia da classe org.apache.velocit importantes: put(String chave, Object valor) e #adicionaEmpregado(
y.VelocityContext, que utiliza internamente get(String chave). $e.Nome $e.Email $e.Salario)
#end
um HashMap para manter um conjunto de Uma vez criado e preenchido o contexto,
pares String-objeto. Possui dois mtodos prossegue-se para o merge. Durante o </relacao-empregados>

Edio 6 Java Magazine 51

jm6-book.indb 51 3/4/2003, 17:53:55


Jakarta Velocity

A classe ProcessaEmpregados, mostrada na


Listagem 2. Empregado.java Listagem 1, faz a gerao do XML base-
public class Empregado { ando-se no template e nos dados lidos do
private String email; arquivo. A classe Empregado, utilizada na
private String nome;
double salario; gerao, apresentada na Listagem 2.
Para testar o exemplo, crie os quatro ar-
public Empregado(String nome, String email, double salario) {
this.nome = nome; this.email = email; this.salario = salario; quivos apresentados anteriormente em um
} novo diretrio, compile os .java e execute
public String getNome() {
return nome; } a classe ProcessaEmpregados. Ser criado um
public String getEmail(){ arquivo chamado empregados.xml contendo
return email;
} os dados estruturados em XML.
public double getSalario() { O que acontece no exemplo? De forma
return salario;
} simples, a aplicao inicializa o Velocity,
} l o arquivo-texto, monta uma coleo con-
Listagem 3. CadastroVelocityServlet.java tendo os dados dos empregados, adiciona a
coleo ao contexto e inicia o merge. Duran-
import org.apache.velocity.servlet.VelocityServlet;
import org.apache.velocity.context.Context;
te o merge, o Velocity processa o template e,
import org.apache.velocity.Template; ao encontrar uma diretiva, l do contexto
import javax.servlet.http.*;
os objetos necessrios.
import java.io.IOException; No template, a diretiva foreach usada
public class CadastroVelocityServlet extends VelocityServlet {
para percorrer a coleo $empregados:
public Template handleRequest(HttpServletRequest request,
HttpServletResponse response, Context context) throws IOException { #foreach ($e in $empregados)
Template tmplt = null; #adicionaEmpregado(
$e.Nome $e.Email $e.Salario)
// Verifica se o usurio enviou o formulrio #end
if (request.getParameter(acao)!= null) {
String nome = request.getParameter(nome); Dentro do foreach, chamada a macro
String email = request.getParameter(email);
adicionaEmpregado (defi nida no incio do
// Adiciona os dados em um contexto visvel ao Velocity template), que gera um pequeno trecho
if (!nome.equals()) context.put(nome, nome);
if (!email.equals()) context.put(email, email); de XML. Note como as variveis so pas-
} sadas para a macro voc no precisa usar
// Carrega e faz um parsing inicial do template $e.getNome(), por exemplo, pois o Velocity
// usando mtodo herdado de VelocityServlet realiza uma introspeco nos objetos e
try {
tmplt = this.getTemplate(FormCadastro.vm); identifica (e chama) seus mtodos get.
}
catch (Exception e) {
// template nao existe ou houve erros durante a sua validao Velocity na web
e.printStackTrace(); Para facilitar o uso em aplicaes web,
}
return tmplt; a distribuio do Velocity inclui o servlet
} org.apache.velocity.servlet.VelocityServlet, que
}
realiza a maior parte da configurao do
Listagem 4. FormCadastro.vm ambiente automaticamente.
<html><body>
Como exemplo, vamos criar um servlet
<center> simples (Listagem 3) que usa o Velocity
<h3>Ol <b>
#if ($nome!= ) $nome
para gerar uma pgina com dados obtidos
#else Visitante de um formulrio HTML. O template usa-
#end</b>, seja bem-vindo(a)</h3>
</center>
do mostrado na Listagem 4.
<br> O ponto de entrada de um VelocityServlet
#if ($nome!= )
o mtodo handleRequest, que deve ser
0 E-mail informado foi: <b>$email</b><br> redefi nido no seu servlet. Analisando o
#end
cdigo, voc notar que no houve neces-
<br><br> sidade de criar um contexto o servlet j
<h3> Cadastro: </h3>
<form action=/ExemploVelocity method=post>
cria um contexto, passando-o para o m-
Nome: <input type=text name=nome value=$!nome><br> todo handleRequest. Tambm no existe a
E-mail: <input type=text name=email value=$!email><br>
<input type=submit name=acao value=Enviar>
necessidade de chamar o mtodo merge ou
</form> abrir a sada do HttpServletResponse, pois o
</body></html>
VelocityServlet realiza essas duas operaes
quando handleRequest retorna.

52 Java Magazine Edio 6

jm6-book.indb 52 3/4/2003, 17:53:56


dos templates que j foram parsed; o valor
Listagem 5. Configurao do servlet no web.xml padro false.
...
<web-app>
...
Concluses
<servlet> Sistemas de templates so uma alternati-
<servlet-name>ExemploVelocity</servlet-name> va eficaz ao JSP e podem simplificar muito a
<servlet-class>CadastroVelocityServlet</servlet-class>
manuteno de aplicaes web. O Velocity
<init-param> vem sendo cada vez mais usado, especial-
<param-name>properties</param-name>
<param-value>/WEB-INF/velocity.properties</param-value> mente de forma integrada a frameworks
</init-param> web MVC como o Struts (veja o quadro
</servlet>
</web-app> Velocity e Struts). Vale a pena conferir
a documentao bastante completa e h
Para testar o segundo exemplo rapi- quivo velocity.properties. As configuraes vrios exemplos prontos.
damente, crie uma nova aplicao web disponveis vo de opes de logging at
incluindo o servlet compilado, copie a a configurao de cache, macros e ajustes jakarta.apache.org/velocity
biblioteca velocity-dep-<versao>.jar para finos para as diretivas de templates. Veja Downloads, documentao e subprojetos
WEB-INF/lib e configure o servlet no algumas das opes mais importantes: do Velocity
web.xml como mostrado na Listagem 5 file.resource.loader.path define o www.teamup.com/jakarta-velocity-tools/
(isso garante que o arquivo de proprieda- diretrio para os templates; por padro, struts/docs
des do Velocity seja utilizado pelo servlet). utilizado o da aplicao mas comum, em Ferramentas para integrar o Velocity ao Struts
Copie, tambm, o template e o arquivo aplicaes web, alterar esse diretrio para
velocity.properties (veja adiante) para o WEB-INF/templates; veloedit.sourceforge.net
diretrio raiz da aplicao web. runtime.log determina onde so gra- Plugin para o Eclipse que simplifica a edio de
vados erros e outras mensagens geradas arquivos do Velocity
Configurao (o padro o arquivo velocity.log);
www.javamagazine.com.br/downloads
O Velocity configurado atravs do ar- file.resource.loader.cache ativa o cache
/jm6/jm6-silveira-steil-velocity.zip

Velocity e Struts Paulo Eduardo Azevedo Silveira


(paulo@paulo.com.br) Bacharel em Cincia da
Q uando o framework Struts foi conce-
bido, a idia era trabalhar com JSP na
camada de apresentao. Com a populari-
velocity-struts (ainda em pr-release e
acessvel apenas pelo CVS) inclui classes adi-
cionais e tarefas do Ant que automatizam
Computao pela USP e programador certificado
Java. um dos fundadores do GUJ (www.guj.com.br),
instrutor da Sun Education e desenvolvedor autnomo.
zao do Velocity, sentiu-se a necessidade parte da integrao. Mais informaes em
de criar ferramentas que facilitassem a www.teamup.com/jakarta-velocity-tools/ Rafael Steil (rafael@insanecorp.com) co-fundador
integrao entre os dois. O subprojeto struts/docs. do GUJ e desenvolvedor web com experincia de vrios
anos em PHP e Java.

Edio 6 Java Magazine 53

jm6-book.indb 53 3/4/2003, 17:53:57


Livros

Um autor tupiniquim?
Existem bons escritores brasileiros sobre Java
DANIEL DEOLIVEIRA

I
maginem a cena: noite quente de de cdigo Java em pura gozao, que o mado no livro sobre JSP (com 190 pginas,
domingo em Braslia, debaixo de um digam seus alunos do curso corujo tambm com CD-ROM). Inicialmente
coqueiro, ao lado de uma piscina... (que acontece durante a madrugada) e os ele ensina como baixar e instalar cada
enquanto nossas famlias se divertiam, eu que o assistem s suas muitas palestras. uma das ferramentas necessrias ao
estava jogando conversa fora com o meu Sobre seu principal fator de motivao projeto: o MySQL, o Forte e o Tomcat.
amigo Fernando Anselmo. Estvamos para escrever, me disse Um aspecto interessante
buscando inspirao para os prximos que era por no encontrar que esse livro no ensina
textos que amos escrever aqui para a respostas objetivas para as servlets, pois como afirma
Java Magazine, quando observei que nos dificuldades que teve ao o autor, isso s serve para
ltimos meses, nesta coluna, tenho sem- estudar as tecnologias. Sua complicar a cabea dos no-
pre discutido livros de autores gringos, crtica que a maioria dos vatos em JSP. Em seguida,
mas nunca os de escritores brasileiros. E livros que consultou apre- o livro apresenta o desen-
um dos maiores estava sentado ao meu senta apenas trechos de volvimento de um sistema
lado, e eu ouvindo as bobagens que dizia cdigos, mas nunca uma para intranet com dois
(e olha que ele s tomou refrigerante!). soluo completa, ou seja, subsistemas distintos: um
Fernando Anselmo autor de sete livros um projeto com principio, destinado ao pblico geral,
tcnicos, incluindo dois sobre Java: Tudo meio e fim. Por isso, nos dois onde os clientes podem se
o que voc queria saber sobre a JDBC e livros, voc encontrar um cadastrar, consultar os
Os dois livros incluem
Tudo o que voc queria saber sobre o JSP, projeto completo incluin- filmes disponveis e fazer
quando utiliza o servidor Tomcat com o do o cdigo fonte, pois o
o cdigo de um projeto reservas; o outro destinado
banco MySQL, ambos da Editora Visual autor no acredita que se completo: o autor acredita aos administradores do sis-
Books, de Florianpolis. um cmico deva comear a codificar que o programador deve tema, que podem realizar
nato ningum consegue ficar srio ao partindo de uma tela vazia, comear modificando algo operaes como registrar
lado dele, pois transforma at anlise mas sim modificando algo j em funcionamento devolues e cadastrar fil-
que j esteja funcionando. mes. Um ponto alto deste li-
Ficha tcnica O livro sobre JDBC tem 200 pginas e vem vro a parte relativa aos relatrios, assunto
com um CD-ROM com aquelas quinqui- quase nunca abordado em livros de Java.
Tudo o que voc
lharias que todo desenvolvedor Java Para concluir, o autor afirma que no tem
queria saber sobre
a JDBC... adora. Comeou a ser escrito a partir das a menor pretenso de substituir os gran-
notas dos cursos ministrados pelo autor e des livros de treinamento Java no mercado,
Fernando Anselmo
das perguntas que os alunos lhe faziam. como por exemplo, o seu fervorosamente
Editora Visual Books Ao procurar respostas, Fernando cons- amado formiguinhas, dos irmos Deitel
200 pginas tatou a brutal falta de documentao em (Java Como Programar, Editora Bookman).
R$ 37,00 portugus sobre JDBC. Foi esse o ponto Seu objetivo facilitar a vida do desenvolve-
ISBN 8575020560 de partida: responder cada uma das dor quem quer dar os primeiros passos em
perguntas; e ao melhor detalh-las, cada uma dessas tecnologias, sem traumas. Com
Tudo que Voc Queria resposta foi se transformando em um ca- uma vantagem para ns: por ser um escri-
Saber Sobre o JSP... ptulo completo. Em seguida, foi criado um tor brasileiro, a editora no precisa pagar
Fernando Anselmo projeto completo de locadora de DVDs, ini- royalties ao exterior. Portanto, prestigiem
cialmente conectando com o Access (como os autores tupiniquins e bons cdigos!
Editora Visual Books
de costume em livros semelhantes) e pos-
192 pginas
teriormente com o banco de dados MySQL.
R$ 39,00 Daniel deOliveira (daniel@dfjug.org) o
Em resposta aos leitores do primeiro
ISBN 8575020943 coordenador do DFJUG (Braslia Java Users Group),
livro, que solicitaram o desdobramento
www.dfjug.org.
do projeto, o sistema de locadora reto-

54 Java Magazine Edio 6

jm6-book.indb 54 3/4/2003, 17:54:02


Edio 5 Java Magazine 55

jm6-book.indb 55 3/4/2003, 17:54:28


jm6-book.indb 56 3/4/2003, 17:54:40

Potrebbero piacerti anche