You are on page 1of 56

jm6-book.

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

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

Conteúdo
06
Java News Dicas e Soluções
Lançamentos de produtos, novas MICHAEL NASCIMENTO SANTOS
tecnologias e especificações Java Problemas e soluções práticas: recuperação 32
de sessões, transações em EJBs e usos
de final

08
Comunidade
LEONARDO GALVÃO
JustJava 2003, a participação brasileira no Automação com XDoclet
JavaOne, listas de discussão e PBJUG MARCUS BRITO
Retirar do programador a tarefa entediante 46
de criar código repetitivo, adicionando mais
significado e poder ao código é o objetivo
do XDoclet
10
A Vida, o Universo e Tudo Mais
BRUNO SOUZA
Java no desktop, parte 2:
toolkits web, distribuição e instaladores Jakarta Velocity
PAULO SILVEIRA E RAFAEL STEIL
O uso de templates na camada de apresen- 50
tação de aplicações web simplifica a manu-
tenção e a separação de responsabilidades
16
Java Livre
FERNANDO LOZANO
Aprenda o essencial sobre o container web mais
usado no mercado

Asserções no J2SE 1.4
22 FELIPE LEME
Java de Bolso Sintaxe e melhores práticas para o uso
CLÁUDIO MIRANDA de comandos assert para a detecção
Integração de aplicações J2ME e serviços de rede antecipada de erros
através do Generic Connection Framework
36

28
Além das Fronteiras
JÚLIO CÉSAR LINS
JSP 2.0: linguagem de expressões, JSTL padrão,
fragmentos e tag files são algumas extensões Struts: primeiros passos
MIGUEL ÂNGELO GALLINDO,
RICHARDSON OLIVEIRA E DANIEL FREITAS
Conheça a arquitetura e o funcionamento
54 básico do framework líder para o
Livros desenvolvimento web
DANIEL DEOLIVEIRA
Existem bons escritores brasileiros sobre Java 40

Edição 6 • Java Magazine 3

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

Direção
Diretor Editorial
Leonardo Galvão
Diretor Comercial
Espaço do L
Casseano Filho
Diretor de Marketing
Gladstone Matos

Edição
Publisher e Editor
Leonardo Galvão
Editor Adjunto
Fernando Lozano
Q uando, em 2001, a Sun decidiu oficializar a separação de Java em três platafor-
mas – as hoje tão conhecidas J2EE, J2SE e J2ME – parecia ser uma delimitação
adequada e suficiente por muitos anos. Mas uma tecnologia rica e dinâmica
como Java parece desafiar qualquer categorização.
Jornalista Responsável Em que plataforma entraria, por exemplo, o novo J2EE Client Provisioning, para a
Sérgio Moraes C. Brandão (MTb: 15183-68-148) integração entre aplicações servidoras e clientes conectados, tanto os sem-fio quanto os
Corpo Editorial desktop? Micro, Enterprise ou Standard Edition? Um pouco dos três... E o que dizer de
Alexandre Denes dos Santos, Bruno Souza, Edgar Silva, ferramentas como o XDoclet, para geração de código, baseada no Javadoc (J2SE, claro...),
Hyalen Caldeira, Júlio César Lins, Osvaldo Doederlein mas que se supera na geração de EJBs (então não seria J2EE?). E o Jakarta Velocity?
Colaboraram nesta edição Este deixa para trás qualquer delimitação – afinal, templates (o coração do Velocity)
Bruno Souza, Cláudio Miranda, Daniel deOliveira, Daniel Freitas,
podem ser usados em aplicações que precisam gerar páginas HTML, documentos XML,
Felipe Leme, Fernando Lozano, Gustavo Nalle Fernandes,
Júlio César Lins, Leonardo Galvão, Marcus Brito, componentes EJB, telas MIDP... As linhas que dividem as plataformas realmente estão
Michael Nascimento Santos, Miguel Ângelo Gallindo, cada vez menos claras, principalmente devido à evolução e à integração das APIs.
Paulo Silveira, Rafael Steil, Richardson Oliveira A inte(g)ração entre plataformas é um tema recorrente nos artigos, colunas e seções
desta edição. Na coluna “Java de Bolso” é demonstrado o framework de conectivida-
Arte de oficial do J2ME/MIDP, para a comunicação de celulares com serviços no back-end
Editor de Arte através de protocolos wireless e internet – é o end-to-end chegando à maturidade.
Tarcísio Bannwart (tarcisio@javamagazine.com.br)
Ainda dentro do assunto de capa, temos três textos sobre temas “queridos” pelos de-
Capa
senvolvedores: o JSP, que na versão 2.0 vem com extensões que prometem aumentar
Ivan Sória Fernandez (ivansf@brturbo.com)
muito a produtividade; o Struts, framework web que faz boa parte do trabalho “braçal”
Ilustrações internas
Felipe Machado (felipe_m@ibest.com.br) e facilita a programação em equipe; e o Tomcat, o container e servidor web que, você
sabe, é referência para a execução de servlets e JSPs.
Produção A rede das redes também ocupa espaço privilegiado na segunda parte do artigo so-
Gerente de produção bre Java no Desktop (coluna “A Vida o Universo e Tudo Mais”), que mostra técnicas e
Rosângela Mattos ferramentas para trazer os benefícios da web para o desktop – e apresenta idéias para
Assessoria de Imprensa
levar algumas vantagens do ambiente local para aplicações web.
Kaline Dollabella (kalined@hotmail.com)
Focando na linguagem, o artigo sobre asserções explora o uso da palavra-chave
Impressão
Gráfica Bandeirantes assert, que simplifica o chamado design-by-contract, criado pelo guru da orientação a
Distribuição objetos Bertrand Meyer. Finalizando, temos uma novidade que deve agradar a muitos:
Fernando Chinaglia Distribuidora S.A. a coluna Dicas e Soluções, que soluciona problemas encontrados freqüentemente pelos
Rua Teodoro da Silva, 907, Grajaú - RJ desenvolvedores.
CEP 20563-900, (21) 3879-7766 - (21) 2577-6362 É isso. Boa Páscoa e muita paz para todos.
Leonardo Galvão
Publicidade Publisher e Editor
publicidade@javamagazine.com.br

Contato
Assinaturas
assinaturas@javamagazine.com.br , (021) 2213-0941 ou no site
Cartas e informações 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 não existisse no meu SDK. O
lado. Uso o 1stPage para a edição de JSP e HTML, que preciso fazer?
e o Eclipse para a geração de arquivos .class e .jar. Márcio Alex

Neofício Editora

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

eitor
Edição 5
Desktop Esse erro indica que, ou não foi possível localizar as no lugar de ponto-e-vírgula (separação 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 é padrão no J2EE mas caminho com a letra de drive no
Bruno Souza pelo artigo “Java no Desktop” (Edi-
não é fornecida com o J2SE), ou que Windows, ou de outro modo gerar
ção 5). Trabalho com aplicações comerciais em
não foi possível localizar uma confi- um classpath que contém apenas
outra linguagem e pretendo convertê-las para
guração para acesso ao servidor de parte dos pacotes.
Java. Lendo o artigo, pude perceber que não se
nomes JNDI. Supondo que o cliente Além 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 espaço 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 edições dessa revista e, computador:
sole), sua instalação está correta; fal-
a cada edição, percebo que cresce mais e mais. shell=\windows\command.com
ta apenas incluir no classpath todos
Meus parabéns pelo produto. A matéria que /e:4096 /p
os pacotes JAR presentes no diretório
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 código no artigo. que os pacotes no diretório client do JBoss são
incluídos um-a-um, com o caminho completo.
Contudo, encontrei um erro ao conectar ao necessários apenas para executar um cliente da
Como isso irá gerar um classpath bem grande (são
JBoss: “NoInitialContext...”. aplicação, mas não para compilar esse cliente ou
24 pacotes a serem adicionados), tenha cuidado: é fácil
Udo (m_udo@uol.com.br) para executar ou compilar um cliente web.
errar na digitação de um caminho, usar dois pontos

Basicamente, todas as APIs que dependem de ser- projeto no Eclipse para que seja possível compilar de modo que você deve copiar todos os pacotes JAR
vidores especializados (servidores de nomes, web, e servlets. no diretório lib da distribuição (jakarta-taglibs/
de aplicação, monitores de transação, servidores de As edições 4 e 5 fornecem instruções detalhadas standard-1.0.3/lib) para o diretório WEB-INF/lib de
e-mail etc.) estão incluídas apenas no J2EE. Servi- sobre a localização dos pacotes contendo as APIs no sua aplicação web, ou então para o diretório 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 ficarão visíveis para todas
Tomcat) fornecem as APIs necessárias em pacotes JAR definidas em pacotes externos. as aplicações hospedadas pelo servidor.
que devem ser adicionados ao seu classpath para a Importante: não é mais necessário copiar os arquivos
compilação dos programas. Mudanças em Taglibs .tld. Eles estão incluídos nos pacotes JAR e serão local-
Entretanto, a maioria dos IDEs ignora o classpath Estou com problemas para montar o exemplo izados sem problemas pelas páginas JSP.
do sistema operacional, de modo que você deve con- “Fórum de Debates” da Edição 5. O arquivo citado
figurar sua ferramenta para incluir as APIs adicionais. jakarta-taglibs-20021014.zip não está mais disponív- 100 vezes Java
No Eclipse, você deve selecionar o ícone do seu projeto, el e os novos não incluem os arquivos utility.tld ou Acho a revista demais – as primeiras edições são
clicar com o botão direito e mostrar a janela de pro- utility.jar. imperdíveis. Torço para que a Java Magazine tenha
priedades; depois selecionar a opção “Java Build Path” Ronaldo Júnior (link_rjr@terra.com.br) sucesso, pois faltava um veículo específico para pro-
e clicar no botão “Add External JAR” para adicionar os gramadores e especialistas na linguagem Java. Meus
pacotes contendo as APIs necessárias. A versão citada no artigo para a biblioteca de parabéns. Espero me manter assinante da Revista
A API de servlets é fornecida pelo JBoss no arquivo tags JSTL fornecida pelo projeto Jakarta Taglibs até a Edição 100 e o que vier além!
(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 versão de desenvolvimento. Já estão disponíveis
versões de produção – no momento de fechamento
Erramos desta edição, a mais recente é 1.0.3. Você pode
Na coluna “Livros” da Edição 5, foram pub- baixar qualquer versão de produção (“release”) em Participe!
licadas informações incorretas sobre o livro www.apache.org/dist/jakarta/taglibs/standard/ Envie sua dúvida, pedido, sugestão ou crítica
“Aprenda Java em 21 Dias”, da Editora Campus. binaries, por exemplo jakarta-taglibs-standard- para info@javamagazine.com.br, ou para:
Correção:
1.0.3.zip, pois todas funcionarão sem problemas com o
Editor - Java Magazine
código nos artigos do fórum (e do mural, na Edição 4),
Aprenda Java em 21 Dias, Av. 7 de Setembro, 4698, Conj.1501-1503
com qualquer versão do Tomcat de 4.0.3 em diante.
Professional Reference Curitiba-PR, CEP 80240-000
Laura Lemay e Rogers Cadenhead As novas versões da JSTL modificaram a distribuição Fax: (041) 242-4580.
531 páginas, R$ 109,00 dos tags em pacotes JAR e passaram a incluir pacotes
Cartas publicadas podem ser editadas por
ISBN 8535208658 externos necessários para o suporte a algumas tags
motivos de clareza ou extensão.
(como o Xerces para as tags relacionadas com XML),

Edição 6 • Java Magazine 5

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

Craig Russell) trata da tecnologia para persistência de ob- Gerenciamento livre com Maven* dessa editora norte-americana. jetos JDO. pecialmente adequado para projetos com www. Google Hacks e arquivos (que nem sempre é intuitiva mas os princípios do XP. beram que poderia ir muito mais longe. não é é bem documentada).indb 6 3/4/2003.oreilly. mas igualmente importan- pode ser gerada e gerenciada pelo Ma. que vem causando frisson entre O Maven nasceu para facilitar o geren- ciamento dos subprojetos do Jakarta Turbine.oreilly.com/pub/ht/2 contém um Jakarta. Para auxiliar em projetos "Google Hacks" inclui 100 dicas sobre o grandes. O capítulo sobre JUnit te. demonstra a popularidade da combinação passando pela documentação e download de Java com o Extreme Programming (XP). tware de qualidade. que já passam de 30. Tomcat e XDoclet – num atestado “animal” nem tampouco se concentra na A documentação do projeto também da força da tecnologia na criação de sof.org. tais como Ant.oreilly. no qual serão eliminados bugs catalog/jvadtaobj. O Maven ainda está em leitor estará em boas mãos.xml. líder da Grupo Apache.oreilly. navigation. Configurando um arquivo chamado pode ser baixado gratuitamente do site precisa se encontrar na abundância de APIs.oreilly.com sim com Jelly. desde a O livro Java Extreme Programming compilação. resumo das cem dicas e libera oito para Veja mais em maven. especificações e notícias tecnológicas. tecnologia Java.com/ release final. muitos plugins. gerado o site do projeto e como associá- lo aos javadocs. funcionalidades do Maven. O livro explora as principais ferramentas rão seguir uma certa estrutura de diretórios usadas no desenvolvimento Java seguindo O terceiro lançamento. *por Paulo Silveira 6 Java Magazine • Edição 6 jm6-book. Para usar completamente as com processos burocráticos.com/catalog/jextprockbk.com e instabilidades em alguns plugins impor- tantes. testes a serem feitos e dependências. 17:49:27 . são identificadas dependências. São desde dicas A flexibilidade do Maven se deve aos seus simples sobre configurações avançadas. O site www. de bibliotecas. a ferramenta foi promovida especificação de JDO na Sun – portanto o a Top Level Project . (por Tara Calishain e Rael Dornfest). os projetos deve. Procure por um beta e ainda existe um longo caminho até o capítulo de amostra em www. por uma decisão recente do comitê do Um dos autores é Craig Russel. acesso gratuito. é claro). As- sim. uso eficaz do Google. desenvolvedores envolvidos. A maio. www.oreilly. especialmente para o desenvolvedor que ven. Cactus. você indica como deve ser www. Cookbook (por Eric Burke e Brian Coyner) bre a aderência a convenções de codificação. até a geração de relatórios so. mas já vale a pena considerar o uso da ferramenta em seus projetos. sas realizadas da internet. mas linguagens (incluindo Java. hacks e livros V ocê é fã dos livros da O’Reilly.com ject Model). uma linguagem de scripts do hacks. mas seus desenvolvedores perce- os desenvolvedores e despontando como alternativa (ou importante complemento) ao mecanismo de persistência dos EJBs. O Maven se propõe a automatizar e geren- ciar vários aspectos de um projeto. Java Ne w Animais. URL. Java Data Objects (dos autores David Jordan. até o uso da API do Google com várias ria é escrita sem usar Java diretamente. contendo informações tais como equipes pequenas ou médias e adorado nome. JUnit. famosa por seus “animal books”? Então vale a pena conhecer três lançamentos importantes Com foco mais técnico.apache. o mecanismo de que depois são baixadas de repositórios busca usado para mais de 70% das pesqui- na internet. por muitos desenvolvedores ressentidos listas de discussão. A ferramenta se baseia em um processo de desenvolvimento “leve” es- um arquivo XML chamado POM (Project Ob.

A versão em combinações desses. for XML Bindind) é outra importante API que * por Gustavo Nalle Fernandes Edição 6 • Java Magazine 7 jm6-book. jeto UnMarshaller. UnMarshal – usando um ob- pelo Xalan para a realização de transforma- nais e casts.1. visto que uma folha XPath para modelos não-XML. A implementação gem de expressões criada pelo W3C para uti. isolando o desenvolvedor de detalhes A especificação do JAXP define uma camada Já está disponível a versão 1. • sax.jar – Xerces. em transformações subseqüentes são realizadas funcionalidades aos objetos dados XML obtidos de um InputS- pelo Translet gerado. jakarta. suporta XSLT 1. novas funcionalidades de validação. contextos de servlets.sun. experimentalmente no Xalan. que incluirá suporte ao XPath e várias quia. do JXPath é a redução do número de linhas compiler.com/webservices/ mapeamento bidirecional entre documentos aumentam a segurança no processamento downloads/webservicespack.1) uma URI).sun.indb 7 3/4/2003. e a cober. a contextos relativos. novas tecnologias. Marshal – um objeto Marshaller cria docu- vel 3. é possível ções XSLT. ler. XPath sobre JavaBeans.1. o tratamento de Documentação e download em: tos que representam a estrutura do schema. formado por está o suporte completo a JDOM e reflete a organização e a hierarquia bytecodes Java que realizam a transformação. arrays. O schema tem um e transformações de documentos usando XPath (XML Path Language) é uma lingua. O JAXB permite que seja feito um de estilo é compilada uma só vez e todas as Foram adicionadas também unMarshal em arquivos XML.html. um utili- TraX (Transformation API for XML).1 para a 2. coleções. do documento XML – são instâncias A abordagem XSLTC aumenta o desempenho tura estendida da sintaxe do das classes geradas pelo bind compi- de transformações XSLT. O desenvolvedor drão do JAXP. é suportado schema antes de realizar a conversão. além de dades importantes.0 final do JAXB (Java Architecture 2. Outra vantagem tário fornecido pelo JAXB. especificações e estratégias X-News* Novo JAXP • jaxp-api. mentos XML a partir de uma árvore de obje- melhorias (por exemplo. Lançamentos e atualizações de e ws produtos. processador XSLT Com o JXPath é possível ir além. O DOM le. definir um XML Schema. XLSTC (Compiling XSLT Processor).1 do JXPath.jar – implementação do suporte a SAX A versão 1. URL ou eventos SAX. ou Binding – a partir de um schema. porém é mais uma folha de estilos XSL. livres como o Trang (ver nota neste quadro).2 (JSR-63). internos do XML como parsing. gera automaticamente classes que tem maior desempenho e muitos bugs de código para a navegação em estruturas e interfaces que mapeiam os corrigidos. Marshal e UnMarshal : e implementa as interfaces definidas pelo nós DOM/JDOM. evitando o uso de intenso de elementos definidos. é possível selecionar que usa DTDs em seus sistemas poderá fazer contém várias correções de bugs e melhorias nós de um documento XML de acordo com a migração para schemas usando ferramentas de desempenho.2 da implementação de referência do JAXP 1. objetivo semelhante a um DTD. que podem armazenar tream. Na nova versão. a versão de XML. Para começar a usar a API.0. biblioteca do Jakarta Commons que define e eventos. são suportados subcon- mento de web services(JWSDP 1. complexas. A nova versão incluída (2.1 criar uma árvore de objetos que dando origem a um Translet.org/commons/jxpath É possível fazer uma validação baseada no ração dinâmica do documento).apache. Binding. XML e objetos Java. uma alternativa oferecida loops aninhados. (Document Object Model) level 2. 17:49:35 . definidas na especificação final do juntos dos padrões XML Schema e XML Na- 1.jar – Xalan. chamado de bind do Xalan foi atualizada da 2. grupo de elementos dentro de uma hierar. de referência inclui várias bibliotecas do lização em folhas de estilos XSL e expressões O suporte a schemas é a grande novidade na grupo Apache: XPointer (usadas para referenciar fragmentos nova versão do JAXB – as versões anteriores • xercesImpl. • xalan. critérios especificados. parser XML pa- de um documento XML qualquer através de suportavam apenas DTDs. fornecedores devem implementar essas para marshalling e unmarshalling. deve-se que inclui parsing (usando DOM ou SAX) um interpretador para a linguagem XPath.1).2.0 e XPath 1. e a criação O download do JAXP é feito como parte Com o JAXB é possível fazer um de novas propriedades no parser XML que do JWSDP. em: java.com/xml/jaxb.4. eventos de teclado e a possibilidade de alte. Com XPath.0 (Simple API for XML).3. de XML através de Java em vez das APIs SAX e Caminhos com JXPath DOM. e oferece recursos mais flexíveis JAXP (Java API for XML Processing) tem novi. abrangente e escrito em XML. permitindo a manipulação de mensagens SOAP.jar – XSLTC.jar – contém as interfaces que faz parte do Java Web Services Developer Pack Incluída no pacote da Sun para desenvolvi. expressões condicio. definem as APIs de parsing e transformação 1. Mapeamento XML/Java Veja mais em java. usando O JAXB define três operações principais: padrão do JAXP.jar – implementa suporte a DOM a localização de um elemento ou outras fontes possíveis. namespaces de abstração para o processamento de XML. A principal é a inclusão do interfaces.2. entre • dom. Compila a folha de estilo XSL Entre as novidades do JXPath 1. Pointer. As classes dos diferentes mespaces. • xsltc. para uso posterior.

yahoo. um pro. abordando J2ME. de cada lista. tendo assim acesso ao conhecimento passa a conhecer melhor os participantes da lista ni (Qualiti).html. além do e-mail para inscrição e o número de ins- blema que nos aflige por horas pode ser imedia. para servir de “guru”. especialmente as mensagens elegantes e ricas do J2SE.R. j2me-list-subscribe@ [j2me-list] 570 Guedes (CEFET-PB) já planejam as próximas JavaCard. anúncios de noticias-list- [noticias-list] 3.org. Ajuda na submissão javaone-list-subscribe@ [javaone-list] 340 produtos. formação de caravana para o evento etc. soujava. o processo JCP. (Centro de Estudos e de usuários de todo o País. ao perguntar. ajudar nessas horas.E.com/<lista>@soujava. Com mais de 10 mil resolver o problema e. Sistemas Avançados do Recife).br sentações sobre casos de sucesso e novos Discussões sobre o evento JavaOne. Veja na tabela os assuntos tratados em cada lista. Discussões gerais sobre a tecnologia Java: linguagem.indb 8 3/4/2003. palestras foi concluída com uma visão ge. o ideal é contar com um amigo ou colega mais Java. participe Anderson Teixeira. celulares com suporte a Java e ferramentas.br reuniões (mensais). Durante o evento. divulga notícias de erros que você encontrou. tente de abertura. padronizacao-list-subscribe@ [padronizacao-list] 450 palestras técnicas.br um quilo de alimento. E a [dicas-list] . Retomando o enfoque técnico.mail-archive.soujava. Grupo de Usuários Java da Paraíba. Acompanhe as Maia. Além das obrigatórias Padronização da tecnologia Java. gerentes das Lojas tecnologias Java. inclua toda a infor- tratou da API de Collections. soujava. Assim.org. O PBJUG mantém uma lista de de palestras.org.br 8 Java Magazine • Edição 6 jm6-book. A primeira com alguém assim no nosso dia-a-dia.org. servlets/JSP.800 compilação. baseadas em e-mail ou fóruns na web. uma das mais formação bastante populares.org. Seguiram-se duas palestras sobre área de interesse.A. Às vezes.br discussão em groups.org. as listas do SouJava são uma opção você já tentou fazer para resolvê-lo. veja soas e se estendeu por um dia inteiro. estão previstas apre. É o PBJUG.400 assinan- tes. e evita fazer perguntas que não condizentes com gens enviadas. para www. Pena que nem sempre podemos contar no histórico. notícias e links importantes sobre *por Bruno Souza Oracle do Brasil e Connect Soluções In- Listas de discussão tegradas. você por Marcelo Castro (Politec) e José Marco. e os partici- cussão. Na apresentação das mais importantes listas de discussão sobre a • Antes de enviar uma questão para a lista. mação relevante.S. servidores de aplicações. SouJava News. EJB e J2EE 910 de João Pessoa. soujava. Acesso a bancos de ado à Casa de Apoio à Criança com Câncer enterprise-list-subscribe@ [enterprise-list] dados.900 assinantes. Na Sociedade de Usuários Java (SouJava). 17:49:37 . Comunida A força de Java no Brasil Listas SouJava* Q uando precisamos resolver um problema para o qual não conseguimos encontrar a solução.br reunião contou com a presença de 80 pes. Mesmo assim.br dicas-list- [dicas-list] Dicas gerais sobre a tecnologia Java 2. é listas. foi demonstrada a ferramenta tecnologia Java no Brasil. e apoiado pela Java Magazine e CEFET-PB. especificações soujava. é que existem as listas de dis. java-list-subscribe@ Para participar dos sorteios. sobre a tecnologia e a comunidade Java. Marcelo Castro (Politec) e Frederico Java em pequenos dispositivos.br Por exemplo: março no auditório do CEFET-PB. com cerca de 2. o arrecadado foi do- Uso de Java no ambiente servidor. fornece dicas gerais sobre a tecnologia Java. crições (em abril de 2003). ocorreram sorteios de brindes Lista Conteúdo Inscritos Inscrição da Oracle e exemplares da Java Magazine.org.br/ Assad do C. As listas são segmentadas por por alguns dias como “ouvinte”. acumulado nas centenas de milhares de mensa. vadas e é possível realizar pesquisas no histórico os tópicos. foi solicitado [java-list] 1. A [noticias-list] . Participe! Notícias. um boletim que traz. eventos. Para realizar pesquisas O Nordeste ganhou mais um importante JUG. uma equipe liderada por Ronaldo Costa e para você ajudar e solicitar ajuda nas mais diversas • Se você é um usuário novo na lista. publicado o SouJava News. patrocinado pela semanalmente.org. sem submeter perguntas.br em geral são os principais assuntos Os coordenadores Herval Freire (Con- nect). pantes são muito colaborativos. inaugurado no dia 15 de tamente resolvido – ou pelo menos encaminhado – com um simples comentário de quem já passou por isso.com/group/ Listas de informação pbjug. Através dessa lista. Mas. • Ao enviar uma pergunta. even. indique o que e-Gen Developer em desenvolvimento por inscrições.org. A participação nas listas é gratuita.org. A seqüência de com mais de 3.400 subscribe@soujava. Duke do Cangaço experiente. ferramentas e APIs soujava. o estilo da lista. discussões para entender o comportamento e experiências práticas em projetos Java.900 empregos subscribe@soujava.com/java-list@soujava. o professor Frederico Guedes (CEFET-PB) O SouJava mantém também duas listas de in.mail-archive. por Rodrigo tos e atividades do SouJava e de outros grupos podem ser obtidas em www. use URLs com o formato: www. todas as mensagens são arqui. algumas dicas simples que certamente tornarão A abrangência das palestras foi grande milhares de profissionais se reúnem em algumas sua participação mais produtiva: no evento de lançamento. Mais informações sobre as listas do SouJava ral do mercado Java no País.

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). palestras mais específicas. Outras Tecnologias se você é “rato de palestra” e fica divido entre a notícias do evento. As cerca de 40 de palestras técnicas e geren. de Pessoas.justjava. os intervalos entre palestras JavaOne. Além das palestras. Manoel Lemos BUS-2680 Infrastructure (Singularity Systems) Webhosting JavaServer Pages (JSP)/Servlets Securely Using open-source products BUS-1771 Renato Weiner (LocaWeb) Felipe Leme. ministradas É mais uma prova da crescimento. um Pavilhão de Exposições.S.com. evento-justjava-subscribe@soujava. Funcionando em paralelo às palestras. Core cada coffee-break. Ferramentas. Casos de sucesso. tanto quantita- das.R). no Centro de Conven. será dividido em sete tracks : Java no ambiente menos meia hora para Acom panhe as últimas servidor. Palestrantes The Brazilian National Health Card Project: Building the National Health Informatics Rosani Cunha. Analívia Cordeiro (PUC-SP) Introduction to Enterprise Application Integration (EAI) and the J2EE Connector BOF-2534 Rodrigo Abreu (Beng Informática). duas technical sessions (TS) e seis BOFs (birds-of-a- A tabela apresenta os palestrantes e as pales- tras (com títulos originais em inglês) – observe a variedade e a relevância das palestras aprovadas. São Paulo-SP). Java em Pequenos Dispositivos. poderá fazer os dois no JustJava 2003 sem peso na consciência. 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). Einar Saukas (Summa TS-2220 Advantage of Edge Computing Technology) Automatic Internationalization using Web Services BOF-1205 Diueine Monteiro (Bluebox Technologies). haverá três keynotes (apre- nos dias 26 e 27 de abril. Antonio Gois (Seed Technology Solutions) e Wladimir Java Technology Logging: The Past. Um dos principais objetivos do um na manhã do domingo. tivo quanto qualitativo da nossa comunidade. no período da noite ou madrugada). Mais de mil participantes e a troca de conhecimentos entre os discussões informais. 569. www. algumas com destaque especial nunca an. antigos BOFs das primeiras edições do em fazer parte do evento. EUA. Fechando o sábado.E. edição do evento. O evento tem apoio da de convivência. no estilo dos são esperados e é intenso o interesse de empresas participantes. ou inscreva-se na lista de Produtos. Título Id. JXTA etc. Soluções e a possibilidade de intervalos maiores. teração. haverá cimento nas apresentações. Carlos Queiroz (IME/USP). Cláudio 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). feather. Para maximizar essa in. Brasil é 10 no JavaOne 2003 A presença brasileira no JavaOne 2003 (São Francisco. enviando um e-mail para Relacionadas a Java (Jini. Beatriz Leão (Ministério da Saúde). terão duração estendi. Já são 10 palestras aprova. Yara Hornos (Globalcode) Architecture Gustavo de Paula (C. que incluirá.br. grupos e empresas que tornam forte o Java no País l LEONARDO GALVÃO JustJava se aproxima O primeiro grande evento de Java do ano já está com data.org. 17:49:42 . Fernando Nascimento (Motorola Brazil Design Considerations in Implementing a MIDP IM Client BOF-2985 Center) Edição 6 • Java Magazine 9 jm6-book. O JustJava 2003 acontecerá Ofício (problemas e soluções do dia-a-dia do desenvolvedor). Há ainda muitas sur- ciais do Evento da Comunidade Java Brasileira da – será reservado pelo pre sas prometidas.).A. SUCESU-SP e já conta com dois patrocinadores Pavilhão é promover o networking haverá um coquetel e um conjunto de Master: IBM e Oracle. Cerquei.indb 9 3/4/2003. além sentações especiais usando o espaço de várias ções Frei Caneca (Rua Frei Caneca. local e principais patrocina- dores confirmados. e Ossos do animação dos corredores e a aquisição de conhe. Portanto. de estandes de empresas.br. com novidades no site Java: Linguagem e APIs. um amplo espaço salas) – dois no primeiro dia (manhã e tarde) e ra César.

E num esforço de criar uma local. quase Ao invés de codificar e devolver páginas essas aplicações. Es- N a primeira parte deste artigo (“In. Toolkits web permitem de. tão similar a uma apli- te que essas aplicações são exigidas pelos E o pior. gerar interfaces sofisticadas. uma “aplicação local” que não precisa ser web da mesma forma que desenvolve uma las com o Swing. necessário para fazê-lo corretamente.indb 10 3/4/2003. voltados para a criação de aplicações com de uma aplicação local. e em geral. aparência. no browser. completo. Vimos também quais tecnolo. situação – centenas de páginas HTML que frameworks de desenvolvimento web Edição 5) tratamos dos tipos de parecem mais descrições do layout de uma que simulam.transformá-las de local por conhecer algumas soluções Java que tem como evitar fazer ando-se em eventos. mas com aparência e interati. base. A Vida. seu socorro. quais as al. para juntar essas duas coisas. você cria janelas. Como distribuir e atualizar essas código JavaScript difícil de manter. instalar algo local. intranet nhas de JavaScript. o código de aplicações web fica local do que web? Vimos na primeira par. e extranet. prefere não ter a interatividade servlets e JSP. por trás. dades básicas que encontramos em botões e Trabalhando. um toolkit de janelamento diferenciar os usuários internet. milhares de li. mas (desktop) sofisticadas com a tecnologia locais. até para versões diferentes de to à mão. gias nos permitem criar aplicações locais campos de texto tão comuns em aplicações e com HTML e JavaScript pela frente. distrib u controle. vem essas questões. por motivos fora do seu especialmente porque você precisa simular volvimento de aplicações locais. simulando funcionali. com servlets e JSPs. SButton do WingS). não é uma tarefa fácil. (às vezes. aplicações? Mas como podemos distribuir de componentizar e. esses madas e parâmetros HTTP. todos ao browser. abas. usuários e alternativas”. difícil eventos. pelo menos (trocar por exemplo um Toolkits web não caia na armadilha de JButton do Swing por um Existem situações nas quais você precisa tentar simular uma aplicação local "na mar. A tecnologia Java traz instalada. uma aplicação baseada aplicações locais típicas de trocar “Js” por “Ss” no browser. É muito comum encontrar sistemas nessa ses chamados “toolkits” são. nossos usuários intranet ou extranet. aplicação local. todos os componentes com E o que fazer quando uma aplicação local instalação local da aplicação. ou simplesmente vidade “quase local”. como em para web é uma questão nos ajudam nessa tarefa. interação e modelo de desen- não tem opção. esses sistemas os quais você está acostumado em uma não é uma opção. botões. Procurando evitar a checkboxes. o Univeso e Tudo Mais Java no De s Parte 2: Toolkits. nem ao menos cação tradicional que. em particular. Podemos então começar Portanto se você não mesma forma que locais. mas para 10 Java Magazine • Edição 6 jm6-book. mas conseguem a interativi. mas sua aplicação tem muitas vezes tornam obrigatória a instala. mas fica preso ra". permitem que de clientes e servidores em uma solução sistemas acabam num emaranhado de você desenvolva aplicações baseadas em única. e a própria JVM? Vamos impossível de portar para vários browsers HTML cheias de código JavaScript escri- juntos conhecer as tecnologias que resol. na verdade. Existem alguns toolkits que com botões e menus. como em aplicações locais típicas. todo um modelo de tratamento de eventos ternativas para gerar aplicações que que não faz parte do mundo web. Em vez de criar servlets e tratar cha- o suporte necessário para a integração “aplicação-web-com-cara-de-local”. Nesses casos. em uma aplicação baseada usuários de uma aplicação e vimos como janela do que documentos. do que um conjunto se propõem a fazer exatamente isso: dis- de páginas? A maioria segue o caminho ponibilizar uma interface “local” usando de criar aplicações usando uma mistura de tecnologias web e fornecendo o suporte HTML e (toneladas de) JavaScript. para o desenvolvedor. pelo menos no wingS na prática nem sempre temos a opção de dade desejada! senvolver aplicações web da (um desses toolkits). muito mais características de aplicação ção de uma nova versão do browser. terfaces. 17:49:44 . uma grande confusão de forma componentizada e transparente Java. Mas não se desespere – Java pode vir em reçam mais com uma série de janelas. os toolkits web per- Mas existe muito mais em fornecer uma Tudo isso quase sempre é feito para criar mitem que você desenvolva uma aplicação aplicação local do que apenas criar jane. um mesmo browser). sob Assim. Desenvolver uma aplicação baseada em Existem vários desses toolkits. pena de excluir usuários. pareçam locais? Aplicações que se pa.

mas a realidade é que de nada adianta ter uma outros motivos para usá-las localmente ao para quem não tem opção. não foi para eliminar isso que a dessas funcionalidades são em geral para como “Swing na web”. assim. A web foi inventada ção sempre e quer algo mador Swing. segue exatamente a web foi inventada? Bem. desempenho (por mais ções e certamente não resolvem todos os Distribuição de aplicações rápida que seja a rede. vez queira dar uma olhada no Tapestry. que hoje parece simples. coisas não rodem no servidor). Além de apresentar interatividade com o fazer o processo de instalação automático. seja como usuário. certamente. em 1995. Técnicas e ferramentas para e sktop facilitar a disseminação de Java no desktop b uição e instalação BRUNO SOUZA serem executadas no ambiente web. “nova versão” da aplicação que não tem não às funcionalidades) fazem do Mills. uso introduziu. rodando no servidor). Não um componente integrado. as aplicações que precisam tipo está o já citado wingS. um programador documentos. por exemplo. mais seguro. do dia para a noite. A aplicação de demonstração desse cações. é aquela prejuízo em relação à apresentação. não 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 usuário contava na versão “antiga”. sempre queremos problemas citados (afinal. podemos mais cara de aplicação web mesmo. tal. existem diversas ra. você usa apenas (onde as informações do usuário não trafe- nenhum tipo de plugin ou instalação. tipo de aplicação web? você ter que lidar com a integração de ficos. forçamos Se for. Mas porque não fazer o que o usuário está Mas o fato de uma aplicação rodar local- nosso “terminal burro” colorido. tigado é o Millstone. funcionalidades são tão impressionantes ainda assim. irá se surpreender ao se tor. Assim. E. Ele possui uma API a tecnologia. mas uma interatividade maior? Você pode for. imagens). da máquina dele). pode ser uma aplicação interativa se for necessário voltar invés de mantê-las rodando sempre no excelente opção! ao passado – e ficar instalando aplicações servidor. 17:49:49 . porque. não. você vai encontrar aplicação web. processamento JavaScript com seus servlets. menos co- toolkit. precisa elevar a inteligência do browser. browser. diagramas. seja sem suporte a JavaScript (com um certo Mas e no caso de aplicações precisam de como desenvolvedor. ou não são armazenadas fora são perfeitos para todos os tipos de aplica. sem servlets/JSP tradicional. muitas aplicações podem ser você estará em maus lençóis se tentar forçar quanto às do wingS. Em geral. Se conseguimos ponibilizar documentos. replicação de infor. Mas. olhando sendo uma aplicação local. não significa que não possa tirar Se você precisa de uma aplicação com aplicação local? proveito da rede! Se temos a rede. mais web). não interativo. continuam não Toda essa história de interatividade pode mais velocidade). das funcionalidades do demo do Swing. gam na rede. usuário muito melhor. realmente pedindo e desenvolver uma mente. reproduz boa parte chegar aonde estamos é aplicações. a tecnologia Java gram os lados servidor (servlets) e cliente de informações (para acelerar o acesso). como acontece chegar aonde estamos é porque Se não é o caso do sua Outro toolkit que vale a pena ser inves. Foi uma revolução. seu usuário faz tudo integrado ao um framework mais tradicional. como para desse conceito. que se posiciona Afinal. applets Java. ao invés de ficar se pra contar com a rede). E com certeza você já de serem executados mesmo em browsers mundo web e funcionam muito bem. cache local Com o browser HotJava. a noção de aplicações (HTML+JavaScript) em um componente desconectado da aplicação (nem sempre dá carregadas automaticamente via rede: os reutilizável. não apli. Entre os mais sofisticados toolkits desse nas máquinas dos usuários. viu isso acontecer. toolkits web que citei. a froça. mas suas muito a barra. Se conseguimos nectado. mesmo com os própria e não segue o Swing. nar. em vez pulação visual de elementos gráficos (grá. como em um desenvolvimento de diminuir a carga no servidor). o usuário intranet. mas sim uma parecer muito interessante no papel. em muitos casos com forçamos muito a barra aplicação. A web foi criada para dis. Mas. voltado zões para termos aplicações locais – mani. para disponibilizar melhor. o Tapestry distribuído (onde queremos que algumas Applets e Java Web Start fornece a noção de componentes que inte. aquele que usa a aplica- mesma API do Swing (se você é um progra. na verdade. çar a barra (mas nesse caso. mais rápido. segurança web ganhou uma nova expressão e a tecno- Edição 6 • Java Magazine 11 jm6-book.indb 11 3/4/2003. Será que isso também não é um para a geração de HTML. As customizações encaradas como uma série de documentos. menos repetitivo. Relembrando. uma aplicação com essas necessidades em dos diversos componentes e a capacidade Essas aplicações são parte importante do um ambiente web. Por causa debatendo para juntar as duas coisas à mações (tanto para velocidade. tudo bem. mas suas aplicações locais.

Juntamente te. o JWS já que trata do download e da instalação de Start. que usam a aplicação dia- lhes sórdidos e declarou precisa apenas clicar em riamente. exatamente a ção automática da máquina virtual: se sua cido gerador de instaladores – e votado o tecnologia que causou uma das mais revo. além de suportar outras na utilização da interface web. um futuro próximo. sem a necessidade de ter a aplicação a tecnologia Java. uma aplicação gerenciada pelo JWS é rede e tirar proveito de todas as vantagens soft fez para destruir ao mesmo tempo Java automaticamente baixada e instalada lo. em versão disponível. se na primeira vez que ten. como vimos. sem qualquer sibilidade para distribuir de aplicações a Java tivemos uma estagnação das JVMs dependência do browser. calmente. é completamente viável para a distribuição de aplicações. forneça sugiro que leia o proces. e a Netscape. atualização e O Java Web Start pos. Network Launching Protocol (JNLP). da execução local. uma espécie de concorrente do Java Web No caso do MacOS X e do Solaris. auto- sobre nós mesmos desenvolvedores Java. .exe. Ao mesmo tempo. várias versões da JVM podem co.x em diante). vimento de uma aplicação. e não precisa mais ser livre de milhares de linhas de JavaScript a Microsoft “melhorou” mas com as vantagens de uma baixada. carrega apenas as diferenças entre a versão web. 17:49:50 . o JWS permite que você forneça a que essa tentativa foi um um link. independente da versão de browser e les que ouviu dizer que local que seu usuário precisa. distribuição de aplicações Java. o InstallAnywhere Now! . desenvolvedores tempo. sem gratuita.rpm etc. podemos nos libertar da prisão do torna o JWS uma solu. que permite atualizar aplicações faz parte da instalação do próprio sistema aplicações através da rede – veja o quadro automaticamente pela internet. o usuário usuário extranet.4. o que são. ção muito eficiente para Java Web Start é automati. a partir da Muitos desenvolvedores Java de hoje O funcionamento do JWS é simples e segunda execução. existir em uma mesma máquina. A cada execu. o Universo e Tudo Mais logia Java foi parar em todos os jornais. interativa. instalar a JVM e realizar a instalação dire- que. na primeira vez que o usuário a Se você considerar o usuário intranet e o A Justiça norte-americana expôs os deta. o JWS tente simular uma aplicação local. Conhe. e pelo menos quatro distri. outra parte da culpa recai disso. so para ver o que eles tentaram fazer com baixar uma nova versão e. camente baixada e instalada aplicação local fácil completa de distribuição. lação basta clicar em um link usuários. “JNLP”.indb 12 3/4/2003. Java e permitir seu uso em um ambiente existentes nos browsers. instaladores nativos (. Apesar de operacional. soft culpada de ações monopolistas contra no site. mais al instalada.NET – e de que atual e a nova. no que diz respeito ícone no desktop do usuário. ou inicializada a partir de um A criação de instaladores é outra pos- rios em diversas áreas. Para fazer a insta. E suporta as funcionalidades básicas de um aplicações Java para qualquer browser. utilizando o JWS você passa a santes. a aplicação pode ser executada a partir Instaladores com o grande prejuízo causado aos usuá. na especificação do Java bém o PowerUpdate. decidimos nos refugiar No Windows. mente (sem download). faz sui outras característi. caso positivo.NET morde? o JWS passe a fazer parte do Windows. A partir daí. como fizeram ao lançar o . Para instalar a aplicação. tomaticamente baixada e instalada. inicializa imediata- desconsideram applets como uma solução afeta muito pouco o trabalho de desenvol. que considerou a Micro. Basicamente. pode funcionar desconectada da parte disso graças ao esforço que a Micro. o download da JVM pode ser feito a partir instalador e pode ser utilizada comercial- mesmo as versões mais antigas. com (para eventuais cobranças). o que afastou os O JWS também pode fazer uma atualiza. não necessariamente web. ela é au. de um servidor na sua mente. Se você é daque- ção local: forneça a aplicação espécie de cache local ma. Uma vez instalada localmen- forma eles prejudicaram a JVM. do browser. o download e a instalação de O InstallAnywere possui uma versão recentemente.. Gratuito. de instalar para seus gerenciamento de aplicações. aplicação web ção da aplicação. como o registro do uso da aplicação JWS. você Muito se tem falado da “disputa” entre o 12 Java Magazine • Edição 6 jm6-book. mas com as vantagens de uma aplicação a sua liberdade de escolha – jogar no lixo. é até mesmo possível que instalada localmente. possuir funcionalidades adicionais interes- buições Linux incluem o JRE contendo o Portanto. verifica se é necessário a aplicação local que seu usuário precisa. tamente da web. tallAnywhere da ZeroG. que ferramentas que precisamos para distribuir a necessidade de interação do usuário. O mais conhe- desenvolvedores dos applets. de não fornecer uma O Java Web Start (JWS) é uma solução aplicações internas. e em grande estilo.). parte do Java Runtime Environment (JRE) e cas que estão definidas A ZeroG oferece tam- é instalado automaticamente quando é ins. a aplicação com as funcionalidades que eles Não tente simular uma aplica- esforço premeditado e aplicação fica em uma precisam: verdadeiramente multiplatafor- ilegal.. e acessando a última O . Com essa ver- cendo e utilizando o que já temos há tanto própria rede local. integração com o browser e acesso via link não é gratuito. localmente. Não a máquina virtual Java.2 da tecnologia Java que temos o JWS ou não houver uma máquina virtu. utiliza. Desde a tar executar a aplicação não for encontrado funcionalidades e configurações úteis na versão 1. talada a plataforma Java (1. tem uma aplicação local que. – primeiro com o Java Plugin e. aplicação solicitar uma versão específica da melhor pela comunidade Java – é o Ins- lucionárias mudanças de mentalidade no JVM que não esteja disponível. Por conta de uma decisão recente da ter as vantagens de uma aplicação web. Uma aplicação gerenciada pelo Java não têm desculpa browser. Além tipos de instalação e é capaz de gerar Por outro lado. Suporta vários desenvolvimento de aplicações.A Vida.(praticamente impossíveis de manter). o PowerUpdate justiça americana. com o Java Web Start – as ambos acontecerá automaticamente.

definido pela JSR-56. dentro da tecnologia foi “write once. P2P.. e que suportam o gia proprietária sobre a qual. ambiente controlado para cação.. ser um modelo “errado”. Esse é o principal ganho dos En- renomeado e mais uma vez adiado . por exemplo. bibliotecas nativas e propriedades as versões necessárias. baseadas em clientes porte no backend para diferentes tipos de cia da tecnologia Java e dos servidores de Windows e que. Edição 6 • Java Magazine 13 jm6-book. Algumas das funcionalidades • Carregamento de bibliotecas e arquivos clipboard e da persistência local de dados. fica claro que é fundamental que acessados por seus usuários. É o caso da tecno- aplicação J2EE. só eles (e logo De tudo que falamos nas duas partes des. em par. completar o . Java no backend. desenvolvimento dos serviços que serão eles!) têm controle. idéia. in- Java que suportem a atualização dinâmica necessárias. da aplicação como de bibliotecas exter. como o cliente deve acessar a informação.jar específicos de plataforma. formas. televisão é de fato divertida. crash everywhere. • Suporte ao carregamento e à instalação o formato dos arquivos. enfim.NET. e as tecnologias apresentadas modelo. tanto drasticamente o tamanho da atualização. fornecedor. de instabilidade dos ambientes Windows. você vai precisar delas. e Grid Computing são algumas que já tomática). à não tão poderosas interfaces web. Para que apenas servidores web turbinados. tecnologias muito mais sofisticadas do que mar tudo em “web services” – na verdade ticular. JavaSpaces. que trata exatamente de for- JNLP O Java Network Launching Protocol. diminuindo integrar esse protocolo a um servidor web.indb 13 3/4/2003. lança. J2EE e . cluindo manipulação de arquivos.. interessantes do JNLP incluem: . particular o . para os desenvolvedores tes interfaces com o usuário. que ver no futuro próximo a concorrência de Outras tecnologias Java também dão su- passou muito tempo negando a importân. incluindo informações sobre a apli. pode ser utilizada de diferentes importantes como integração com outros neste artigo já indicam o caminho. o já soft conhece o cliente e sabe que interfa. Java usuário. é a especifica- ção que permite a “mágica” do Java Web – itens que estarão disponíveis para a exe- cução da aplicação. existe com esse considerações. a surdamente semelhante ao modelo J2EE Precisamos apenas conhecê-las e começar tecnologia Java não se limita a um único (semelhante. O risco permite a criação de sistemas “camaleões”. • Versionamento da aplicação e de biblio. para a nossa liberdade de escolha não é o capazes de fornecer diferentes interfaces ram no mercado um conjunto de tecnolo. do- ções. de versões que já estejam presentes. Apesar de ser Java. a tecnologia Java oferece o suporte no Como o suporte a múltiplos tipos de inter- a melhor definição que vi até agora do . é importante sair do casulo. objetivo. ning (JSR-124). aplicação. mas a locais em desktops. Ao contrário de outros ambientes. mundo do J2EE. há muito tempo.NET backend para você definir e implementar faces é fundamental. Jini. o modelo do servidor .NET é ces meramente web não bastam. por isso mesmo. que só sejam carregadas as bibliotecas • Segurança: assinatura de aplicações. exaustão. ultimamente. E tudo isso. as que o ambiente Microsoft proporciona. Para quem não lembra. J2EE. aplicações interativas. veito das interfaces sofisticadas no cliente. • JARDiff: comparação das versões e carre- gamento de apenas o que for preciso para Start (JWS). sempre! citamos nesta coluna. Apesar das óbvias deficiências. nativas referentes ao sistema operacional wnload seguro. de acordo com gias que são uma verdadeira rendição ao a expandir o monopólio do cliente. em – escreva uma vez e rode só nela mesmo!). Aplicações tros modelos existem como. ou mesmo web nossa – preto-e-branco e sem som – é muito e PDAs. Em suma. evitando downloads características.. mas sim vir para o mesmo serviço. session beans ou persistência au. não impor- casos patológicos da indústria onde uma a sua arquitetura seja capaz de suportar tando o tipo de interação que exijam. que Como resposta ao que eles repetiram. • Empacotamento padrão para aplica. portanto. interfaces web para clientes no services? A tecnologia Java é muito mais do melhor que a colorida!”. MIDlets em celulares o uso de JavaSpeech.NET tem um ponto a seu favor: a Micro.NET monopolizar o servidor. permitindo com que a aplicação seja de JVMs diferentes. que procura transfor- linguagem semelhante a Java e. atraentes do que as “vitaminadas” mas já logia Jini e seu sensacional ServiceUI. vale fazer algumas . tudo o que nas. JMX.” sistemas que possibilitam suportar diferen. engessando seu desenvolvimento –. sendo uma tecnolo. no contexto iludam.NET. A especificação define como • Suporte para carregamento imediato. entre lógica de negócios de aplicações desktop. e lógica de apresentação. O Java Web Start é uma implementação • Suporte a recursos externos: bibliotecas tecas: a aplicação pode ser atualizada para do JNLP. Java a especificação J2EE Client Provisio- Apesar disso. Com o histórico browser. permitindo mesmo para aplicações não assinadas. . uso do de aplicações. ou somente quando for necessário. serão mais interação com o usuário. Não se A separação bem definida que temos no um assunto para outro artigo.NET.jar da nova versão. virtual (mas para uma única plataforma possui as tecnologias para tirarmos pro. um daqueles se artigo. suporta todas essas Java. uma reação (ou inação?) da Microsoft. JXTA sistemas. é necessário para se criar instaladores em carregada aos poucos. página web e ícone da do usuário. e somente as partes • Interação com o ambiente nativo. as necessidades e a forma de acesso do modelo Java: existência de uma máquina E a verdade é que. isso. Ou- empresa propõe que “agora mudamos de diferentes tipos de interfaces. e podem ser baixados à parte. Espere terprise JavaBeans. 17:49:51 . execução de aplicações não-assinadas. mas sem funcionalidades a utilizá-las. ab.

de tecnologia – o entendimento do que país da pirataria.A Vida. e colocar Java em todos os implementação de referência – você pode mostrar o melhor caminho.sun. Exemplos de aplicações Swing jornais. é possível java. Como desenvolvedores Java.souza@javaman. wings. dependendo da forma que seu usuário redes internas.indb 14 3/4/2003. dentro de nossas aplicações que eles precisam. o “JavaMan” (bruno. Tapestry Bruno F.com Sociedade de Usuários Java (SouJava) e membro do Java repetindo o que ouviram falar ou leram em Community Process. aplicação local através do Java Web Start se CD e instalar em todos os lugares que você apenas não fuja de fornecer uma aplicação estiver utilizando um ambiente de desktop. disponibilizar o mesmo backend para vá. O usuário recebe uma que tal já aproveitar e levar a JVM em um aplicação web para os usuários esporádicos.sun.com com.zerog. mas estão apenas www. vamos “piratear” algo ção – que já está disponível e possui uma é possível fazer. virtual. É fundador da querem aplicações web.com/products/javawebstart é ele quem vai fugir de você! ou uma aplicação MIDP se estiver em um Java Web Start e JNLP celular.com/j2ee/provisioning programar e expandir seu servidor para J2EE Client Provisioning suportar outros tipos de interfaces.sourceforge. em vez de tentar forçar o que alguém acha melhor millstone. é veterano da tecnologia Java e um dos Nossas equipes de marketing dizem que ZeroG líderes do movimento Java no Brasil. Souza. E. Millstone gias adequadas para você escolher o que tapestry. Além disso. lugares.de Assim. Mas cabe a nós – desenvolvedores. se para isso é necessário fazer um do. Ou java. o Universo e Tudo Mais necer clientes diferentes para uma mesma consultores. fornece o suporte e as tecnolo. a tecnologia Java mais uma vez WingS está anos luz na frente.mercatis. além da capacidade de que é gratuito. vamos fazer! Na verdade. E agora? www. ou ainda uma interface web se esti- ver em um browser. 17:49:52 . Com essa especifica.jgoodies.org para você. sofisticada para o seu usuário intranet. 14 Java Magazine • Edição 6 jm6-book. Não existe da. temos rias aplicações clientes. e o seu servidor de wnload de alguns megabytes da máquina condições de dar aos nossos usuários as aplicações irá escolher a interface adequa. gerentes técnicos e diretores for? Já que já ganhamos a fama de ser o aplicação de servidor.net precisa. porque. uma única vez. problema nenhum em disponibilizar uma acessa a aplicação.br).

Edição 6 • Java Magazine 15 jm6-book. 17:50:06 .indb 15 3/4/2003.

A resposta inicialmente é não. devem ser instalados separa- sua infância.x. o Tomcat é otimizado 16 Java Magazine • Edição 6 jm6-book. Por outro lado. na Edição 2). tainer web fornecida pelo Tomcat. infra-estrutura cuja aplicação vai além de componentes principais: Mais adiante. ção passo a passo de páginas JSP. interage diretamente com o navegador ou Tomcat?”.1 e JSP 1. conector efetivamente de projetos de software livre relacionados Futuros requisitos dessas tion o código inacabado da transforma o Tomcat em com conteúdo web. como o Ant (apresentado Catalina – é a segunda geração de con. o Tomcat implementa não só as res web ou servidores de aplicação J2EE. especificações costumam implementação de referên. software livre. 17:50:15 . gerando e compilando o servlet cor- e continua sendo a implementação respondente a cada página. CGI e interpretação de SSI (Server-Side In- nologias Java no servidor. Desde a integração do Catalina com outros servido- A Apache Foundation foi formada versão 4. deve ser configurado um HTML estáticas e outros tipos de documen- pronta para produção e liberada como conector para realizar esta interação. como o mod_jk iniciado quando o Java ainda estava em Arquitetura do Tomcat e mod_jk2. geral uma página HTML) para o navega. como o Xerces.2 de servlets. suportar outros recur- no servidor. Sua função é gerenciar o ciclo de vida e pela Apache Foundation.4 e J2EE 1. O Jakarta foi cludes). Desde então. de servlets 2.x possui três servidores Apache. o Tomcat vem sendo incor. Este e se tornou um guarda-chuva para dezenas Sun doou à Apache Founda- especificações do J2EE. que o Catalina não configurar um servidor web para rodar o plataforma Java. IIS e Netscape/iPlanet. O em torno da comunidade de especificações de servlets conector HTTP (Coyote) desenvolvedores e usuários do e JSP. dores de rede perguntam: “É necessário ga” para uma API crucial ao sucesso da dor. como imagens PNG e JPEG ou vídeos. cia de servlets 2. entretanto. veremos em que situações aplicações web.um servidor web e pode cionados com geração de sites dinâmicos ser implementadas ante. ser instalado em qualquer container web formato WAR. o servidor web mais popular da as exigências para con.0. em especial os rela.1 de JavaServer Pages (JSP). pois o Tomcat é capaz de fornecer páginas construir uma implementação robusta. servlets e 1. voltado para tec. em vez disso. Java e é parte da distri- O Tomcat nasceu quando a internet (tanto acadêmica como comercial) tainers web definidas nas buição do Tomcat. esta integração é desejável. como a execução de programas projetos seja o Jakarta. Tomcat para facilitar a depuração e execu- O Tomcat já nasceu na versão 3. o código (inacabado) da implemen. colaborar com a comuni.1 ser configurado para a partir de lógica de negócios hospedada cipadamente no Tomcat. tais como o suporte a JMX sos de um servidor web Talvez o mais bem-sucedido desses (que só será obrigatório nas especificações padrão.x. e à Apache Foun. tos. Outros conectores. Java Livre Tomcat fu Arquitetura. para o processamento dos arquivos de tação de referência da especificação 2. aderente à especificação 2. por isso esse projeto precisou Nosso foco neste artigo é o Tomcat 4. Assim toda a comunidade Jasper – é um servlet padrão que pode desde que eles sejam empacotados no pôde se beneficiar. 5. Esse poupar memória. A versão 4. dation. trazen. Algumas IDEs oficial das mais novas especificações chegam a executar o Jasper em separado do para aplicações Java para web. dade de usuários e desenvolvedores para com o servidor web que requisita a URL.4).indb 16 3/4/2003.1 de vas instâncias ou quando descartá-las para configuração em XML. mas também todas é escrito inteiramente em Apache.x e continua evoluindo no pacotes desenvolvidos pelo projeto Jakarta doar ao projeto Jakarta. a damente e permitem integrar o Tomcat aos desenvolver uma série de tecnologias de atual série estável. decidindo quando gerar no. que deu O Tomcat também utiliza vários outros O Tomcat nasceu quando a Sun decidiu origem à série 4. do novidades como o formato de pacote Conectores – os conectores facilitam a WAR (Web Application Archive). instalação e porado a um número crescente de Fornece suporte à execução de páginas servidores de aplicações e IDEs Java JSP. Note. O Catalina é também o foi um movimento sábio da empresa: em responsável 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 implementação de referência “capen.0. dos servlets.

Caso um dos nós do 5. utilizam o próprio Tomcat Tomcat e especificações cat.3/1.0 Alpha) 2. as Edição 6 • Java Magazine 17 jm6-book.1 pouco recomendado de adquirir e configu. evitando a perda de tros recursos presentes em servidores web e a localização de recursos via JNDI (Java informações das sessões dos visitantes. gerando efeitos como a per- web são limitadas. configurar um ambiente de desenvolvi. de aplicações J2EE completo para desen. res” (server farm) para atender a um único nor overhead. serão perdidas.x (3. de modo É possível configurar o Tomcat para ar- tem desempenho inferior à maioria dos que não há necessidade de um servidor mazenar as informações de sessões HTTP outros servidores web do mercado no for. de cliente do seu servidor de aplicações no das aplicações. Mesmo os recursos deste banco para tolerância a e páginas HTML). JMS.x (4. de servlets e de JSP: lizar um servidor J2EE completo: torna possível atender a • Suporte a EJBs ou JMS muitas aplicações web uti. dar servlets e páginas JSP. mas o overhead desta solução é Por isso é comum configurar o Tomcat fornecidos por EJBs. enquanto que um servidor Cold Fusion etc. comprometendo o desempenho como subordinado a um servidor web na.0. em um banco de dados relacional e utilizar necimento de conteúdo estático (imagens volver aplicações web avançadas. H á duas versões atualmente suportadas do Tomcat (séries 3 e 4). mod_jk2 permitem utilizar o Apache e ou- tros servidores web como balanceadores de Alguns servidores J2EE agregam ao Tomcat um re. Todas elas continuam sendo ativamente carga. A série 4. Assim tegrar um servidor web ao Tomcat é na do que seu servidor de aplicações para ro.x (4. da de cestas de compras em sites de comér- linguagens de servidor (PHP. web J2EE. como o mod_jk e sua versão aprimorada como container web.1. Série/Versão do Tomcat Versão de servlets/JSP • Necessidade de clusters com tolerância lizando apenas servidores 3.18) 2. diretamente entre os containers web.1) 2. com suporte a recursos avançados curso que não está presente como session affinity. ganhando em servidores J2EE comerciais escalabilidade. mais leve e baseado em software livre. os recur. 17:50:21 . configurar um mento perfeitamente funcional utilizando EJBs em outro servidor de aplicações pode servidor JBoss sem os serviços de EJB e apenas o Tomcat. mas sem recursos nele isoladamente: o suporte suportadas (incluindo correções de bugs e melhorias robustos de tolerância a falhas.3/1. acrescentar um balanceador 4. Provavelmente o Tomcat será mais rápido os serviços de suporte a clustering. que não Tomcat fique indisponível.). dores J2EE opta pela replicação das sessões um nó separado da rede). Como vimos na exigir versões diferentes das especificações. obtemos as vantagens de um ambiente construção de uma “fazenda de servido. que nem Tomcat x servidores J2EE comparação com servidores sempre são compatíveis retroativamente. (stateless) do protocolo HTTP versões do Tomcat. mas é possível tregue para deployment no Tomcat. Ele não suporta outras sos de clustering destes servidores.1. buição de carga e à economia de licenças.0.0 hospedar aplicações web simples. topo-de-linha como o Apache. devido ao me. Há duas situações onde o Tomcat sozinho web. e suas capacidades como servidor não utilizam de modo adequado.3. além da série 5 ainda em desen- volvimento. de modo a rodar apenas o Tomcat qualquer software adicional. incluso em sua distribuição junto com e Outra situação onde é interessante in. mas será necessário uti. por exemplo. Alguns conectores do Tom. a natureza sem-estado A tabela abaixo indica a correspondência entre as não será suficiente. Também Naming and Directory Interface).indb 17 3/4/2003. Separar aplicações web no Tomcat dos Podemos. Por isso a maioria dos servi- tivo (seja hospedado no mesmo host ou em diretório WEB-INF/lib do pacote WAR en. sem a necessidade de ter várias vantagens com relação à distri.1.6) 2. Zope. como um pool de conexões JDBC sessões em memória.2 ou 2. mesmo porque muitos dos sem abrir mão da tolerância a falhas. ou sessões HTTP hospedadas neste servidor Java.x do Tomcat suporta todas as cio eletrônico. ASP. conjunto de aplicações web.2/1. Aprenda o essencial sobre ndamental o container web mais usado no mercado e configuração FERNANDO LOZANO apenas para lidar com os componentes fazem uso de EJBs e que não necessitam.2 rar servidores J2EE completos apenas para de carga. bastando 4. basta incluir as classes excessivo. e não fornece esquemas características previstas para containers J2EE completo será capaz de replicar estas elaborados de cache de conteúdo ou ou.4/2. pois aplicações em produção podem a falhas. que seja necessário interagir com serviços falhas. que não Muitas empresas desenvolveram o hábito interagem entre si.0.x (5.2/1.1 a falhas Tomcat “espelho”. a clustering com tolerância de desempenho).

especialmente com relação à Figura 1.exe e *. mas note que Jakarta. Ele necessários. Tanto as versões forne. para cada versão interessante observar o impacto da compi. o seu ambiente de desenvolvimento Java temp – diretório temporário para a JVM mes JNDI. ção. fontes de dados JDBC ou de acesso a EJBs conveniência para usuários de plataformas em outros servidores. sai errado. como e compiladas durante o de.tmpdir). Inclui uma sé- Na página de download do projeto disponibilizados pelo projeto MingW. como te fornecer um JRE para o Jasper. É onde em vários benchmarks) são devemos buscar informações quando algo suportados. Note. Por isso é um download menor esteja configurado corretamente (variáveis (propriedade java. portes da IBM (superiores logs – arquivos de log do Tomcat. ployment. para com XML (ausentes em versões anteriores do Tomcat seguirão passos similares. é necessário que conf – arquivos de configuração do Tom- o Jasper tenha acesso a um cat. basta interessados apenas em desenvolver e descompactar a distribui- hospedar aplicações web independentes. Alguns usu- webapps – diretório padrão para o de- Distribuições ários também reportam sucesso com as versões pré-release do GCJ para Windows ployment de aplicações web.2 ou superior e oferece bin – contém scripts para o todos os recursos especificados para con. Mensagens de inicialização do Tomcat pacote tools. <versão>. Na armazenar servlets gerados pela compila- do Java 2). Podemos ainda utilizar server – classes que compõem o Catalina. dor ou para a invocação de Figura 3.io. Outras versões do Java ou como área de trabalho (por exemplo. common – classes utilizadas pelo Tom- Como páginas JSP são cat e disponibilizadas também para as transformadas em servlets aplicações web hospedadas por ele. duas distribuições: tomcat. que você pode A versão “não-LE” é a distribuição com.1. que preservar a sua estrutura de isto não significa abrir mão de bibliotecas diretórios. de tags e outros recursos avançados das O resultado é a criação especificações mais recentes de servlets do diretório jakarta-tomcat- e JSP.18 “não-LE” utilizando o work – diretório utilizado pelo Tomcat rior.2. 17:50:22 . O de administração do servidor. como drivers JDBC e bibliotecas de GNU autoconf para outros Figura 2. e fornece um ambiente mais leve para os java_home e classpath). Desde que ção de uma página JSP). pois não inclui as classes relacionadas Java2 SDK 1. o parser XML Xerces.indb 18 3/4/2003. renomear para algo mais pleta do Tomcat e inclui todos os pacotes simples como “tomcat4”.zip e tomcat. lação no desempenho e na confiabilidade pois dependem de configuração prévia de LE. início e o término do servi- tainers web J2EE.jar do J2SDK. Também neste subdiretório está a bytecodes Java do Tomcat). Exige retórios: apenas o J2SDK 1. Será rie de aplicações de exemplo. além das aplicações código nativo com o GCJ.Java Livre Note que não é suficien. Também não inclui os recursos verdade não há muito a fazer.<versão>. voltados para J2EE.zip (os pacotes *. mas não esqueça de configurar deve ser feito um ajuste fino em ambientes seu classpath para incluir o de produção.tar. sistemas Unix. Página inicial do Tomcat 4 tags. recente do Tomcat. no entanto. Vamos examinar apenas a instalação documentação do Tomcat. alguns componentes isoladamente. como serviço de no. algumas podem não funcionar de primeira. mesmo que oriundos de ou. do Tomcat 4. A versão LE exige o J2SDK 1. segurança.<versão> .4. Em geral não há necessidade de modifi- compilador Java.gz são apenas das aplicações web em Java.4.1. Índice da documentação do Tomcat 18 Java Magazine • Edição 6 jm6-book.0 ou supe. encontramos. o Tomcat compilado para o container web em si. a execução do Tomcat. projeto RHUG da Red Hat shared – diretório inicialmente vazio fornece binários pré-compi- onde devem ser instaladas classes a serem lados para Linux e scripts disponibilizadas para todas as aplicações de compilação no padrão web. tomando o cuidado de no estilo pré-J2EE. Portanto cá-los para iniciar o desenvolvimento. não fornecidos pelo Windows e Unix – todos contêm os mesmos Instalação e diretórios Tomcat. jasper – classes que compõem o Jasper cidas pela Sun quanto os (compilador de JSP). possui os seguintes subdi- tros projetos da Apache Foundation.

sh (ou startup. dadas. uma A configuração padrão do Tomcat não mite adicionar ou remover aplicações web para a execução do script (batch) em si e ou. recomendo que mos acessar a aplicação Admin pelo link você tenha em mãos as na página inicial do servidor ou pela URL Operação básica especificações de servlets e JSP para sanar http://127. A links “Tomcat Administration” e “Tomcat aplicação deve ser removida Manager”. Arquivo conf/tomcat-users. Observe no canto superior esquerdo os partir de um pacote WAR. como podemos ver pelas mensagens Podemos seguir o link na página inicial container web (engine). <?xml version=’1. abrangente e completa podemos recarregá-la a partir do Manager Listagem 1.0. Ele é baseado no framework Struts roles=”role1”/> do javadocs para as (veja artigo nesta edição) e permite modi- <user username=”both” password=”tomcat” roles=”tomcat. Pode- necida.1: pode por sua vez conter um ou mais hosts Apenas o conector HTTP é necessário para 8080/manager/html (veja a Figura 4). o conector mod_jk pode aplicação permite instalar. Além dis. ou “admin” para a aplicação Admin. end para a edição dos arquivos de configu- <role rolename=”role1”/> <role rolename=”manager”/> tração do servidor ou ração do Tomcat e mesmo dos descritores <user username=”tomcat” password=”tomcat” do desenvolvimento de deployment das aplicações web hospe- roles=”tomcat”/> <user username=”role1” password=”tomcat” de aplicações. se houver). Ele defi ne uma do Tomcat é rodar o script shutdown. para suporte a domínios virtuais desenvolvimento. necessidade de reiniciar o Tomcat.admin”/> </tomcat-users> da documentação for. para que o administrador crie o para todas as aplicações. de modo que interno do seu servidor. Entretanto.bat) presente apesar de bem diferentes na sua constru- no diretório bin.0. A configuração padrão do Tomcat inicia exemplo. seu próprio front-end para a so. servidor e das aplicações hospedadas. sem intervenção manual. script startup. As duas aplicações. remover. nha certeza de que nenhum outro serviço uma API simples. que. a Listagem 1 defi ne o usuário Cada servidor contém um ou mais servi- dois conectores: o conector HTTP (Coyote) “admin” com senha “secreta”.xml.1:8080/admin. Você terá que editar o não é capaz de instalar novas aplicações. por sua vez. em qualquer navegador. são complementares: o Manager per- são abertas duas janelas de comandos.0. pois o atributo o serviço em conflito. que fornece Tomcat e poderá “segurar” conexões e locks o mapeamento padrão de usuários e roles Configuração em servidores de banco de dados. web). do servidor. Administração remota ção. pois isto provocará o término imediato do arquivo conf/tomcat-users.0. síveis pela internet. incluin. web hospedadas pelo Tomcat. Fornece associa uma URL a uma aplicação web. um build file possa atualizar Para testar o funcionamento do Tom. portanto A mesma API é disponibili- tenha certeza de que esta porta também zada também como tarefas esteja livre e desbloqueada no firewall (tasks) do Ant. Te. hospedam um ou ser desabilitando pela edição do arquivo rar. <user username=”admin” password=”secreta” Apesar da qualidade por exemplo definindo novos usuários. Tomcat Manager Edição 6 • Java Magazine 19 jm6-book. como forma de prevenir eventuais difica parâmetros de operação do próprio Tomcat. o Tomcat aceita na porta 8005 comandos administração do servidor. Cada contexto conf/server.0’ encoding=’utf-8’?> <tomcat-users> praticamente todos os Já o Tomcat Admin (Figura 5) é um front- <role rolename=”tomcat”/> aspectos da adminis. administrativos como shutdown. Para iniciar o Tomcat. ou então utilizar a URL http://127. enquanto que o Admin mo- tra para a execução da JVM que hospeda o tração. A primeira janela pode ser fechada brechas de segurança em servidores aces. basta executar o eventuais dúvidas. Em ambiente Windows.1:8080/ para ver a O Tomcat não é capaz de página inicial padrão do Tomcat (Figura recarregar aplicações web a 2). Por o Tomcat é executado. permite o acesso às aplicações de adminis. Admin e Manager. ços (service) que são conjuntos de conec- na porta 8080 e o conector mod_jk na porta Vamos iniciar pelo Tomcat Manager. A forma (para mais detalhes sobre esse tema. e então evitar a necessidade de reiniciar o rências e how-tos para servidor. com refe. e reinstalada. mas imediatamente. sem roles=”manager. A documentação em formato aplicação for instalada como HTML fornecida com o Tomcat é bastante um subdiretório de webapps. Figura 4.0.sh (ou na Edição 4).0. tores (connector) associados ao mesmo 8009. pa. ficar on-the-fly as configurações do Tomcat. Deve haver um usuário com hierarquia encabeçada pelo elemento ser- shutdown. baseada em requisições mas não é necessário definir contextos esteja utilizando a porta 8080 (ou desabilite HTTP. mas a segunda janela não. seguidos pelo link “Tomcat Do. a URL http://127. Esta (host. 17:50:24 .indb 19 3/4/2003. o role “manager” para a aplicação Manager vidor (server). Cada container de inicialização do servidor (Figura 1). que representa a JVM onde rio bin. veja o O principal arquivo de configuração do recomendada de se encerrar uma instância artigo sobre segurança em aplicações web Tomcat é conf/server.xml como veremos adiante.role1”/> APIs de servlets e JSP. se a cumentation”.xml.xml para permitir o acesso a aplicações de administração (modificações em negrito) (Figura 3).bat) também presente no diretó. aplicações web no Tomcat cat basta abrir. (re)iniciar ou recarregar aplicações mais contextos (context).

The mapping for the invoker servlet --> HttpServletResponse res) <servlet-mapping> throws IOException. Por isso modifico import javax. Servlet: Hello. primeira envolve o elemento host tório é webapps na configuração padrão. Tomcat Admin.. modifi- Em cada nível da hierarquia server/ cando o atributo unpackWARs de service/engine/host/context podemos “true” para “false”. Tendo em mente a hierarquia de elemen- <Host name=”localhost” debug=”0” tos configurados pelo Tomcat.indb 20 3/4/2003. não há nada específico para ele no pw.text. de pacotes WAR não surtirá efeito. <?xml version=”1. <web-app> <display-name>Hello</display-name> Caso sejam utilizados recursos adicio- <description>Exemplo de aplicação web mínima</description> nais previstos no J2EE.com/dtd/web-app_2_3. PrintWriter pw = new PrintWriter (res. <url-pattern>/servlet/*</url-pattern> pw. Este dire.println(“<H1>Servlet Mínimo<HR></H1>”).util. a configuração de modo a fornecer um import java.println(“<BODY>”).0” encoding=”ISO-8859-1”?> Em princípio.java.println(“<P>Também temos uma versão “). primeira instalação. pw. mapeamento de URL) sejam acessíveis pela <hr><center> Leia <a href=”http://www.getOutputStream()).getDateInstance().DateFormat. e JSP.xml J2EE SDK). o valor padrão “true”.sun.Date. Também não é necessário baixar } nenhum pacote ou SDK externo (como o Listagem 4.servlet.java tamento. conf/web. comentando a entrada abaixo no arquivo import java. pw.xml. pw.format(new Date ())).jsp padrão para as entradas não especificadas <%@ page import=”java.*.println(“</HTML>”). torna-se appBase=”webapps” unpackWARs=”false” fácil especificar configurações de rede ou autoDeploy=”true”> de segurança do servidor. 17:50:25 . baseado no Struts 20 Java Magazine • Edição 6 jm6-book.DateFormat” %> no arquivo WEB-INF/web.xml: public class Hello extends HttpServlet { public void doGet (HttpServletRequest req. restrições de autenticação (realm) e filtros pois o Tomcat irá sempre utilizar a de conteúdo baseados em IP ou em outros versão descompactada durante a critérios (valve). configurações de logging (logger). com auxílio da documentação de referência fornecida. A segunda modificação é no Figura 5. </center> O Tomcat fornece um servlet chamado </body></html> “Invoker” que implementa esse compor- Listagem 3. pw. Como o Tomcat é a implementação de pw. mapeamento padrão para o Invoker.br”>Java Magazine</a> URL /servlet/<nomeCompletoDaClasse>.http. Inc. que fornece valores Listagem 2. Descritor de deployment web.com. Se for mantido definir recursos JNDI (resource e environ.jsp\”>JSP</A> desta mesma página”).Date.close()./index.text.getDateInstance(). como mail. desenvolvimento de aplicações web em pw.setContentType (“text/html”).javamagazine.jar ao classpath.flush(). Página JSP: index. <!-. no arquivo conf/server.println(“</BODY>”).jar para o appBase do element host determina um Pessoalmente.*. } Java. </servlet-mapping> pw.format(new Date ()) %> <P>Também temos uma versão (aqueles para os quais não foi definido um <a href=”servlet/Hello”>Servelt</a> desta mesma página.Java Livre arquivo conf/web. tudo o que devemos fa- <!DOCTYPE web-app PUBLIC “-//Sun Microsystems. pois o Tomcat fornece todas as APIs necessárias.xml das apli- <html><body> <h1>Aplicação Web mínima<hr></h1> cações hospedadas.println(“<HTML>”).3//EN” zer para compilar servlets é adicionar o “http://java. mas ele está desabilitado na configuração padrão.io.xml. des- import java.//DTD Web Application 2. import javax.util. A especificação de <P>Hoje é dia servlets determina que servlets anônimos <%= DateFormat.println(“<P>Hoje é dia “ + Aplicações web para o Tomcat DateFormat. costumo fazer diretório no qual qualquer arquivo WAR ou duas modificações na configura- diretório seguindo a mesma estrutura será ção padrão do Tomcat para um automaticamente ativado e associado a um ambiente de desenvolvimento.*. referência das especificações de servlets pw. deve-se adicionar </web-app> também os respectivos pacotes fornecidos no mesmo diretório.dtd”> pacote common/lib/servlet. a atualização ment).println(“<A href=\”.servlet. A contexto criado dinamicamente. ServletException { <servlet-name>invoker</servlet-name> res.

war • Utilizar o Tomcat Manager 0 Sun Mar 09 22:04:58 BRT 2003 META-INF/ Nas duas primeiras opções. A aplicação será associada ao con. Alta Books. vamos criar uma Vários outros artigos da Java Magazine apresentadas pelo autor em congressos como a COM- aplicação web mínima com o Tomcat. Crie e configuração do Tomcat e na decisão de também abaixo dele o subdiretório adotá-lo ou não. do seu pacote WAR com o comando jar no Eclipse. 17:50:27 . Compile a classe Hello.org Figura 6.ubeans. Teste a aplicação clustering Figura 7.redhat. certificações Java. www.0. O Eclipse utiliza o Tomcat para fornecer • Criar um subdiretório em webapps se. prin- qualquer o subdiretório hello. Crie em um diretório isso nosso objetivo neste artigo foi.xml nager). que fornece um porte para aplicações Manager ou Admin (Figura 7).1: sources. portanto não há necessidade de ajustes no jakarta. desenvolvimento ou produção. www.html por esse comando para o subdi.”. 330 Sun Mar 09 17:53:30 BRT 2003 WEB-INF/web.. por Edição 6 • Java Magazine 21 jm6-book. Site do projeto MingW. que cipalmente. confirme que o Tom- presentes apenas para uso por IDEs. Crie os arquivos hello/index. WAR. que inclui o Tomcat o “.sourceforge.jhu.java (note que ela está no pacote default.sun.javamagazine. que fornece instruções e JavaMail e activation.0. Configuração e limitações do Tomcat para nicie o servidor. Sua página pessoal em Exemplo de aplicação ou a separação física da camada web.jar.indb 21 3/4/2003. Este plugin resolve o problema.jsp.0.apl. exemplificando tanto servlets como pá. www. Windows do GCJ. $ jar tvf hello.jsp www. 3 e 4. Linux e Microsoft.html divisão pela barra invertida em Sobre o arquivo de configuração do Tomcat sistemas Windows). em ambientes de classes de servlets.0.war será associado e capaz de atender às necessidades de uma é consultor independente e detentor de várias à URL http://127.zip possamos recarregar a aplicação pelo Ma.java e hello/WEB-INF/web.apache. especialmente antigo do software livre e autor do livro “Java em quando não é necessário o suporte a EJBs GNU/Linux” pela Ed.com/pub/a/onjava/2002/07/31/ (Lembre-se de trocar a barra de tomcat.theserverside.sourceforge. Página JSP da aplicação mínima classpath desde que este contenha Site do projeto Jakarta.com/resources/articles/ Copie o arquivo hello. 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. – a estrutura deve estar de acordo com a help on-line.lozano.br/downloads deverá ser reiniciado (embora na segunda 0 Sun Mar 09 17:51:46 BRT 2003 WEB-INF/ /jm6/jm6-flozano-tomcat. Conclusões ciado à URL http://127.war * www. como cat reconheceu a aplicação visitando as mingw.com/tomcat retório webapps do Tomcat e rei. compilador Java nativo Há três formas de realizar o deployment Verifique nos arquivos de log do Tomcat de uma aplicação web no Tomcat: no subdiretório logs alguma indicação da blueskytime.eti. semelhante à exibida na Figura 6.war gerado Tomcat/article.1:8080/examples O Tomcat é um container web poderoso Fernando Lozano (fernando@lozano.com/rhug 8080/hello para obter uma página Site do projeto RHUG.onjava. o Tomcat 71 Sun Mar 09 22:04:58 BRT 2003 META-INF/MANIFEST.xml conforme as Listagens 2.eti.com. Tutorial tado de dentro do diretório hello: Tutoriais sobre servlets e JSP jar cvf . que representa o diretório java. Alguns pacotes estão Se algo der errado.class sem a extensão ou o nome do diretório.jar para o Java Activa.1:8080/app.br contém os slides de várias palestras Para encerrar o artigo.edu/~hall/java/Servlet- com o comando a seguir. É um ativista vasta gama de aplicações. mas não fornece uma maneira para guindo a mesma estrutura de um pacote seguinte listagem: rodar suas próprias aplicações no Tomcat incluso. As- sim o diretório webapps/examples está asso. orientar o leitor na instalação será a raiz da aplicação web.com/j2ee/tutorial atual) e monte um pacote WAR www.MF 384 Sun Mar 09 21:47:44 BRT 2003 index. volvimento de aplicações web em Java. execu./hello.java texto cujo nome é o nome do pacote WAR 1371 Sun Mar 09 17:55:02 BRT 2003 WEB-INF/classes/Hello. Aplicação mínima reconhecida pelo Tomcat Admin visitando a URL http://127.net jasper-compiler. sozinho ou em conjunto WEB-INF/classes para hospedar as com outros servidores. hello/WEB-INF/classes/Hello. ginas JSP.0.0. DEX-SUCESU e o One Day Java.br) e o pacote webapps/app.net • Copiar um pacote WAR para o diretório causa do problema e confira a estrutura Plugin para desenvolvimento de aplicações web webapps. apresentam os primeiros passos no desen. binários para compilação nativa do Tomcat tion Framework (JAF).

Aplicações para internet geralmente têm plementados usando tecnologias de trans. a característica da Connector e nove interfaces: Connection.br?ed=5&imp=1”). fatores recursos de conectividade existentes no a rede de uma operadora de telefonia celular é bastante como a cobertura de sinal.jm. vel para o usuário. Em alguns O Generic Connection Framework (GCF) HttpConnection c1 = (HttpConnection) Connector. positivo MIDP 2 deve ter suporte a HT- serviços residentes em servi. transmissão a partir da origem até o início O Generic Connection Framework HTTP: do seu recebimento pelo destino. HttpConnection . principais são: CSD (Circuit-Switched Data). Serial: transmitida em uma única conexão. Fatores como a cobertura de sinal. No redes de telefonia celular.baudrate=9600”. Para aplicações MIDP. isso envolve fatores como maneiras de realizar o tráfego de dados.microedition. existem várias URL registrada anteriormente.168. além de boas práticas que usamos normalmente tratamento diferenciado do suporte a certificados e técnicas de otimização.3:7070”).open( largura de banda pode ser definida como UDP. StreamConnectionNotifier e Stream- transportados grandes volumes de Connection. a eventos de conectividade. Na rede conexões seguras (pacote MIDP e a internet da operadora. TCP (Sockets): gasto na transmissão da mensagem. • Suporte à tecnologia push – pode-se funcionalidades de pesquisa e envio de missão wireless. um MIDlet pode ser invocado ao em aplicações para telefones celulares e ou. já es. antenas. sem no entan. “socket://192. com uma alta latência de rede o grande • Implementação de HTTPS – todo dis- MIDP é a comunicação com tempo de resposta pode tornar-se inaceitá. serão mostrados os É importante destacar que opcional). o framework inclui a classe “comm:0. A latência de rede é determinada pelo Speed Circuit-Switched Data). isso era dores. o que não é o caso para aplica. No MIDP 1. Essas interfaces definem suporte dados. Em receber uma notificação originada de uma tros dispositivos com suporte a J2ME. por unidade de tempo. além e formatos de dados. OutputConnection . conectividade no novo MIDP são: U m recurso crítico para aplicações da. Datagram. que devem poupar a bateria HTTP e TCP (cliente e servidor). Con tentConnection. 17:50:30 . Input- é necessária apenas quando são Connection . por funcionalidades também são importantes alta latência exigem tratamento diferencia. para conexões seriais. O GCF reside no pacote javax. a latência pode ser maior do que o tempo Oferece suporte a vários protocolos de co. TPS (no MIDP 1. cobrindo protocolos TCP/IP convencional (a e alta latência exigem ce SecureConnection).open( casos. para acessar a internet em pelos protocolos para a autenticação de casa e no trabalho).7. (Cellular Digital Packet Data) e HSCSD (High. E sete interfaces. Veja a seguir alguns exemplos de cone- tempo transcorrido desde o início de uma xões com o GCF.indb 22 3/4/2003. entre eles HTTP/HTTPS. é a API J2ME padrão para conectividade. Como se pode deduzir a partir dos exem- 22 Java Magazine • Edição 6 jm6-book. As • Suporte obrigatório a OTA (Over The a escolha de protocolos de comunicação. 2 também disponibiliza CLDC/MIDP usando o Generic Connection suporte a conexões TLS.io. largura de banda e GPRS (General Packet Radio Service). Já a municação. do pelos protocolos de comunicação. Neste artigo. os protocolos têm de ser im. a quantidade de informação que pode ser to se ater a implementações específicas.READ).com. datagramas (UDP). do dispositivo e operar com restrições de No MIDP 2 são adicionadas uma classe e memória e capacidade do processador. passando por satélites e registrar aplicações MIDP para responder mensagens interagindo com serviços lo. Java de Bolso Conectivida d Interoperabilidade com s Uma grande largura de banda DatagramConnection . As principais novidades em mesmo que haja uma boa largura de ban.open( tabelecida.pki). e infravermelho. Framework (GCF) e as situações em que diferente de uma rede grandes taxas de erro SSL e WAP/TLS (interfa- cada recurso se aplica.microedition. TCP. InputConnection c3 = (InputConnection) Connector. O GCF no MIDP Na rede celular. Connector. mesmo que a calizados em outras máquinas. serial. As mesmas áreas de sombra. Air) – pode-se realizar o download de apli- formatos de dados. StreamConnection c2 = (StreamConnection) Connector. “http://www. meio wireless. CDPD cações MIDP (usando WAP) para o telefone latência de rede. como na comunicação via satélites. javax. através da rede wireless. rede mais importante é a baixa latência. grandes taxas de erro e máquina virtual Java não esteja ativa. ções móveis. exemplo.

int) e que devem ser configurados parâmetros rença. escrita (WRITE) ou leitura/escrita (READ_WRITE) – este último é o padrão. Content-length binários Nos próximos exemplos enfatizamos os conectores baseados em HTTP (HttpConnec. 17:50:34 . O método open possui mais três versões. parâmetros da solicitação. sem que antes precisem passar gurados no estado de configuração. São caso da implementação de referência da por um parser. Sony-Ericsson e HP) implemen. por exemplo que a conexão ainda não está estabelecida para criar os objetos implementadores TCP. sições e respostas podem ser entendidas Os parâmetros HTTP devem ser confi- que é instanciada utilizando reflection. uma IOException. boolean). Connection Com conexões persistentes. SSL/TLS (SecureCon. e closed.class.j2me.<parâmetros> Nokia. de telefonia celular ou através de gateways (assim como em WAP).io. no protocolo especificado. Utilizado quando uma aplicação MIDP será instalada por OTA. em no mundo J2SE/J2EE não fazem muita dife- anteriores: open (String). por se Vamos discutir alguns pontos do código.Protocol. Siemens. pois trafegam depois de entrar no estado closed. a implementação desses dos e uma resposta é aguardada. mas no J2ME importam muito. em Essa URL é utilizada pela classe Connector tam protocolos adicionais. os parâmetros da solicitação foram envia- são consumidos pelo objeto xxxConnection verSocketConnection). O nome de dados em formato binário. (também conhecida como conexão persistente ou keep-alive). O argumento in- teiro determina o modo de acesso: leitura Cabeçalhos HTTP (READ). O único protocolo obrigatório em qual- Edição 6 • Java Magazine 23 jm6-book. Integração de aplicações a de com MIDP J2ME/MIDP com serviços de rede através do Generic Connection Framework m serviços externos CLÁUDIO MIRANDA plos. protocolos continua sendo opcional. Caso contrá- cificação é opcional. No por pessoas. tratar de um protocolo de requisição/ Esteja atento para pequenos detalhes que duas delas apresentadas nos exemplos resposta (request/response) sem estado. onde o servidor já enviou mensagens para As implementações do Generic Connec.sun. rio. Motorola. mas alguns fornecedores (como Uma conexão HTTP (representada por <protocolo>:<endereço>. o servidor fecha a conexão ao fim de cada resposta enviada ao cliente. Os parâmetros xões seriais (CommSerial). especificados depois do ponto-e-vírgula nection) e sockets no lado do servidor (Ser. e possui algumas peculiaridades. open (String. O User-Agent Informa o tipo de cliente que está se conectando ao servidor HTTP argumento booleano ativa um tempori- Indica o formato do conteúdo enviado além da URL e deve ter a codificação zador (timer) interno da implementação Content-type x-www-form-urlencoded para método POST. A implementação Indica se a conexão com o cliente deve ser reutilizada entre várias requisições dos demais protocolos previstos pela espe. O servidor tion e ContentConnection).cldc da comunicação com um servidor HTTP Listagem 1. específico. dece ao seguinte esquema: o HTTP. em três estados: setup (configuração). infravermelho e UDP.http. especialmente no caso de dados da conexão seja excessivo. A implementação de usa esses cabeçalhos junto com User-agent para saber qual a versão do Accept-Language CLDC/MIDP e o idioma/país suportados pelo dispositivo. para simplificar o apenas mensagens textuais – não há troca tentativa de reuso da conexão provocará carregamento dinâmico de classes. open (String . fazendo que uma HTTP pode ser diretamente sobre a rede aplicação customizada possa ser instalada automaticamente. do protocolo é incluído no nome da classe. a URL passada como argumento obe. connected. um objeto do tipo HttpConnection) pode estar Symbian. int. Jeode. . qual a conexão com o servidor está ativa. o nome da A interface HttpConnection do GCF trata “Content-Type”. a não ser que sejam enviados – com isso uma exceção será lançada caso arquivos anexados no padrão MIME o tempo transcorrido no estabelecimento Indica o tamanho dos dados enviados. comparação com os outros. HTTPS. O protocolo HTTP é bastante fácil em o cliente e fechou a conexão. IBM-J9. quer implementação de CLDC/MIDP é antes da conexão ao servidor. Apesar com o servidor e podem ser definidos os da interface Connection especializados no de o MIDP 2 já definir interfaces para cone. cabeçalhos HTTP como: “User-Agent” e Sun (o J2ME Wireless Toolkit).indb 23 3/4/2003. se várias conexões ao mesmo servidor forem estabelecidas em um breve espaço de tempo. Observe que tion Framework seguem uma nomencla. haverá ganhos de tempo e de Protocolos e HttpConnection bateria caso a conexão seja reutilizada. qualquer tura de pacotes padrão. E as requi. Observe o exemplo na classe para o protocolo HTTP é com.

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

nipulação de documentos XML com Java 04: public void deserialize(byte[] b) throws IOException. Schema (documento XML que descreve boolean b = dataIn.writeUTF(endereco). 22: dataOut. mas existem bibliotecas que 10: static final byte TOKEN_FIM = 51. tags. como planilhas eletrônicas. a conexão e a transferência XML Listagem 2. 14: ções wireless Java. o tempo considerado ideal. 39: if (b!= TOKEN_FIM) { rápido melhor”. 05: } podem ser vistos no artigo “Processando 06: XML em Java” (Edição 2). origem) e efetuar a sua leitura novamente Em MIDP. 25: return byteOut. é im- substring e indexOf. DataOutputStream dataOut = //. estabelecer limites para sabermos até onde 41: leJavamagazine = false.flush(). 26: } 27: 28: public void deserialize(byte[] data) throws IOException { Desempenho e tempo de resposta 29: ByteArrayInputStream byteIn = new ByteArrayInputStream(data).writeByte(TOKEN_INICIO). ou melhoram a experiência do Edição 6 • Java Magazine 25 jm6-book. 23: dataOut.writeInt(5). Esse mecanismo é capaz disponível no dispositivo.readBoolen(). Entretanto. 11: public String nome. para reduzir o número de leituras limitado para não comprometer o espaço aconselhável apontar esses objetos para null do mesmo dado.writeByte(TOKEN_FIM). tratar XML. 31: byte b = dataIn. No MIDP. podem ser usadas como a kXML e a Nano.readBoolean(). 19: dataOut.indb 25 3/4/2003. o mais cedo possível. foi efetuada a leitura. salvo em situações onde 21: dataOut. 43: } 44: } duzem os tempos resposta em aplicações 45: } MIDP.toByteArray(). não se determinar qual 35: nome = dataIn. estar atentos ao que queremos melhorar e 32: if (b!= TOKEN_INICIO) { a qual é o tempo de resposta aceitável. reúno algumas dicas que re. armazenar conteúdo binário.readUTF(). Exemplo de classe “manualmente” serializável de acessar um documento XML: através de SAX (Simple API for XML) ou DOM (Docu. obter um DataOutputStream int i = dataIn. 07: public class Pessoa implements Serializer { 08: Em MIDP não há uma API padrão para 09: static final byte TOKEN_INICIO = 33.readByte(). 36: endereco = dataIn. ao usar XML em aplica. tuada com base em timestamps de quando Cache de dados A aplicação MIDP deve implementar a ló. devemos 30: DataInputStream dataIn = new DataInputStream(byteIn). mas tem a usuário (concentrando-se em operações (sincronização de dados com a origem). A seguir. atributos e tipos permitidos). Não recomendo o uso intensivo de 20: dataOut. mas apenas 37: leJavamagazine = dataIn.readUTF(). conversão de tipos etc. Java. 42: throw new IOException(“Inconsistência na desserialização.writeUTF(nome).. obter um DataOutputStream dataOut. mento com a coleta de lixo e o consumo de 18: DataOutputStream dataOut = new DataOutputStream(byteOut). como os 24: dataOut. os custos de processa. Com String s = dataIn. os dados são modificados. No entanto. formatos textuais delimitados. mum. Ao pensar em desempenho. ativado quando formato de dados utilizando métodos como rede.. existem basicamente duas maneiras Listagem 3. XML podem ser validados usando um DTD // Leitura (Document Type Definition) ou um XML DataInputStream dataIn = //. 17:50:36 . Serialização “manual” de objetos (métodos get/set omitidos) Um documento XML é muito simples de // Escrita entender – segue uma estrutura hierárqui. Detalhes sobre a ma. 16: ByteArrayOutputStream byteOut = new 17: ByteArrayOutputStream(nome..length() + 3). apresentados anteriormente. sagens em formatos mais simples. a verificação de cache é efe- aplicações. 03: public byte[] serialize() throws IOException. vantagem de ser simples e aceito por várias relacionadas à conectividade) Normalmente.writeBoolean(true). 33: throw new IOException(“Inconsistência na desserialização. Mas observe que esse pro. deve-se levar em conta 15: public byte[] serialize() throws IOException { o espaço ocupado. de modo a economi.. portante que seja definido um mecanismo portante que o cache tenha seu crescimento cesso gera vários objetos temporários – é de cache. É co. Documentos dataOut. 12: public String endereco. é im. vale a pena investir nessa área.writeUTF(“isto eh um teste”). XML com MIDP. 13: public boolean leJavamagazine. ao buscar aumento de desempenho 34: } em uma aplicação.length() + endereco. token inicial:” + b).readInt(). token final:” + b). energia. de saber quando um dado está “sujo” (de- zar recursos do dispositivo consumidos no satualizado em relação ao mesmo dado na Thread para operações assíncronas processo de coleta de lixo. e em um mecanismo gica de leitura/escrita específica para cada Para minimizar operações de conexão de de notificação do servidor. ca evitando a repetição de dados e permite dataOut.writeBoolean(leJavamagazine). não seja possível realizar a troca de men. 01: public interface Serializer { 02: ment Object Model).readByte(). estabelecer como objetivo “quanto mais 38: b = dataIn. parsing.readUTF(). é necessário 40: nome = endereco = “”. XML.

mesmo porque mos. uma consulta à fatura de um cartão de crédito) quantas conexões são necessárias Testes de disponibilidade Cláudio Miranda (claudio. de progresso como o Gauge do MIDP. mas podemos A construção de aplicações MIDP envolve segundos. é consultor da Summa Technologies.com/products/midp recursos limitados do dispositivo. de proxy do MIDP. evite criar mais que duas www. O indicador pode ser atualizado com Transport Layer Security (TLS) 1. mais que 3 segundos). mos delegar a consulta para um serviço por exemplo).ietf.zip necessite se conectar com servidores em plo.txt ativas concorrentemente. Mas.txt É importante que.javamagazine. “20 de 135”).com. pois. Outra situação ocorre quando a aplica- locar a operação de conexão em uma thre.indb 26 3/4/2003. não temos muita disposição para es. lizada para o usuário. que quebre Connected Limited Device Configuration (CLDC) os dados em pedaços mais adequados aos uma conexão é efetuada para buscar dados java. por exemplo. Já no desktop. estão ativos e funcionando corretamente ou baixa largura de banda ou alta latência. Freqüentemente é necessário extrair dando por uma operação que não poderá perar por operações demoradas. Hypertext Transfer Protocol (HTTP) 1. palestrante em vários eventos sobre a tecnolo- aplicação possa verificar se os recursos ne. Essas são operações de Conclusões ria se houver uma demora maior que dez alto custo para o dispositivo. temos controle. se existe espaço suficiente no dispositivo.com. No mundo dados de documentos HTML/XML for.ietf.txt algumas implementações da JVM têm um indicador de que a operação esteja em User Datagram Protocol (UDP) restrições quanto ao número de threads processamento e não travou ou foi cance.sun. certificado em minimizar as operações de rede em proces. a rede pode ter apenas uma conexão de rede. 17:50:37 . to- e quase nem percebemos as demoras. www. Com nossos equipamentos móveis e pes- Uso de serviço de proxy Assim o usuário não perde tempo aguar- soais.1 sejam instantâneas (com duração de.miranda@uol. es. ser finalizada.com/products/cldc cluída. lada. ao usuário uma experiência agradável. de que a operação foi con. para tarefas que não threads nos seus aplicativos para não exi. gia e moderador da lista J2ME do SouJava.br). ção MIDP consulta um serviço que retorna ad separada e notificar o usuário (usando uma grande quantidade de dados.org/rfc/rfc2616. podemos garantir No caso de operações de longa duração a aplicação MIDP. que usem conectividade.0 base na porcentagem efetuada da tarefa. para chegar ao resultado final? Podemos Antes da aplicação MIDP ser disponibi. Isso normalmente ocorre quando servidor sob nosso controle. Indicador de operações demoradas Além disso. é importante co. seja mostrado www. e deixá-los em um formato mais leve para mando alguns cuidados. ou Minimização de conexões de rede em números que indiquem a quantidade www. wireless. Pode- uma barra de status ou caixa de diálogo. sos “batch”.Java de Bolso de dados não são operações rápidas. ou ainda um aviso gráfico uma operação do usuário (por exemplo. não é incomum situações em que necidos por serviços sobre os quais não o usuário desista de uma transação bancá. /jm6/jm6-cmiranda-j2me. localizado em outro java.ietf. diga- gir muito do dispositivo.org/rfc/rfc768. é conveniente que a Java. em servidores e escrever registros usando Mobile Information Device Profile (MIDP) RMS – Record Management System. possam ser executadas de uma só vez em cessários estão disponíveis – se servidores como visto anteriormente.br/downloads No ciclo de vida de uma aplicação que processada com relação ao total (por exem.sun. fazendo com que várias tarefas 26 Java Magazine • Edição 6 jm6-book. usar um servidor sob nosso controle para considerações que não são necessárias em tamos acostumados a esperas mais longas efetuar previamente a extração dos dados aplicações desktop ou de servidor.org/rfc/rfc2246.

indb 27 3/4/2003. Edição 6 • Java Magazine 27 jm6-book. 17:50:53 .

Preço: <%= ((database.0 e apontar Para manipular objetos dessa forma é e finalizar um pedido.1. adicionar livros à cesta de compras talhes as novidades do JSP 2.ArrayList. 17:51:05 .price} Vamos explorar os novos recursos ana- As expressões entre ${ e } são analisadas lisando uma parte do exemplo BookStore. no quadro “Primeiros passos” como fazer EJB 2. Até o JSP 1. vamos explorar com de. o contextos (page. A Figura 1 mostra algumas boas práticas para o uso dos novos preciso seguir o padrão JavaBeans. JMX. Por Java dentro da página JSP). aumentando o nível de “[]” (colchetes). a linguagem de Language – EL) melhora bastante a sintaxe expressões defi ne dois operadores: “. lançamento previsto para o meio No exemplo. ve "book" é procurado num dos possíveis mentação de referência do J2EE 1. com um construtor vazio e métodos get e set Facilidade de programação para leitura e escrita dos atributos.indb 28 3/4/2003. o preço do livro com Figura 1.4 – com distribuído com o J2EE Tutorial Addendum. Já no caso dos livros estarem armazena- o preço do livro poderia ser exi.getPrice() %> significativa nos recursos para cria- Com a introdução da EL. session ou application).4. os objetos devem ser definidos em classes pela página bookcatalog. veja o primeiro artigo desta – onde XXX é o nome da propriedade na com as funcionalidades de exibir a lista de coluna.util. o uso mais indicado para os col- – exceto em scriptlets (código chetes é no acesso a listas indexadas. Um semelhantes. Linguagem de expressões O objetivo principal da nova especificação Para o acesso a atributos de objetos A linguagem de expressões (Expression JSP é melhorar a legibilidade do código e e elementos de listas.4 variáveis como argumentos. operador “. Usando esse inclui um analisador de expres- operador.Map. request.jsp.util. imagine que chamado allBooks no request. esse código pode ção de bibliotecas de tags (tag libraries ser reduzido para: ou taglibs).0 (para uma visão geral das novida. detalhar um determina- Nesta edição.BookDetails (que representa a entidade “Livro”) Preço: ${allBooks[0].4 – veja vidades. A próxima versão do J2EE 1. As expressões podem ser escrito da seguinte maneira: usadas em qualquer lugar da página – misturadas ao código Preço: ${book[“price”]} HTML ou em atributos de tags Porém. jetos usando introspecção. Exemplo BookStore: livros disponíveis (lista reduzida) bido da seguinte forma: chave “001” poderia ser lido assim: 28 Java Magazine • Edição 6 jm6-book. na Edição 1).BookDetails) Isso é alcançado com uma melhora request. um determinado livro.2.4 O analisador de expressões então traduz o a instalação. em tempo de execução pelo container web. exemplo.getAttribute(“book”)). Servlets 2. Preço: ${book. e com a introdução de uma linguagem de expressões.” (ponto) em métodos getXXX A aplicação consiste numa livraria on-line des do J2EE 1. expressão – e navega na hierarquia de ob- livros disponíveis. dos num java. Deployment API. do livro. imagine que exista um atributo Por exemplo. gerada recursos. Os dois têm aplicações abstração dos comandos. e JSP 2.” e do JSP. Além das Fronteiras Novidades Expressividade e abstra ç facilitar a manutenção das páginas. Va- O preço do primeiro livro da lista poderia mos supor que um objeto da ser lido dessa forma: classe database. contendo uma precisamos exibir o preço de coleção de BookDetails do tipo java. a listagem dos livros disponíveis. ou seja.price} é passado para o JSP como um atributo do request. porém “[]” permite o uso de container web do novo J2EE 1. como o suporte a web services. o exemplo anterior poderia ser sões. o objeto representado pela cha- O exemplo roda na versão beta da imple- desse ano – inclui uma série de no.

semelhante a um JSP convencional feita através de objetos implícitos: • param – usado para acessar parâmetros do request.4 através do comando deploytool e abra o exemplo. A aplicação já pode ser acessada request e no header. A leitura é ${10 mod 3} . O Além de acesso aos JavaBeans. tipo Author. No diretório indi- applicationScope. usados para tutorial\examples\web\bookstore e digite %J2EE_HOME%\doc\tutorial\examples\ obter arrays de Strings com múltiplos o comando ant -create-book-db. quando solicitado. da requisição. para evitar que a classe BookDetails tenha um atributo do válidas: confusões. tore3 (são quatro exemplos BookStore). entre no diretório o tipo de browser do cliente. 6 e 7. apontando para o diretório de build. foram defi. web\bookstore3\build\META-INF.war. Para servidor (host) onde a aplicação executa. nome.tag. A versão usada no exemplo foi a BookS- cabeçalho da requisição HTTP. Por exemplo. %J2EE_HOME%\doc\tutorial\examples\ ${header. como o 1.ID}. por mando cloudscape –start.xml que se encontra no diretório: paramValues e headerValues. obtém o valor do parâmetro com servidor J2EE. s do JSP 2. Para criar a base de dados do exemplo. requestScope. 8. 6. Inicie a ferramenta de deploy do J2SDKEE do seu nome.4 (J2EE 1. respectivamente.4) e do J2EE Tutorial compilar essa versão.0 a ção no novo JSP JÚLIO CÉSAR LINS Preço: ${allBooks [“001”]. Usando a linha de comando.author.defaultLocale}. de bibliotecas de tags sem o uso de código nidas novas palavras-chave equivalentes Java. Inicie também o 1.price} Operadores Apesar de essas novas palavras-chave A linguagem de expressões também serem bastante intuitivas. deploy e. tendo por sua vez um atributo firstName do tipo String. o cabeçalho HTTP.0 padronização da JSTL. Pronto.ultimoAcesso} aces. digite o comando ant package-bookstore.jsp objetos pageScope. lógicos e idéia evitá-las. Nova linguagem de expressões. arquivo bookstore3. sessionScope e do exemplo BookStore. Clique o botão de nome “defaultLocale”. usando os 5. As seguintes são expressões já usados na linguagem Java. Defina a variável de ambiente J2EE_ web\bookstore3 e digite o comando ant • cookie – retorna um cookie a partir de seu HOME. a variável de ambiente PATH para incluir o %J2EE_HOME%\doc\tutorial\examples\ cesso”. obtidos através banco de dados Cloudscape. 2. 17:51:14 . o campo ID de um Primeiros passos formulário submetido poderia ser acessado usando ${param. inicie o de bookstore3. instalação do J2EE 1. Com ele é possível pelo endereço: Também é possível acessar JavaBeans pular os passos 5.host}. siga estes passos: cado anteriormente. a lingua- conjunto de expressões a seguir tem o o uso de outras tags dentro do corpo da tag gem de expressões também facilita a leitura mesmo efeito do anterior: definida e não requerem conhecimento da de informações tais como os parâmetros ${100 eq 100} linguagem Java. http://localhost:8000/bookstore3/ num contexto específico. cookies ${5 lt 10} Um Tag File é um arquivo com extensão e parâmetros de inicialização. web\bookstore3\build e chame o arquivo • initParam – dá acesso aos parâmetros de 3. • header – para acessar informações do P ara instalar e executar o exemplo apresentado nesse artigo. 4.4. Permitem aos operadores lógicos e relacionais. Edição 6 • Java Magazine 29 jm6-book. usando o comando j2ee. inicialização da aplicação. fragmentos JSP e tag files são algumas extensões na versão 2. Por exemplo: Addendum e instale-os (veja referências). Configure também 7. O próximo passo é compilar os arquivos bookstore.firstName} Além disso. Supondo relacionais. O primeiro nome ${100 == 100} ${5 < 10} Tag Files do autor seria exibido assim: ${10 % 3} Os Tag Files permitem a implementação Nome: ${book.war.indb 29 3/4/2003. diretório %J2EE_HOME%\bin. São arquivos XML contendo a defini- Objetos implícitos ção e o comportamento das tags. com o co. valores para parâmetros contidos no Nota: o arquivo WAR do exemplo pode ser 9. Compacte o conteúdo do diretório sa o cookie criado com o nome “ultimoA. baixado do site da Revista. Faça o download Java 2 Enterprise Edi. ou tion SDK Beta 1. Por exemplo. é uma boa A leitura de atributos também é permitida suporta operadores aritméticos. ${initParam. optando pelos operadores para vários níveis de hierarquia. abra o arquivo Existem ainda os objetos implícitos entre no diretório %J2EE_HOME%\doc\ sun-j2ee-ri. curiosamente. ${cookie.

Observe as declarações sendo fei.Declara os atributos recebidos --> quatro bibliotecas: <%@ attribute name=”bookDB” required=”true” rtexprvalue=”true” type=”database. <%@ variable fragment=”onSale” name-given=”origPrice” %> <%@ variable fragment=”onSale” name-given=”salePrice” %> • Internacionalização (I18N Capable Formatting) – tags usadas para formação <center> <table> de textos.Declara o uso de uma variável --> <%@ variable fragment=”normalPrice” name-given=”price” %> – tags utilitárias para processamento de <%@ attribute name=”onSale” fragment=”true” %> XML. o valor de um atributo na chamada de </c:otherwise> uma tag pode ser o resultado da avaliação </c:choose> &nbsp. na forma de porções de código JSP variáveis podem receber valores através de (usando a nova ação jsp:attribute) e podem parâmetros passados na execução do frag. recebidos e nas variáveis utilizadas.onSale}” > à parte – aqui vamos nos concentrar na <!-. a única restrição é não poder usar das ações <jsp:invoke> e <jsp:param>.4 já <!-. sões. Com isso. A <%@ taglib uri=”/jstl-c” prefix=”c” %> JSTL contém uma série de tags bastante <%@ taglib uri=”/jstl-fmt” prefix=”fmt” %> úteis na programação JSP.85}” /> de maneira simplificada.Define o valor das variáveis passadas para o fragmento --> <jsp:param name=”origPrice” value=”${book. usando elemen- com terminação . expressões conter chamadas a outras tags e expres. descritor web (web. O exemplo da ser incluídos em outros JSPs usando o co.3 </jsp:invoke> É importante ressaltar que a JSTL já su- </c:when> <c:otherwise> porta a linguagem de expressões quando <jsp:invoke fragment=”normalPrice”> usada em atributos de tags. que chama Com as configurações globais (Global Con- arquivo. <%@ attribute name=”normalPrice” fragment=”true” %> • Processamento XML (XML Processing) <!-.price * . a serem preenchidas pela tag chamada.xml) dentro do fragmentos devem ser salvos em arquivos As variáveis são declaradas na forma elemento <jsp-config>.Executa o fragmento “onSale” (veja declaração dos atributos) --> <jsp:invoke fragment=”onSale”> relação desta com a tecnologia JSP. <!-. das no exemplo.3. Nesse caso. a tag chamada decide qual trecho será configuração são avaliação de expressões executado dependendo do livro estar ou da EL. 17:51:15 .OMITIDO: montagem do título do livro --> para acesso a bancos de dados relacionais <c:set var=”sale” value=”${book.price}”/> </jsp:invoke> vras.Percorre os livros lidos do banco de dados --> com base na localização do usuário.OMITIDO: montagem dos dados do autor --> cursos da linguagem de expressões podem </tr> </c:forEach> ser usados num container J2EE 1. Exemplo de Tag File com a versão 1. para um conjunto de JSPs.price}”/> <jsp:param name=”salePrice” value=”${sale}”/> Expressões com J2EE 1. pois as aplicação. definição da Fragmentos não em promoção. divididas em <!-. codificação da página (encoding) e inclusão Fragmentos (JSP fragments) são porções Os fragmentos passados como argu. se o livro está em promoção --> <c:choose> A exploração do JSTL daria um artigo <c:when test=”${book.0 – pode conter código HTML.</td> de uma expressão.indb 30 3/4/2003. desde </table> que dentro de atributos de tags.BookDB” %> • Núcleo (Core) – contém tags usadas para <%@ attribute name=”color” required=”true” %> controlar o fluxo da página e a saída de <!-. JSTL A JSP Standard Tag Library (JSTL) foi lançada em julho de 2002 e é compatível Listagem 1. sem a necessidade <!-.books}”> <tr> • Acesso a dados (Database Access) – tags <!-. 30 Java Magazine • Edição 6 jm6-book.Decide qual fragmento executar verificando de código Java. de cabeçalho e rodapé. <c:forEach var=”book” begin=”0” items=”${bookDB. ferença está na declaração dos atributos scriptlets. tags.Declara um atributo do tipo fragment (que pode ser executado) --> mensagens.Novidades do JSP 2. Por convenção. que No exemplo da Listagem 2. Esse recurso acrescenta Listagem 3 faz a inclusão de um cabe- mando include do JSP. <!-. Em outras pala- <jsp:param name=”price” value=”${book. mento. Esses arquivos devem ${variável}. no J2EE 1. valores monetários e números.jspf. As opções de e <%@ variável %> na Listagem 1. todos os re- <!-. execução de scriptlets.3 do J2EE. a tag <sc:catalog> passando dois atributos figurations) é possível definir propriedades tas com o uso das diretivas <%@ atributo %> que são trechos de código JSP. de código JSP escritas para serem reusadas mentos também podem conter variáveis As configurações são descritas no dentro de uma aplicação. como ${origPrice} e ${salePrice} usa. tos <jsp-property-group>. Fragmentos também à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 esforço de codificação. e não como </center> parte do texto. Observe também na listagem o uso (em EL) e chamadas a outras tags.Declara a utilização de outras bibliotecas --> é incluída como parte da plataforma. podemos ver Configurações globais devem ser especificados no cabeçalho do um trecho do JSP bookcatalog. A di.jsp.

com suporte Jakarta Taglibs expressões para ler atributos de objetos.0 é simplificar a sintaxe.zip para formatação de data/hora.br) é consultor produzir componentes reusáveis na ca.org/taglibs Usando a JSTL.sun. Download do J2EE 1. a exibição do preço do livro mos.jsp </url-pattern> genéricos como os <include-prelude>/template/prelude. a idéia é <!-. Segundo a equipe </jsp:attribute> de componentes na responsável pela especificação.jspf da JSTL. bus- e o preço promocional em vermelho --> <jsp:attribute name=”onSale”> um grande salto e cando a sintaxe do XML.com/j2ee/download.0 JSP está se tornando cada vez mais simples </jsp:attribute> </sc:catalog> – o reuso passa a e ao mesmo tempo mais poderoso. o que limitava a O principal objetivo da nova versão JSP Edição 6 • Java Magazine 31 jm6-book. já muito usadas pela Júlio Cesar Lins (jcsl@cin.4 beta e do Tutorial melhorou a sintaxe do código. Passagem de fragmento como atributo de uma tag componente reu. Com e o Altavista.price}”/> /jm6/jm6-jlins-jsp.jsp </web-app> específicos. ao formato de sites de busca como o Google mas é necessário usar a tag <c:out>. O JSP já está chegando <!-. delegando Por exemplo.jsp <include-coda>/template/coda.sun. O projeto Apache Jakarta. a criação mentas já é bem rico. <url-pattern>/*. assim a produtividade e facilitando a ma- <sc:catalog bookDB=”${bookDB}” color=”#cccccc”> sável. Outro ser possibilidade grande salto será dado com o lançamento Listagem 3. Hoje mais nesta coluna.0) paginação de dados.JSF (veja <web-app> volvimento. independente de Java e J2EE. mas tam- </include-prelude> jcp.br/downloads Preço: <c:out value=”${book. Mailer para Reuso na camada web envio de e-mails. Em breve .html Na versão 2.indb 31 3/4/2003. já certificado pela Sun e certificado em análise e que era feita basicamente com comandos Conclusões projeto pela IBM. que permite java. aumentando Listagem 2. programador mada web era uma tarefa complicada. comunidade de desenvolvimento web. nutenção do código.org/jsr/detail/151. framework Struts. além de mudar jakarta.. 17:51:16 .ufpe. componentes.. o site jsptags.javamagazine.com essa tag..com.apache. além das bibliotecas do Antes das versões mais recentes do JSP. “inteligência” do 2. java. responsável Portal com referências para várias taglibs trada anteriormente ficaria dessa forma: pela implementação de referência da JSTL.org/jsr/detail/152. oferece Addendum a avaliação da expressão para o container e uma biblioteca de tags para a paginação de permitindo assim que qualquer biblioteca registros muito interessante. a especificação leitura de arquivos e logging.4) </include-coda> propõem a resolver </jsp-property-group> </jsp-config> problemas mais jcp. da tecnologia JavaServer Faces . include em páginas JSP. já existem diversos a dificuldade para criar interfaces web <jsp-config> .com/products/jsp/jstl de tags possa tirar proveito da linguagem navegar para frente e para trás ou acessar JSP Standard Tag Library . como DateTime www. jsptags. também é possível usar o look-and-feel da paginação. oferece várias bibliotecas. não ricas e de fácil manutenção será coisa do <jsp-property-group> somente os mais passado..Exibe o preço 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.JSTL de expressões. na Edição 3). <strike><fmt:formatNumber value=”${origPrice}” agora evolui ainda Com a incorporação de melhorias a cada type=”currency”/></strike><br/> <font color=”red”><fmt:formatNumber mais com os novos nova versão.com.0 do JSP. uma página diretamente.Exibe o preço normal do livro riscado camada web deu continuar avançando nas melhorias. o desenvolvimento web com value=”${salePrice}” type=”currency”/></font> recursos do JSP 2. Exemplo de configuração global concreta no desen.jspf bém outros que se JSR-151 (especificação do J2EE 1. como JSR-152 (especificação do JSP 2.

. claramente perceptível. } classes. i++. Conseqüentemente. Além de forçar o uso correto das classes. realizada. //. 17:51:20 . // Erro! mas não podem mudar a forma como a operação de envio é } 32 Java Magazine • Edição 6 jm6-book.. Usos de final A pesar de fazer parte de Java desde sua primeira versão. desempenho do código.. Tomando como Em classes base a seguinte classe. Em métodos } Métodos declarados final. não podem depois ter outro valor atribuído. o ganho será Mas muitos não conhecem alguns bene. ela não pode ser herdada. public final class ClasseNaoExtensivel { private final int posInicializado.. medidas de desempenho bem definidas e ser redefinidos e classes final não podem ladores e máquinas virtuais façam otimi. Em variáveis de instância Variáveis de instância final precisam ser inicializadas na decla- ração. as subclasses de OperacaoBanco podem definir public void metodo() { final int i = -1. por exemplo: Quando uma classe é declarada final. // As subclasses coletam os dados de forma específica } } public final void realizaOperacao() throws ValidacaoException { Em variáveis locais //É importante que estaa operação só seja realizada //da forma definida nesta classe Variáveis locais final precisam ser inicializadas na declaração e enviaDados(coletaDados()). //.println(“disp”). para } } o seguinte método a segunda linha não é permitida: Nesse exemplo. lado). compactação etc. a palavra-chave final não é tão usada nem como poderia. } } public Exemplo(int valor) { posInicializado = valor.. int valor) { } System. recompilá-las após ter alterado o código ser herdadas (veja detalhes no quadro zações como inlining (veja o quadro ao para usar final em todos os lugares possí- abaixo)..out. o seguinte trecho de código não compila: public class Exemplo { private final int inicializado = 50. ou em todos os construtores da classe.indb 32 3/4/2003. usar final permite que compi. visto que o método realizaOperacao() é final.out. Uma boa maneira de verificar as melho- rias é selecionar algumas classes de um sistema ou subsistema pronto que já tenha métodos e variáveis (veja quadro “Usos uma única vez. public Exemplo(String disp. Por exemplo. } public Exemplo() { class Filho extends ClasseNaoExtensivel { //Não compila posInicializado = 0. não podem ser redefinidos em sub. como autenticação. Conheça os principais usos de final na linguagem. Na maioria dos casos.println(“disp”). private void enviaDados(DadosCliente dc) } throws ValidacaoException { //Aqui são realizadas operações seguras e //Tenta atribuir novamente um valor a uma variável final //críticas. Uma boa razão para fazer isto é garantir a segurança do Seriam inválidos os seguintes construtores: código. Dicas e Soluções Uso de final e desempenho É bem conhecido o que a palavra-chave final é capaz de fazer teoricamente – campos final só podem ser atribuídos fícios práticos do uso desse modificador. como no exemplo abaixo: //Não inicializa posInicializado public abstract class OperacaoBanco { public Exemplo(String disp) { //. System. protected abstract DadosCliente coletaDados() { inicializado = valor. diversas maneiras de coletar os dados para operações específicas. métodos final não podem de final”). aumentando consideravelmente o veis.

ejb. com Enterprise JavaBeans conhecem são do SouJava.html nos arquivos . Java Language Specification (para detalhes } sobre o uso de final) } Visto que o método setA não pode ser redefinido em subclasses. Chamá-lo indica para reta ou indiretamente e que sejam também o container EJB que o único final possível serializáveis todas as suas variáveis de para a transação atual é um rollback. pelo JIT) tar utilizar outra no lugar. Descompilar as classes com e sem o uso de final revela o número Documentação do método setRollbackOnly de instruções “economizadas”. No entanto. Dicas e pequenas soluções para problemas comuns no dia-a-dia do desenvolvedor MICHAEL NASCIMENTO SANTOS ser interpretadas como uma indicação de rollback – podem porque o container pode Inlining de métodos simplesmente descartar a instância e ten- Certos trechos podem ser modificados pelo compilador (ou em execução.ejb. lista de discus- que sessões sejam persistidas e recupera. o compilador pode java. Há qua- Recuperando sessões após quedas Rollback em EJBs tro anos desenvolve com Java.ejb.4. suas classes devem interfaces. provavelmente apenas res acreditam que lançar uma exceção uma propriedade na configuração de seu qualquer a partir de um dos métodos servidor precisará ser alterada para que as de um EJB irá cancelar a transação.2 & 1. disponíveis desde a canismo. Se o seu código A questão é que muitos desenvolvedo- seguir esse padrão.indb 33 3/4/2003.io. de javax.com/docs/books/jls public static void main(String[] args) { metodoTeste(new Exemplo()). as interfaces javax.class).com.EJBContext de seu EJB. é this.com/j2ee/sdk_1. visto que elas são subinterfaces implementar a interface java. é necessário que todos os objetos primeira versão da especificação de EJB.tesla. Somente exceções que das programadas e às inesperadas. } java.nascimento@tesla. Portanto.a = a.com.EJBContext.SessionContext e funcionário da Tesla Tecnologia (www.br). 17:51:21 . Observe que public class Teste { isso só se aplica a EJBs com transações private static void metodoTeste(Exemplo ex) { gerenciadas pelo container (CMT).com/j2se/1. não é bem assim.setA(5) seria o mesmo que: Serialização ex. mas possível javax/ejb/EJBContext. Veja um exemplo: circunstâncias em que as exceções forem lançadas. herdam de java. java.br) é Sun Certified Programmer for the Java 2 Platform 1. para tirar proveito desse me.main pelo seu equivalente.EntityContext.sun.Serializable di. além de membro individual do JCP e das mesmo após uma queda do container.3/techdocs/api/ (Esta é uma instrução inválida se usada diretamente no código fonte.1/docs/guide/ facilmente substituir a chamada ao método em Teste. armazenados nos objetos HttpSession sejam O método setRollbackOnly() e stá em ambas as serializáveis – ou seja. javax. Mas sessões dos usuários sobrevivam às para. Isso se aplica especialmente a métodos. } chamar setRollbackOnly() na instância de } javax.RuntimeException podem Edição 6 • Java Magazine 33 jm6-book.4 e Sun Certified Web Component Developer for J2EE. ex. a única forma de garantir public final void setA(int a) { que uma transação seja cancelada.setA(5). Assim.sun.ejb.a = 5. dependendo das devido ao uso de final. trabalhando com diversas A maioria dos containers web permite Os desenvolvedores que trabalham arquiteturas e é moderador da java-list.lang. serialization o bytecode gerado para ex. instância não-transientes. Michael Nascimento Santos (michael. class Exemplo { private int a.sun.

indb 34 3/4/2003.Título 34 Java Magazine • Edição 6 jm6-book. 17:51:23 .

17:51:31 .indb 35 3/4/2003. Edição 6 • Java Magazine 35 jm6-book.

foi introduzida uma mudança na linguagem em si: o uso é necessário que a descrição faça sentido para o usuário final. equivalente é: causando impacto significativo). ceção (do tipo AssertionError). Usando asserções Para garantir a máxima compatibilidade com as versões an- teriores do J2SE.exit(0). assert false: "false em A: B deveria ter " + Para compilar o código das Listagens 1 e 2.4 ao System. O código ternativa do if/throw. de asserções (assertions). A. (caso a condição seja falsa. E quanto mais asserções existirem no có- assert expressão1: expressão2. para pacotes ou classes.] } 4 errors 2 warnings 36 Java Magazine • Edição 6 jm6-book. • assert conexao != null. é necessário passar a opção -source 1. B. digo. é necessário passar.4 A. Veja alguns exemplos de asserções: Asserções são usadas para facilitar a realização de “testes de sanidade” (sanity checks) em uma aplicação. para a mudança: ou • Facilidade de uso – é muito mais fácil usar assert do que a combinação if/throw. assert is a System.java if (false) { A. Além de mui. o Com a segunda maneira.main()"). Asserções no J2S Garanta a qualidade do código por ante c A versão 1. desabilitado em tempo de execução. A expressão2 pode ser qualquer expressão Java. se não for passada a opção -source 1.main(args). não I/O). onde assert não era uma palavra-chave.4.main()" ). onde a expressão de teste é sempre avaliada. tanto no compilador public class A { quanto na máquina virtual. • assert a > 0: “a <= 0”. que é a default). "terminado a execução do programa". B.out.out. o compilador public class B { exibirá uma mensagem de erro: public static void main(String args[]) { System.java:7: warning: as of release 1. o uso Listagem 1. existe a opção -source 1. if (!expressão) • Flexibilidade – o recurso de asserções pode ser habilitado ou throw new AssertionError().java B.indb 36 3/4/2003. caso expressão não seja verdadeira.. Por que a mudança na linguagem? Sintaxe O leitor pode estar se perguntando por que a linguagem Java A sintaxe de asserções em Java é muito simples. expressões regulares e um novo pacote de (ou à equipe de suporte técnico da aplicação em produção).isEmpty(): “lista vazia”.java Listagem 2..4. é gerada uma ex. além da expressão custo em desempenho é praticamente zero (ao contrário da al- a ser testada (expressão1). } comando é: } $ javac -source 1.4 do J2SE é realmente inovadora. Mais precisamente. Como uma asserção só é útil ao desenvolvedor de logging. 17:51:40 . Uma asserção foi modificada para realizar uma tarefa que poderia ser feita pode ser feita de duas maneiras: com uma simples combinação if/throw? Veja alguns motivos assert expressão. exceto chamadas tas mudanças e melhorias nas APIs (como a introdução a métodos void. javac (similarmente. tanto globalmente quanto Ou seja.println( "A.java Nesse caso. uma descrição (expressão2). public static void main( String args[] ) { Para habilitá-las.println("B. • Desempenho – caso as asserções estejam desabilitadas. 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 " + execução do programa”. maiores as chances de serem detectados erros em tempo A primeira maneira é equivalente a: de desenvolvimento. por exemplo. $ javac A. ^ } [. if (!expressão1) throw new AssertionError(expressão2). existe um bug no código).java B. servem para testar condições que devem ser sempre verdadeiras • assert !lista. o "terminado a execução do programa". keyword.java de asserções está desabilitado por padrão.3.

. */ Error: false em B: deveria ter terminado a execução do public void calculeTotalComJuros() { programa // pré-condição at B. E a saída: } Aqui. (ou -disableassertions: pacote. com um parâ..). o método objetoValido checa se as estruturas internas do A. //Realizar cálculos financeiros.. Veja um exemplo: A. Item Habilitar asserções Desabilitar asserções todas as classes exceto as de sistema -ea (ou -enableassertions) -da (ou -disableassertions) várias classes -ea: classe.) pacotes especificados -ea: pacote. (ou -disableassertions: classe)...main()Exception in thread “main” java. Boas práticas Embora seja simples a sintaxe de assert...lang. Portanto. ou seja. (ou -disableassertions: . pós-condições (condições que devem ser verdadeiras após uma operação) e Esta será a saída: invariantes (condições que devem permanecer invariáveis).. existem várias opções disponíveis. B.. ou -enableassertions: pacote.totalComJuros > this... Opções para asserções na JVM Edição 6 • Java Magazine 37 jm6-book.).main() Exception in thread “main” java.getObjeto3(). para executar a classe Asserções facilitam a prática do design-by-contract. -da:A B // pós-condição assert this... usando um parâme- metro para cada pacote tro para cada pacote classes de sistema -esa (ou -enablesystemassertions) -dsa (ou -disablesystemassertions) Tabela 1.. Por exemplo. at A..java:9) assert this. Por exemplo: Object objeto3 = objeto1.. usa-se: podem ser usadas para garantir pré-condições (condições que $ java -ea A devem ser verdadeiras antes de uma operação).). -da: pacote.java:5) Um caso típico é na chamada de um método em um objeto retornado por outro método. para exe- cutar a classe A com as asserções habilitadas no pacote default. pós-condições e invariantes resumo das opções na Tabela 1.. Nesta seção..total. pode ser difícil saber Aqui estamos assumindo que objeto1..main(B.getObjeto2() sempre retorna quando usar esse comando.main() private double totalComJuros B.java:4) // invariante assert objetoValido().main() objeto são válidas e se os cálculos estão corretos..indb 37 3/4/2003.. a aplicação levantará pais situações onde devem ser usadas asserções. Veja um Para garantir pré-condições... usando um parâmetro parâmetro para cada classe para cada classe pacote default -ea: . alterando totalComJuros mas desabilitadas na classe B (mostrada na Listagem 2). 17:51:42 . um objeto não-nulo.getObjeto2()..main(A.Assertion Error: false em A: B deveria ter terminado a execução do programa Para testar uma condição que você supõe ser verdadeira at A.. elas A com as asserções habilitadas. a // invariante sintaxe é: assert objetoValido().parcelas > 0.main(A. são listadas as princi.S E 1.lang. usando um -da: classe. Se for retornado null. o que poderia ser evitado usando-se também algumas situações onde não se deve usá-las. (ou -enableassertions: classe.4 Como usar comandos assert para detectar erros mais cedo no desenvolvimento e cipação FELIPE LEME Já para a execução.) -da: . Serão mostradas uma NullPointerException. Note que é possível combinar opções. $ java -ea:..Assertion /* . uma asserção. (ou -enableassertions: .

getObjeto3(). break.. a seguinte estrutura: break. 38 Java Magazine • Edição 6 jm6-book.parent = parent. pode-se usar // .. */ asserção esteja verificando algo referente ao sistema de asserções protected void validate(HttpRequest request) em si (veja um exemplo no quadro “Idioms de asserções”). Em particular.OK)) { // tratar status OK } else if (status. default: Caso a variável useAssercoes seja mudada para false. case Naipe. São os chamados "tamanho fora da faixa: " + tamanho.getObjeto2().PAUS: Caso seja necessário retirar asserts do bytecode de uma classe // .COPAS: extremos. porém. compilado case Naipe. Veja um exemplo: class FormValidator { Existe.pop(). não se deve usar } asserções para checar parâmetros.. assert status!= null.getStatus(). Object objeto3 = objeto1. para garantir que a condição é válida específico a uma linguagem de programação).. } assert topo!= null.getObjeto2()!= null.. break. ou se for protected. assert false: “status inválido: “ + status. 17:51:44 . nas asserções. */ métodos (principalmente em métodos public). no ambiente de produção – o que só deve ser feito em casos break. quando o tamanho da classe é crítico –. Idioms de asserções Para garantir que o valor de uma variável está em seu domínio válido Por exemplo: assert (tamanho < TAM_MAXIMO && tamanho > TAM_MINIMO): E mbora as práticas de quando usar (ou não) asserções sejam comuns em outras linguagens de programação. mas não ações. Um exemplo: // forma correta assert pilha. lador não gerará a declaração de assert (já que a condição do } if será sempre falsa). nesse caso. throws ValidationError { assert request != null. Não use asserções para checar parâmetros de métodos públicos // validação do request aqui } Quando não se tem controle sobre quem está acessando seus /* . existem al- guns casos particulares na linguagem Java. a variável usar asserções para garantir que os parâmetros sejam passados não será mudada e a aplicação lançará uma exceção.OURO: if(usarAssercoes) assert expressão. mas o Asserções devem ser usadas para realizar testes. corretamente.equals(status. } Para checar os parâmetros de métodos não-públicos Note que. //mude p/ false para retirar asserts do cód. a checagem do pa- râmetro não terá nenhum efeito. // . if (! usandoAssercoes ) } throw new RuntimeException( “Esta aplicação exige asserções habilitadas”).. } else { assert usandoAssercoes = true.. Por exemplo: • Caso as asserções estejam desabilitadas. refere-se a um padrão de codificação Em declarações condicionais. ou: Forçando o uso de asserções em tempo de execução Em situações onde é necessário forçar o uso de asserções em String status = comando. uma exceção para essa regra: os casos onde uma // Note que o escopo da classe é package e não public /* . Object topo = pilha. por dois motivos: Não use. nesse caso. use o seguinte idiom na inicialização do sistema: if (status. public void setParent(Object parent) { assert parent != null // Incorreto // forma incorreta this.equals(status. Caso as as- sendo a classe com visibilidade package ou protected).ERROR)) { static { // tratar status de erro boolean usandoAssercoes = false.pop()!= null. uso de parâmetros inválidos (de um método público) é um erro pois os efeitos colaterais não serão “executados” caso as asserções previsível. o que gera um efeito colateral: a atri- todo (caso o método seja private ou package.. Por exemplo: destacamos dois idioms para asserções: Forçando a retirada de asserts do arquivo binário switch(naipe) { case Naipe.ESPADAS: // . static final boolean usarAssercoes = true. o compi- assert false: “naipe inválido: “ + naipe.. a expressão do assert é uma atribuição Quando se tem controle sobre quem está acessando um mé- e não uma comparação. expressões que gerem efeitos colaterais • As asserções servem para checar erros imprevistos. buição do valor true para a variável usandoAssercoes. case Naipe.. tempo de execução.Asserções no J2SE 1..4 assert objeto1.. é possível serções estejam habilitadas (em tempo de execução). estiverem desabilitadas em tempo de execução.indb 38 3/4/2003. idioms (idiom.

manning.sun. trabalhando como Consultor Sênior para a Trust Consultores (www. como diz Greg Travis (autor do livro JDK 1. qual. esse artigo visa conscientizar Felipe Leme (felipeal@iname.org/members/jdk14/index.parent = parent.br) e E.jsp } Download gratuito do livro JDK 1. o uso de asserções já é bastante difundido em outras linguagens (as asserções estavam previstas na especificação da linguagem Oak. Assim.4/docs/guide/lang/assert.trust.com.javamagazine.4 Tutorial (editora Manning) Embora seja novidade em Java. this. atualmente o leitor dessas práticas. como instrutor Java para a SeedTS (www.4 Tutorial (é necessário registrar-se no site. O correto: java. precursora da linguagem www.com/j2se/1.4 sobre asserções if (parent = = null ) { //Correto throw new NullPointerException( “objeto pai não pode ser null”). 17:51:46 . } o registro é gratuito) www.br/downloads/jm6/jm6-fleme-assercoes.seedts.com).4 Tutorial).html public void setParent(Object parent) { Guia oficial do J2SE 1.com) é Engenheiro de Computação.com/travis Conclusões Site do livro JDK 1.indb 39 3/4/2003.com. www. quer asserção é melhor que nenhuma! Edição 6 • Java Magazine 39 jm6-book.zip Java).javalobby. já existem várias convenções do que deve ou não ser feito (as boas e más práticas).

vamos com HTML e JavaScript pode Web Application Framework. Jakarta Velocity e XSLT. Além de ser aplicação possui design gráfico complexo software livre e bem documentado (tanto Arquiteturas e variações e funcionalidades avançadas. e respeitado. Torna-se na web como em diversos livros). o Struts é O padrão de arquitetura MVC (Modelo- difícil a manutenção do código e a inte. as opções são igualmente MVC. Isso é atingido com a arquitetura Model 2. Arquiteturas Model 1 e Model 2 páginas JSP) pode ser substituído por tags 40 Java Magazine • Edição 6 jm6-book. desde a versão 0. melhores práticas do mercado e evitando JSP. Struts: primeiros Conceitos. Visão-Controlador) divide uma aplicação ração entre a equipe de desenvolvimento cipais ferramentas de desenvolvimento em três partes ou papéis: dados e classes e a de design gráfico fica comprometida. acessar classes de negócio e coor- denar a geração do conteúdo da apresen- tação (páginas HTML. O pouco código Java que resta na apresentação (nas Figura 1. apresentação (visão) Como solucionar as divergências. com a integração frameworks web. de negócio (modelo). mento. arquitetura e exemplos N o desenvolvimento de aplicações O framework extensível e adaptável. O JSP já suportava parcialmente o padrão partir do zero. manutenção e a evolução de aplicações web. com outras além de fomentar o reuso dos componentes arquitetura das aplicações. entre os quais o Struts do amplas: de JDBC a Enterprise JavaBeans. Eclipse. melhor o trabalho das equipes e fazê-las O Struts é baseado em uma variação do Centralizando o controle. que adiciona um elemento: o controlador.91. Para a cama. 17:52:15 . em um pa- projeto Apache Jakarta é o mais conhecido passando por JDO. É a arquitetura do Struts que o torna tão O Model 1. manter uma clara separação entre os papéis torna- se muito importante. o padrão MVC trabalhar com produtividade em suas tradicional padrão de arquitetura MVC reduz a duplicação de código e simplifica a especialidades? (Model-View-Controller) e se integra bem. JDeveloper. Antes de entrarmos web. sem um fluxo complexo de navegação. Um passo importante é padronizar a na camada de apresentação. Implementado geralmente por um servlet. dificultando o trabalho em equipe e a manutenção. drão que ficou conhecido como Model 1. (entre elas JBuilder. questão que se agrava quando a de aplicações web com Java. Por apresentar essas deficiências. o controlador tem a responsabilidade de receber solici- tações. a arquitetura Model 1 é considerada adequada apenas para apli- cações pequenas e praticamente estáticas. usando as tecnologias e frameworks web tais como da visão e do modelo. não traz uma se- paração clara entre os papéis – são apenas dois componentes (JSPs e JavaBeans) para desempenhar os três papéis do MVC. de JavaBeans com páginas JSP. É nesse ponto que entram os da de dados. separar NetBeans e IDEA). e controle. a mistura de código Java Com o nome completo Apache Struts nos detalhes sobre o framework. o Struts é conhecer um pouco sobre as origens e trazer muitos problemas no desenvolvi.indb 40 3/4/2003.). O controle é descentralizado e tanto os de- senvolvedores como os designers precisam editar páginas JSP. WML etc. muito popular entre os desenvolvedores características dos padrões adotados. extensível e suportado pelas prin. no entanto. Para projetos de grande porte. flexível.

A página consulta os JavaBeans inseri- no arquivo struts-config. é chamado e. o Struts fornece os contidos na requisição. ela é JSP) e o controlador (ações e servlet). e uma vasta é então populado com os parâmetros da dos pela ação na requisição ou na sessão bibliotecas de tags. o RequestProcessor e as classes de ação. RICHARDSON OLIVEIRA E DANIEL FREITAS personalizadas. São as ações as responsáveis por mulário (ou clicado um link). Ao final da execução. é recuperada uma instância pré. ou é exibida a página original de elementos adicionais importantes. 17:52:24 . As melhores práticas dos Blueprints da Sun (veja links) recomendam que aplica- ções web. caso retorne algum erro 9. o Struts O Struts é uma implementação completa e madura do padrão de arquitetura Model 2. por exemplo). e identifica a ação um objeto ActionForward. desenvolvimento de páginas JSP. No navegador web. caso usuário pode prosseguir interagindo com O ActionServlet é o único servlet de uma contrário o processamento continua. Os Action- struts-config. como um pool de conexões (configurado gerada uma nova instância. As o ActionServlet que outra ação deve ser senvolvedor. Forms fazem a ponte entre a visão (páginas 2. JavaBeans criados pelo de- responsável pelo seu processamento. tionForm. a ação retorna De modo similar. as ações devem ser implementadas pelo de- senvolvedor estendendo a classe abstrata 1. indicando para ActionForms. ou que preenchidas automaticamente pelo Struts nos mapeamentos definidos no arquivo uma página deve ser exibida (continuando a partir de formulários HTML. processada para gerar a resposta à requisi- Além desses. que. contemplando prati. Fluxo Básico Veja uma comparação dos dois padrões de arquitetura na Figura 1.xml.xml). sejam implementadas usando um framework web MVC. é submetido um for. São realizadas as chamadas ao modelo a lógica de negócio e o servlet. ou a camada web de aplicações J2EE. acessar o modelo. com o passo 7). O ActionServlet e o RequestProces- sor são fornecidos prontos pelo framework. são mais fáceis de compreender e manter. por exemplo) ou com erros de validação. Caso seja necessário popular um Ac. (esses objetos são fornecidos como respos- camente todas as tarefas necessárias no 3. Em cena. O ActionForm 8. a HTML) é enviado para o navegador. O resultado final (geralmente código (encapsulado em objetos ActionError). a aplicação. Se tiver sido indicada uma página. O arqui- Edição 6 • Java Magazine 41 jm6-book. O método validate do ActionForm ta pelo modelo ou construídos pela ação). requisição. 4. para os designers. que têm suas propriedades duas tarefas são realizadas baseando-se executada (retornando ao passo 4). que 5. o Struts inclui uma série existente da sessão (criada numa invocação ção original. fazendo a ligação entre requisição recebida pelo ActionServlet. O framework fornece um controlador constituído por três elementos princi- pais: o ActionServlet (servlet controlador). ou Actions. A classe de ação escolhida é instanciada Action.indb 41 3/4/2003. gerando uma e é chamado seu método execute. 7. aplicação construída com o Struts. E o Struts é citado várias vezes como uma alternativa robusta para isso. anterior da mesma URL. determina se há necessidade de instanciar (JavaBeans ou EJBs. e o Fluxo de uma aplicação Struts página original é reexibida (passo 7). um ActionForm para encapsular os dados 6.passos Conheça o framework líder no desenvolvimento web MIGUEL ÂNGELO GALLINDO.

Após descompactar o pacote zip. Ao iniciar o try { Tomcat o war será descompactado (certifi- FachadaModelo fachada = FachadaModelo.xml semelhante à mostrada na Figura 2 <global-forwards> Observe na figura os arquivos subli- <forward name=”excecoes” path=”/jsp/error.jar ficam </global-forwards> as classes do framework. <html:html locale=”true”> O quadro “Fluxo básico” apresenta o flu- xo de controle de uma aplicação baseada no <head> <!—. Também no struts-config. Aplicação inicial </action-mappings> Um bom ponto de partida para criar uma aplicação Struts é o arquivo struts-blank. você terá uma árvore de diretórios Listagem 2. A árvore de diretórios do Struts 1.. quisição.1 42 Java Magazine • Edição 6 jm6-book. erros.jsp”/> </action> cessário para a distribuição de aplicações <action path=”/preencheform” baseadas no Struts.org/site/ </body> </html:html> binindex. padrão. saveErrors(req.sqlerror”)).GLOBAL_ERROR. O Struts <bean:message key=”link.apache.xml.ListarAction”> e arquivos de propriedades. e o Tom- <h3><bean:message key=”application.recjug.jsp”/> . ela é instanciada e em seguida é da aplicação para esse servlet.cgi.a tag bean:message retorna uma mensagem Struts (a figura se baseia na documentação armazenada no arquivo application.getInstance().exemplostruts.do”> instalar e configurar o Tomcat). 17:52:39 . } catch (SQLException e) { ActionErrors erros = new ActionErrors(). Collection funcs = fachada.findForward(“excecoes”). Este jar é ne- <forward name=”sucesso” path=”/jsp/lista. <title><bean:message key=”index.register”/></html:link> pode ser baixado em jakarta.com.xml.1 do Struts.name”/></h3> cat 4.tld <action-mappings> <action path=”/listar” (com as definições das bibliotecas de tags) type=”br. . são listados Processor. a ação retorna uma indicação para o contro- Quando o ActionServlet recebe uma re. index.. lador sobre qual visão deve ser exibida. Faça uma cópia deste arquivo para HttpServletRequest req. type=”br.title”/></title> <html:base/> </head> Obtenção e instalação <body bgcolor=”white”> Usaremos a versão 1.actions. são dos e populados para cada URL.tld” prefix=”html” %> resultado. return mapping. “*. ela é repassada para o Request. Em geral é chamado seu método execute.1 (veja a coluna “Java Livre” nesta <hr> <html:link page=”/listar. nhados em vermelho. ActionForm form. erros).findForward(“sucesso”).do”> edição para mais informações sobre como <bean:message key=”link.xml deve conter um mapeamento sáveis pelo seu processamento.getSession(true). funcs).tlds das tags do struts --> as páginas JSP responsáveis por exibir o <%@ taglib uri=”/WEB-INF/struts-bean.jsp níveis tanto para as ações responsáveis <%@ page language=”java” %> por processar a requisição quanto para <!-.getFuncionarios(). req. direcionando páginas diferentes a ação.properties--> do framework). Listagem 3. Escolhida genérico.add(ActionErrors. Ação responsável por obter a listagem de funcionários uma aplicação web “vazia” com os princi- public final class ListarAction extends Action { pais arquivos necessários e configurações public ActionForward execute(ActionMapping mapping.exemplostruts.Struts: Primeiros passos da sessão HTTP.actions. . Ao final da execução. inseridos como atributos da requisição ou Figura 2. arquivos *. No struts. } } } vo web. Estes são mapeadas as URLs para as ações respon.PreencheFormAction”> <forward name=”cadastro” path=”/jsp/cadastro.setAttribute(“funcs”.recjug.war. new ActionError(“errors. HttpServletResponse res) throws Exception { o diretório webapps do Tomcat.com. estando portanto dispo- Listagem 1. que realiza utilizado o padrão de URL (URL pattern) chamadas ao modelo. Mapeamento das ações no struts-config. return mapping.jsp”/> </action> .indb 42 3/4/2003.do”. que processa e valida os dados os ActionForms que devem ser instancia- recebidos.list”/></html:link><br> <html:link page=”/preencheform. No arquivo struts-config.tld” prefix=”bean” %> <%@ taglib uri=”/WEB-INF/struts-html.

é retornada em uma coleção e adicionada Figura 3.xml tag global-forwards.. A <table border=”1”> <tr> sentado) e application.jsp (mostrada na ser executadas após a pró. FachadaModelo fachada = FachadaModelo. <html:text property=”nome”/> Ponto de entrada da.. Usando as tags <html:options> e <html:select> “*. por arquivo struts-config. que-se de que sua instalação do Tomcat URLs /preencheform. o forward global modelo.Listagem 6. primeira. Nota: o arquivo web. que “excecoes”.. </table> </html:form> Também é possível definir forwards globais dentro do Listagem 7. idiomas incluindo na aplicação arquivos 2 mostra como estas duas Listagem 5. No exemplo cada </td> </tr><tr> ação especifica uma pági.. <%@ page language=”java” %> trada na Figura 3.. ou caso ocorram exceções. formulário associado.. Trecho do método perform da ação que obtém a listagem de cargos da forma application_xx. As ações listadas na pá.jsp”> tudo ocorrer conforme o <forward name=”sucesso” path=”/listar. uma listagem de funcionários. links. que é usada <td><jsp:getProperty name=”func” property=”cargo”/></td> <td><jsp:getProperty name=”func” property=”sexo”/></td> te arquivo são inclusas nas páginas JSP na página de formulário </tr> por meio dos tags da biblioteca <html:>. path informa a URL a partir <table><tr> <td>Nome:</td><td> da qual a ação será chama. a página index. como defi. 17:52:41 . apenas dois são usa. As mensagens definidas nes.. <html:errors property=”nome”/> </td> </tr> Nossa aplicação de exemplo é bastante ma ao servlet qual classe de ..CadastreForm”/> .. na empresa.xml. struts-blank já fornece o ActionServlet con.setAttribute(“cargos”.war O propósito da ação ListarAction é obter.struts.do”/> </action> esperado. O atributo <html:form action=”/cadastre”> alterado pelo desenvolvedor. Seu método <action-mappings> . nido no struts .forms. que está associada à URL </form-beans> / listar. exemplo “en_US” ou “pt_BR”.jsp.indb 43 3/4/2003.findForward(“cadastro”). </action-mappings> exibe a página /jsp/lista. xx é o código padrão de localidades.properties onde ações são configuradas no . Este últi. <th>Sexo</th> </tr> gens personalizadas. A tag action possui seis req.. <logic:iterate id=”func” name=”funcs”> sideração o idioma e a região geográfica torna uma Collection conten. mas quando não return mapping. <tr> <td><jsp:getProperty name=”func” property=”nome”/></td> (Locale) do cliente que estiver acessando do os cargos disponíveis <td><jsp:getProperty name=”func” property=”email”/></td> a aplicação. </html:select> Listagem 1). A Listagem 3 mostra o <form-beans> <form-bean name=”cadastreForm” código da ação ListarAction.CadastreAction” forwards: o forward local path=”/cadastre” name=”cadastreForm” scope=”request” validate=”true” “sucesso” para o caso de input=”/jsp/cadastro.do” e normalmente não necessita ser dos: path e type. A Listagem .. É importante destacar dois arquivos gina inicial não possuem <h2>Lista de funcionários cadastrados</h2> nessa estrutura: struts-config.xml. O parâmetro type infor. Acesso aos elementos de uma coleção árvore de diretórios semelhante à mos.xml (já apre. teremos uma /listar.actions.<%@ taglib uri=”/WEB-INF/struts-logic. Cada <td>Cargo:</td> listagem de funcionários. Observe que usamos as pria ação..getInstance().tld” prefix=”logic” %> .do re.. Collection cargos = fachada. A ação /preencheform.config. cargos). type=”exemplostruts.getSession(true).do para montar os Listagem 4. que levam em con.xml da aplicação atributos. Estrutura da aplicação struts-blank.do e está configurada para tal).. . </table> Podemos fornecer mensagens em outros lect> HTML. Associando os ActionForms às ações no struts-config. tag action pode conter tags <td> ção básica da aplicação na Figura 4.properties. Veja a navega.. ações ou visões que podem property=”idCargo” labelProperty=”nome”/> trada.getCargos(). <td><html:submit/></td> <td><html:reset/></td> na diferente para exibir o </tr> resultado da requisição. do à sessão HTTP do usuário com o nome Edição 6 • Java Magazine 43 jm6-book. 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 definição de mensa.. . <html:select property=”cargo”> forward indicando outras <html:options collection=”cargos” Vamos começar com o ponto de en. existe associação a formu- figurado para o mapeamento padrão lários. simples: consiste de um cadastro e uma <tr> ação será instanciada. execute pode realizar dois <action type=”exemplostruts. funcionários cadastrados.struts.do. /listar.do. </logic:iterate> para alimentar um <se. que.

retorna private String email. String sexo = “”. para percorrer todos os elementos. } mente.facilit.trim().equals(“”)) { exemplo.br/downloads preencher um <select> que faz parte do /jm6/jm6-varios-struts formulário de cadastro de funcionários. new ActionError(“errors.emptynome”)). incluindo ins- erros. invocado e.do. e o /listar. } Chegamos ao fim de nosso pequeno if (nome == null || nome. monta a lista de Gallindo (miguel@facilit. pela Sun Esta coleção é utilizada pela página de visão /jsp/cadastro.xml.trim(). Há muitas outras fun- tratamento diferenciado pelas visões. String cargo = “”. Na sessão do usuário temos nossa coleção contendo os dados dos fun.apache. como formulários dinâmicos. Cadastro de funcionários java. } truções de instalação.com. que também é colocada na seguindo as melhores práticas recomendadas esses dados na página. 17:52:44 .br) são certificados cada objeto na coleção. zado em tags <jsp:getProperty>.jsp (Listagem 6) para www. em vez sessão do usuário (veja a Listagem 5). Se os dados forem validados correta- String nome = “”. segundo indica qual mensagem do arquivo O atributo name da tag <logic:iterate> subprojetos. além das mui- application. jakarta. O Struts fornece uma tag bastante útil para essa tarefa.add(“email”. um objeto do tipo ActionErrors (Listagem private String sexo. Páginas JSP da aplicação de exemplo o controlador determina. } if (sexo == null || sexo. como Turbine.emptysexo”)).trim(). Para isso. site da Java Magazine.Struts: Primeiros passos arquivo struts-config.org/struts tags do Struts facilitam bastante o desen. ário. que pode assim receber /jsp/lista. new ActionError(“errors. que a ação pos- Listagem 8. um Java- Bean é disponibilizado e o corpo da tag é Listagem de funcionários processado.com.properties será exibida para o usu. HttpServletRequest request) { tags <html:errors> na página de cadastro. usaremos um tag de iteração um padrão mundial pelo poder de seus um objeto da classe ActionErrors que é in. facilidade de uso e pelos ganhos serido na requisição.com/blueprints cionários da empresa e queremos exibir Na ação de cadastro. nas listagens) inclui o novo funcionário HttpServletRequest request) { ActionErrors erros = new ActionErrors(). O nome do bean é informado Nesta parte do exemplo. request do JSP). private String nome. a ação CadastreAction (não exibida public ActionErrors validate(ActionMapping mapping.add(“sexo”. Conclusões } Existem muitos frameworks para desen- return erros. cionalidades. a ação instancia de scriptlets.indb 44 3/4/2003.br) e Richardson acordo com as propriedades desejadas de Oliveira (richardson@facilit. e retorna para a página de listagem dos if (email == null || email. mas o Struts vem se tornando “funcs”.br). new ActionError(“errors. O fonte completo.sun. inesperados. Tapestry e } Webmacro (com objetivos e especialidades diferentes). classe recebe dois argumentos: o primeiro lista de funcionários. em conjunto Daniel Freitas (freitas@facilit. Stuts: documentação. pela leitura do 44 Java Magazine • Edição 6 jm6-book. Figura 4.jsp executada em resposta à ação básicos do Struts. padrões e exemplos ção “cargos”.1. String email = “”. Miguel Ângelo com a tag <html:options>.com.com. downloads e referências volvimento. erros. obtemos a cole. O método add dessa Listagem 4 o trecho de código que gera a de produtividade que traz.trim(). O método validate deste ActionForm é private String cargo. A cada iteração.equals(“”)) { funcionários.javamagazine. Veja na recursos.add(“cargo”. Métodos validate e reset sui um ActionForm associado (Listagem public class CadastreForm extends ActionForm { 7). pela Sun (SJCP) e engenheiros de software da Facilit Quando ocorre a submissão da página. vemos como as através da propriedade id e pode ser utili.emptycargo”)). Este é parte da página Este artigo mostrou apenas conceitos classifica o erro. Tecnologia (www.GLOBAL_ERROR é o qual a coleção foi inserida na sessão existe material suficiente para vários novos usada para informar a aplicação sobre erros (ou na requisição – no objeto implícito artigos.equals(“”)) { erros. templates e tiles. pode ser baixado do if (cargo == null || cargo.com. Java Blueprints: diretrizes. A constante ActionErrors.add(“nome”. especifica (como esperado) o nome sob tas novidades da versão 1. Estes erros são exibidos pelas public void reset(ActionMapping mapping. <html:select> que.emptyemail”)). 8) de modo similar ao realizado pela ação // Métodos get e set omitidos de listagem. } volvimento web. Certamente. new ActionError(“errors.br). Em caso de erro. caso ocorram erros.equals(“”)) { erros.

Edição 6 • Java Magazine 45 jm6-book.indb 45 3/4/2003. 17:53:28 .

são fornecidas ao Algumas das principais tags do XDoclet XDoclet através usadas na programação de EJBs são: da marcação do • @ejb. Arquitetura e fluxo do XDoclet XDoclet. que gerava interfaces de redor do mundo. ou cria baseando-se em padrões de projeto bem conhecidos. Noruega. Tudo o que você precisa @tags: metadados saber sobre um componente fica em um para o código único local: a classe de implementação do Informações componente. é persistida cada propriedade. volvimento da ferramenta. As tags adicionam • @ejb. 17:53:42 . tipos de interface (local ou remota) gerar documen. digo existente – são tais como o nome da tabela em que o bean esses metadados a é persistido. JBossIDE mostrando as tags XDoclet disponíveis para um EJB Visando livrar o programador do traba. a criação dessas classes se torna apenas trabalho repetitivo. localização no às usadas para JNDI. ção para a geração de arquivos pelo Arquitetura Figura 1. atraiu um grupo de programadores ao Eles passam a complementar o significado mada ejbdoclet. Automação com X D Livre-se da codificação repetitiva D iversas áreas da programação em Java têm uma característica bem distinta: o uso de código baseado em modelos ou templates – aquelas classes que você sempre acaba copiando de um exemplo. seu nome. expressando coisas que a componentes e seus deployment descriptors. França. como o tipo de tags semelhantes componente.bean – fornece informações gerais código fonte com sobre um componente EJB. Hoje. Com o XDoclet. entre classe de implementação e os deployment XDoclet. Origens Figura 2.finder – define métodos de pesqui- ferramenta javadoc. tação usando a • @ejb. está o template 46 Java Magazine • Edição 6 jm6-book. O linguagem Java não consegue expressar. descriptors. tornando a equipe do dos programas. A principal vantagem de um modelo como esse é a centralização da informação. você passa a ver os co- lho repetitivo no desenvolvimento de EJBs. tros de persistência para um entity bean. Öberg não participa mais do desen. com a idéia XDoclet conta atualmente com desenvol. sa (finders) para um entity bean. nasceu o Rússia. e chave primária.persistence – especifica parâme- metadados ao có. vários outros países. Esse é o cenário ideal para a aplicação e uma ferramenta de geração de código como o XDoclet. mas o projeto mentários de seu código com outros olhos. À medida que um projeto cresce. de um Enterprise JavaBean: as interfaces. tais como as relações entre as várias partes de levar a geração automática de código vedores na Alemanha. O ejbdoclet ganhou força e. ou o nome da coluna em que fonte de informa.indb 46 3/4/2003. Rickard Öberg criou uma ferramenta cha. projeto verdadeiramente internacional. No coração do XDoclet. Brasil e Estados Unidos. a a outras áreas da programação.

vamos supor que tém diversos arquivos . Se for necessário modificar a for- ma como é gerado algum elemento. Middlegen: geração de código integrada ao XDoclet como uma tarefa do Ant. * O código do produto.persistence column-name=”prod_descricao” A arquitetura do XDoclet torna-o bastan. id=31602. O diretório onde foi feita a descompac- Baixe a versão mais recen. um analisador de código Java * @ejb. adicionan- do mais significado ao código é o objetivo do XDoclet MARCUS BRITO Instalação 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 (conheça mais sourceforge. basta escrever mais um template e opcionalmente alguns tag handlers.bean que fornecem os dados necessários para * type=”CMP” * name=”Produto” os templates. */ public abstract String getDescricao(). * A execução de um template do XDoclet * @ejb. executar a ferramenta e Figura 3. Os templates são escritos numa sintaxe /** particular ao XDoclet e fazem uso de tag * Um EJB representando um produto num sistema comercial (PDV) * handlers (manipuladores de tags).java: EJB com tags do XDoclet sável pela interpretação dos modelos de código usados como base para a geração. * ram o resultado final. * @ejb. identifica os tag handlers utiliza.X Doclet Retirar do programador a tarefa de criar código repetitivo. você descompactou o zip no diretório com as classes do XDoclet c:\xdoclet. escrever a classe de um EJB incluindo as O XDoclet é executado tags do XDoclet. tação será usado para construir o classpath te. com o nome xdoclet-bin.interface-method view-type=”local” modificar o template usado para gerá-lo. public abstract Integer getProdutoId(). O pacote con. se */ você quiser que o XDoclet gere novos ele. Ligado aos tag handlers está * primkey-field=”produtoId” o xjavadoc.jar. e todos os seus módulos. Edição 6 • Java Magazine 47 jm6-book. package jm.ejb.zip. classes * @ejb.persistence column-name=”prod_id” */ template. compilar o projeto.persistence * table-name=”produto” responsável por fornecer aos handlers */ public abstract class ProdutoEJB implements javax. te flexível. as informações necessárias (as @tags) e ge.EntityBean { informações sobre as tags utilizadas na /** marcação do código fonte. dos nele e executa os tag handlers à medida public abstract void setProdutoId(Integer id). o exemplo a seguir. } mentos. public abstract void setDescricao(String descricao). respon- Listagem 1. Basta então descompactar EJB a partir de uma classe o zip em um diretório à Vamos montar um exemplo simples: sua escolha. basta /** * @ejb. Os handlers fazem uso do xjavadoc para obter /** * A descrição do produto.interface-method view-type=”local” * @ejb. s h o w f i l e s. 17:53:45 .interface-method view-type=”local” segue este fluxo: o engine carrega um * @ejb. que prossegue analisando o template.net/project/ sobre o Ant no artigo “Builds com Ant”. Note que é importante engine (mecanismo de templates). ProdutoEJB. Para <versão>. de execução do XDoclet no buildfile.indb 47 3/4/2003.p h p ?g ro up_ na Edição 2). Veja a Figura 1.

path”> listagem.0”> target/meta-inf (esses diretórios foram espe- <fileset dir=”${fontes. Você já pode executar o XDoclet. destdir=”${classes.Onde as classes serão compiladas --> <property name=”classes. Dentro de src-gen. Um exemplo mais <project name=”javamagazine” basedir=”.dir}:${srcgen.dir}” includes=”**/*. alguns projetos Listagem 3. com ape- <!-.dir}” xmlencoding=”ISO-8859-1”> <configParam name=”Description” value=”Exemplo para Java Magazine”/> do EJB.java --> <property name=”fontes.indb 48 3/4/2003.dir}” classpathref=”xdoclet. Crie um diretório <property name=”metainf. mostrado na <path id=”xdoclet.dir}” includes=”**/*. É um entity <!-. usando o comando ant (o processo fica <taskdef name=”ejbdoclet” mais simples se você colocar o diretório classname=”xdoclet.Diretório de instalação do xdoclet --> tro dele um diretório com nome “src”.xml.xml) </path> que cria os diretórios necessários.lang. um plugin para /** o IDE Eclipse que facilita o deployment * Local home interface for Produto.lib.dir” value=”target/meta-inf”/> para o exemplo – usaremos “xd” – e den- <!-.dir” value=”${xdoclet. Para <property name=”xdoclet. ProdutoLocalHome.jar”/> A Listagem 2 mostra o buildfile (build.ProdutoLocal findByPrimaryKey(java.dir” value=”src”/> nais.EjbDocletTask” classpathref=”xdoclet.Diretório onde estão guardados os . crie também <property name=”xdoclet.lib. 17:53:47 .dir}”/> resultante.Automação com XDoclet entender um pouco sobre EJB para acom- Listagem 2. em meta-inf é criado o arquivo </deploymentdescriptor> </ejbdoclet> ejb-jar.dir}”/> <mkdir dir=”${srcgen.samples. tomação de projetos que seguem a idéia de integração contínua – veja o quadro “ciclo } de desenvolvimento com XDoclet”.ejb. Para auxiliar o programador.dir” value=”${xdoclet.EJBLocalHome completando-as automaticamente.dir}/samples/lib”/> o arquivo ProdutoEJB. </target> São gerados dois arquivos.dir}”/> </target> Integração com ferramentas É difícil memorizar todas as tags que </project> podem ser usadas com o XDoclet.” default=”jar”> extenso. executa <target name=”init”> o XDoclet e compila todo o código fonte <mkdir dir=”${classes.java estão surgindo para integrar o XDoclet /* * Generated by XDoclet . é o JBossIDE (Figura 2).xml --> nas duas propriedades. mostrando as tags disponíveis e public interface ProdutoLocalHome extends javax.dir}”/> "xd”.lib.dir” value=”target/classes”/> bean CMP chamado “Produto”. <fileset dir=”${xdoclet. está disponível para download no site da Revista.Integer pk) throws javax. public static final String COMP_NAME=”java:comp/env/ejb/ProdutoLocal”. */ de aplicações no JBoss e auxilia o progra- mador.java”/> <localinterface/> cificados no buildfile).dir” value=”target/src-gen”/> A Listagem 1 mostra o código fonte de um EJB marcado com @tags. um no <target name=”xdoclet” depends=”init”> diretório target/src-gen e outro no diretório <ejbdoclet destdir=”${srcgen. As Listagens 3 e 4 mostram o </target> conteúdo das interfaces geradas (o arqui- <target name=”compile” depends=”xdoclet”> vo XML foi omitido e está disponível para <javac download).path”/> bin do Ant no path do sistema). 48 Java Magazine • Edição 6 jm6-book. <localhomeinterface/> são criadas as interfaces local e local home <deploymentdescriptor destdir=”${metainf.dir}” includes=”**/*. public static final String JNDI_NAME=”ProdutoLocal”.jar”/> <fileset dir=”${xdoclet.samples.lib. Salve esse arquivo no diretório <mkdir dir=”${metainf.Do not edit! com outras ferramentas e facilitar a inclu- */ são das tags. como o IntelliJ IDEA e o Borland JBuilder.path” srcdir=”${fontes.ejb.Onde o xdoclet vai gerar . build. Mais { plugins estão sendo desenvolvidos para outras ferramentas de desenvolvimento.ejb.xml: exemplo de buildfile para execução do XDoclet para um EJB panhar esse exemplo. Atualmente o mais completo package jm.Onde o xdoclet vai gerar .FinderException.java --> <property name=”srcgen. <!-.dir” value=”c:\xdoclet”/> manter a estrutura de pacotes.java. Neste último. demonstrando recursos adicio- <!-.dir}/lib”/> um diretório “src/jm”. salve <property name=”xdoclet.dir}” ejbspec=”2.modules. O XDoclet também é excelente para a au- public jm.

apache.lang. todas as /** * O código do produto. Conclusões O uso do XDoclet pode trazer um grande /** * Local interface for Produto. re. leva essa idéia ao máximo. por exemplo.jboss.lang. public interface ProdutoLocal extends javax. mentares. } Editora Campus. As tarefas bro ativo da equipe de desenvolvedores do XDoclet O Ant é uma excelente ferramenta para a <utilobject> e <valueobject>. XDoclet de aplicações JBoss. É um projeto a partir de bancos de dados.br).br/downloads deve ser possível.org Outro projeto importante em que o XDo. framework para aplicações web www. mas também na padronização e na /** * A descrição do produto. tação de padrões de projeto estabelecidos e concentrando. ProdutoLocal. uma versão do famoso ex. cio importante – além de poupar o tempo ler.sourceforge. Edição 6 • Java Magazine 49 jm6-book. em apenas mais uma etapa automatizada Sistema de layout para web do que modificações não afetem partes em no processo de integração contínua do funcionamento.bekk. boas práticas nas suas tarefas.martinfowler. tação de um projeto (compilação.net/projects/jboss Downloads do JBoss. é importante não “quebrar” o que já está funcionando. auxiliando na implemen- */ public java. Por exemplo.com/articles/ é o xPetstore. Deepak Alur et al.String descricao) . como apresentados à Telebahia Celular em análise e desenvolvimento de mostrado neste artigo.org/struts N o desenvolvimento de um grande projeto.net Ciclo de desenvolvimento com XDoclet Exemplo de uso do XDoclet em um projeto J2EE jakarta.zip alizar todas as etapas do ciclo de implemen.Integer getProdutoId( ) .String getDescricao( ) .html emplo Java Petstore da Sun.no/boss/middlegen Middlegen: geração de código a partir de um A integração contínua. mas usando 3). o uso de padrões de projeto se o código /jm6/jm6-mbrito-xdoclet. o Listagem 4.com/sitemesh testar continuamente o sistema.xdoclet. Assim. boss. Ele desempenha um tros arquivos.lang. public void setDescricao(java. execução. garantin. a qualquer momento. rezando que dos programadores. servidor J2EE livre e integrado com o clet vem ganhando terreno é no servidor de dados e usar o XDoclet para gerar ou. para gerar entity beans a partir do banco JBoss.com. pois.com. é um dos desenvolvedores do XDoclet. atualmente trabalhando na prática da integração contínua. especialmente */ se já for utilizado o Ant em seus projetos. como o Struts e o Sitemesh XDoclet para processamento posterior. onde presta serviços se encaixa bem neste cenário. Vale lembrar que o criador papel importante no desenvolvimento do do Middlegen (Aslak Hellesøy) também sourceforge.javamagazine.org software livre. public java.java que explica a integração próxima entre as /* ferramentas. criado usando projetos de rado pelo Middlegen é marcado com tags ant. um buildfile do Ant bem construído torna a geração de código com o XDoclet Struts. Pagina principal do XDoclet. documentação.Do not edit! */ package jm. projetos J2EE.apache. defendida pelo A geração de código traz mais um benefí- banco de dados guru de orientação a objetos Martin Fow. O XDoclet utiliza alguns padrões e Marcus Brito (pazu@animegaiden. uma ferramenta de geração de código Integração contínua uma arquitetura diferente. você pode usar o Middlegen www.ejb. informações a respeito de um componente */ do sistema.com. aqueles que estão explorando o XDoclet Existem também ferramentas comple- www. a sua execução é no livro “Core J2EE Patterns” (veja livros). ou seja. * Generated by XDoclet .). como Locator e Value Object. 17:53:48 . gerado já utilizar esses padrões.indb 49 3/4/2003. ganho de produtividade. e programador Java. fica mais fácil reforçar www. O código ge- J2EE completo. Apache Ant (veja links).opensymphony.br) é mem- testes etc.unitech. projeto.EJBLocalObject A ferramenta ajuda não só na geração de { código. Core J2EE Patterns. incluindo o plugin JBossIDE xpetstore. é preciso sempre orientada por uma tarefa do Ant. como o Middlegen (veja a Figura continuousIntegration. E o XDoclet são implementações dos padrões Service Unitech (www. de forma automatizada. num só lugar. 2002 Abrangência JBoss e boa parte do código do servidor é www.org Um dos projetos mais interessantes para hoje gerado com auxílio do XDoclet.

apache. O uso do Você pode ver mais detalhes sobre todas adiciona a ele objetos. 17:53:50 . ferramenta CASE concentrados na lógica do sistema e os ou reiniciar o sistema. #set($variável = valor) do template. possibilitando mudar o visual da e ações a serem realizadas pelo sistema de tarefas. Além tura e formatação pronta. Figura 1. carrega um template #else é opcional. Nota: existe ainda a diretiva #stop. mente de Java. Os contextos são a forma usada no Inclui o conteúdo de um arquivo no corpo reference-guide..indb 50 3/4/2003. Uma forma eficaz de fazer essa separação é usando sistemas de templates (template engines). #include(arquivo) Guide” em jakarta. Um contexto é 50 Java Magazine • Edição 6 jm6-book. o sistema de templates. disso. os seguintes passos: inicializa retornar um valor booleano (para objetos. Template Language (VTL) – veja mais so- #foreach ($variável in $ itens) . Diferente. O processo de merge o Poseidon for UML. é possível.... docu- mentos RTF e muitos outros. Jakarta Velocity Acabe com a briga com os designers U ma das áreas em que o desenvol- vimento de aplicações web com Java mais encontra problemas é na separação entre a camada de controle. indevidamente o código da aplicação. null é considerado como false). Por exemplo. para incluir código estático. navegar em listas e arrays. Com diretivas. ou até mesmo invocar métodos de objetos. contendo dire- Usar templates tem uma série de van. por exemplo.. os templates ficam em arquivos se. onde é realizada a montagem da interface web. XML. Sistemas de templates Pode-se fazer muito com um sistema de templates – desde a geração de simples ar- quivos-texto à criação de arquivos binários. que faz as chamadas à lógica de negócio. e a camada de apresentação. desenvolvida em Java. sem fazer o parse. Usada Diretivas são a parte principal da Velocity Atribui um valor a uma variável.. HTML. pois os programadores ficam aplicação sem a necessidade de recompilar de templates. o que reduz o risco de alterarem arquivos com grande parte de sua estru- UML. mostrar o conteúdo de uma Diretivas da VTL variável. tudo o que siga um determinado padrão de formatação. #end #parse(arquivo) bre essa linguagem no quadro “Diretivas Percorre uma coleção. mas seu Uma aplicação que usa o Velocity executa. as diretivas da VTL no “VTL Reference e realiza o merge (veja a Figura 1). atribuindo o elemento atual a $variável.org/velocity/vtl. iterator ou array. basicamente. O framework Jakarta Velocity do Grupo Apache é um dos mais populares desses sistemas. do template e faz o parse do código VTL #if(condição) . tivas indicando valores a serem inseridos tagens: existe uma melhor designação parados. a condição não precisa uso não é mais recomendado.html. Funcionamento básico Condicional padrão da VTL. #else . Pode-se gerar código-fonte de alguma linguagem. Velocity para fornecer dados para o mecanismo de templates. usa o Velocity para designers se preocupam apenas com o Mas o que exatamente são templates? São a geração de código a partir de diagramas layout. cria um contexto. e pode ser usado tanto em aplicações web quanto locais. #end existente no arquivo. Inclui o conteúdo de um arquivo no corpo da VTL”.

// Abre o template Template tmplt = ve. Alô Velocity // Cria um contexto para colocar os dados Nosso primeiro exemplo gera um do- VelocityContext context = new VelocityContext(). empregados).br.jar (que vem no VelocityEngine ve = new VelocityEngine().split(“. Para usá-lo em suas aplicações.io. o Listagem 1. O arquivo-texto utilizado (empregados.com. Obtenção e instalação O download da última versão estável do public class ProcessaEmpregados { Velocity pode ser feito em jakarta.Template.Nome $e. writer).00 // Adiciona a coleção montada ao contexto Jim Morrison. O uso de templates na camada de apresentação de aplicações web simplifica a manutenção e a sepa- ração de responsabilidades PAULO SILVEIRA E RAFAEL STEIL merge (“mistura” ou “intercalação”)..vm) – é // Faz o “merge” mostrado a seguir (com o código da VTL tmplt. Object valor) e #adicionaEmpregado( y. String linha.util. pacote) no classpath do sistema operacional ve. gerando a import org.parseDouble(campos[2]))).80000.00 BufferedWriter writer = new BufferedWriter( new FileWriter(new File(“empregados. $e. você deve incluir a biblio- try { // Inicia o Velocity teca velocity-dep-<versao>.java Velocity interpreta as diretivas e extrai os import org.ArrayList.txt”)). pares String-objeto. 17:53:55 .george@beatles.VelocityEngine. String campos[] = new String[3].readLine())!= null) { mails e salários: campos = linha.app. Double. cumento XML a partir de dados contidos reader = new BufferedReader(new FileReader(“empregados. Manoel da Silva.apache. #end } catch (Exception e) {} <?xml version =”1.*. destacado): writer. ou de seu container web.add(new Empregado(campos[0].velocit importantes: put(String chave.VelocityContext.txt) // Lê arquivo separando as informações e montando uma coleção é bastante simples. writer. Possui dois métodos prossegue-se para o merge. O template (RelacaoEmpregados. e apresenta alguns ArrayList empregados = new ArrayList().apache.00 context.00 } Ringo Starr.vm”).close().com. empregados.100000. ProcesaEmpregados. elementos importantes do Velocity.printStackTrace().close(). builds/jakarta-velocity/release.getTemplate(“relacao_empregados.apache. import java.VelocityContext.0” encoding=”ISO-8859- } 1”?> } <relacao-empregados> } } ## Cria uma entrada para ## cada item da coleção #foreach ($e in $empregados) uma instância da classe org.mano@provedor. e- while ((linha = reader.indb 51 3/4/2003. que utiliza internamente get(String chave).xml”))). George Harrison.com. dados necessários do contexto.velocity.org/ public static void main(String args[]) { BufferedReader reader = null. contendo nomes. import java.ringo@beatles. import org.velocity.flush().Email $e. saída desejada.com.velocity.jimmy@doors. ## Macro para gerar uma entrada XML } #macro(adicionaEmpregado catch (Exception e) { $nome $email $salario) e.init().apache. <empregado> } <nome>$nome</nome> finally { <email>$email</email> if (reader!= null) { <salario>$salario</salario> try { </empregado> reader. campos[1].apache.put(“empregados”.”. 3). Durante o </relacao-empregados> Edição 6 • Java Magazine 51 jm6-book.220. em um arquivo-texto.40000.merge(context.Salario) #end um HashMap para manter um conjunto de Uma vez criado e preenchido o contexto.

você notará que não houve neces- <br><br> sidade de criar um contexto – o servlet já <h3> Cadastro: </h3> <form action=”/ExemploVelocity” method=”post”> cria um contexto. Analisando o #end código.getParameter(“email”). é apresentada na Listagem 2.servlet.servlet.java Listagem 1. passando-o para o mé- Nome: <input type=”text” name=”nome” value=”$!nome”><br> todo handleRequest. double salario) { this. public double getSalario() { O que acontece no exemplo? De forma return salario. mostrada na Listagem 2. monta uma coleção con- Listagem 3.http. } catch (Exception e) { // template nao existe ou houve erros durante a sua validação Velocity na web e. 52 Java Magazine • Edição 6 jm6-book. o Velocity processa o template e.Context.put(“nome”.Template. por exemplo. ao encontrar uma diretiva. geração. arquivo. Context context) throws IOException { #foreach ($e in $empregados) Template tmplt = null. utilizada na private String nome.VelocityServlet. nome). que deve ser 0 E-mail informado foi: <b>$email</b><br> redefi nido no seu servlet. HttpServletResponse response.getTemplate(“FormCadastro. lê do contexto import javax. adicionaEmpregado (defi nida no início do // Adiciona os dados em um contexto visível ao Velocity template). double salario.io. FormCadastro. os objetos necessários. } os dados estruturados em XML.servlet. import org.Email $e.email = email.context.java e execute public String getNome() { return nome. Será criado um public String getEmail(){ arquivo chamado empregados. faz a geração do XML base- public class Empregado { ando-se no template e nos dados lidos do private String email. import java.indb 52 3/4/2003.apache.getParameter(“nome”). seja bem-vindo(a)</h3> </center> do é mostrado na Listagem 4. a diretiva foreach é usada public class CadastroVelocityServlet extends VelocityServlet { para percorrer a coleção $empregados: public Template handleRequest(HttpServletRequest request. te o merge.Jakarta Velocity A classe ProcessaEmpregados.*. Note como as variáveis são pas- } sadas para a macro – você não precisa usar // Carrega e faz um parsing inicial do template $e. No template.IOException. pois o Velocity // usando método herdado de VelocityServlet realiza uma introspecção nos objetos e try { tmplt = this.velocity. O template usa- #end</b>.java tendo os dados dos empregados. compile os . quivos apresentados anteriormente em um } novo diretório.apache. if (!email. pois o </body></html> VelocityServlet realiza essas duas operações quando handleRequest retorna.apache.Nome $e. a aplicação inicializa o Velocity. } simples.vm”).velocity. <br> O ponto de entrada de um VelocityServlet #if ($nome!= “”) é o método handleRequest. } return tmplt. Dentro do foreach. this. String email. de XML.apache.getNome(). 17:53:56 . Para testar o exemplo.vm ambiente automaticamente. que gera um pequeno trecho if (!nome. #adicionaEmpregado( $e.xml contendo return email. <html><body> Como exemplo. Também não existe a E-mail: <input type=”text” name=”email” value=”$!email”><br> <input type=”submit” name=”acao” value=”Enviar”> necessidade de chamar o método merge ou </form> abrir a saída do HttpServletResponse.nome = nome. identifica (e chama) seus métodos get. this.equals(“”)) context. a distribuição do Velocity inclui o servlet } org.equals(“”)) context. } a classe ProcessaEmpregados. Empregado.printStackTrace().put(“email”.velocity. } lê o arquivo-texto. crie os quatro ar- public Empregado(String nome.VelocityServlet. CadastroVelocityServlet. Para facilitar o uso em aplicações web.salario = salario. email). vamos criar um servlet <center> simples (Listagem 3) que usa o Velocity <h3>Olá <b> #if ($nome!= “”) $nome para gerar uma página com dados obtidos #else Visitante de um formulário HTML.Salario) // Verifica se o usuário enviou o formulário #end if (request.velocity. que } realiza a maior parte da configuração do Listagem 4. é chamada a macro String email = request. A classe Empregado. Duran- import org. adiciona a coleção ao contexto e inicia o merge.getParameter(“acao”)!= null) { String nome = request. import org.

damente. Conclusões <servlet> Sistemas de templates são uma alternati- <servlet-name>ExemploVelocity</servlet-name> va eficaz ao JSP e podem simplificar muito a <servlet-class>CadastroVelocityServlet</servlet-class> manutenção de aplicações web.properties. veloedit. diretório para os templates.. do GUJ e desenvolvedor web com experiência de vários anos em PHP e Java.loader. <web-app> .com. Mais informações em de criar ferramentas que facilitassem a www.xml padrão é false. O Velocity <init-param> vem sendo cada vez mais usado.indb 53 3/4/2003. a idéia era trabalhar com JSP na camada de apresentação.br/downloads O Velocity é configurado através do ar.com/jakarta-velocity-tools/ (isso garante que o arquivo de proprieda.net diretório raiz da aplicação web. por padrão.resource. www. macros e ajustes jakarta.br) é Bacharel em Ciência da Q uando o framework Struts foi conce- bido. Veja Downloads. alterar esse diretório para velocity.org/velocity biblioteca velocity-dep-<versao>.cache – ativa o cache /jm6/jm6-silveira-steil-velocity. copie a a configuração de cache. crie uma nova aplicação web disponíveis vão de opções de logging até incluindo o servlet compilado. .teamup. o valor Listagem 5..xml como mostrado na Listagem 5 file. É um dos fundadores do GUJ (www. documentação e subprojetos WEB-INF/lib e configure o servlet no algumas das opções mais importantes: do Velocity web.path – define o www. Vale a pena conferir – a documentação é bastante completa e há Para testar o segundo exemplo rapi. especial- <param-name>properties</param-name> <param-value>/WEB-INF/velocity.javamagazine.jar para finos para as diretivas de templates..com/jakarta-velocity-tools/ Rafael Steil (rafael@insanecorp. O subprojeto struts/docs.properties (veja adiante) para o WEB-INF/templates.guj.sourceforge.teamup. As configurações vários exemplos prontos. sentiu-se a necessidade parte da integração. o template e o arquivo aplicações web. utilizado o da aplicação mas é comum. 17:53:57 ..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”). Edição 6 • Java Magazine 53 jm6-book. Com a populari- velocity-struts (ainda em pré-release e acessível apenas pelo CVS) inclui classes adi- cionais e tarefas do Ant que automatizam Computação pela USP e programador certificado Java. instrutor da Sun Education e desenvolvedor autônomo. Configuração do servlet no web. quivo velocity.apache.log).log – determina onde são gra. runtime. Plugin para o Eclipse que simplifica a edição de vados erros e outras mensagens geradas arquivos do Velocity Configuração (o padrão é o arquivo velocity.loader.resource. dos templates que já foram parsed.br). também.com) é co-fundador integração entre os dois.com.com. file.zip Velocity e Struts Paulo Eduardo Azevedo Silveira (paulo@paulo. é struts/docs des do Velocity seja utilizado pelo servlet). em Ferramentas para integrar o Velocity ao Struts Copie. zação do Velocity.

assunto com um CD-ROM com aquelas “quinqui. subsistemas distintos: um Fernando Anselmo é autor de sete livros um projeto com principio. destinado ao público geral. nos dois onde os clientes podem se o que você queria saber sobre a JDBC” e livros. quase nunca abordado em livros de Java. isso só serve para últimos meses. pítulo completo. o autor afirma que não tem queria saber sobre a JDBC. me disse Um aspecto interessante buscando inspiração para os próximos que era por não encontrar é que esse livro não ensina textos que íamos escrever aqui para a respostas objetivas para as servlets.. dos irmãos Deitel 200 páginas tatou a brutal falta de documentação em (Java Como Programar. começar modificando algo operações como registrar lado dele. adora. solução completa. incluindo dois sobre Java: “Tudo meio e fim. pois transforma até análise mas sim modificando algo já em funcionamento devoluções e cadastrar fil- que já esteja funcionando. você encontrará um cadastrar. mas nunca os de escritores brasileiros. o outro destinado banco MySQL”. pois o o código de um projeto reservas.indb 54 3/4/2003. prestigiem cialmente conectando com o Access (como os autores tupiniquins e bons códigos! Editora Visual Books de costume em livros semelhantes) e pos- 192 páginas teriormente com o banco de dados MySQL.. o seu fervorosamente Editora Visual Books Ao procurar respostas. estudar as tecnologias. a editora não precisa pagar Fernando Anselmo projeto completo de locadora de DVDs. uma das ferramentas necessárias ao estava jogando conversa fora com o meu Sobre seu principal fator de motivação projeto: o MySQL. de Florianópolis. amigo Fernando Anselmo. Em seguida. projeto completo – incluin.org) é o Em resposta aos leitores do primeiro ISBN 8575020943 coordenador do DFJUG (Brasília Java Users Group). Em seguida.. pois como afirma Java Magazine. Com Tudo que Você Queria resposta foi se transformando em um ca. livro. domingo em Brasília. tenho sem. Editora Bookman). Estávamos para escrever. mas nunca uma para intranet com dois (e olha que ele só tomou refrigerante!). uma vantagem para nós: por ser um escri- Saber Sobre o JSP.dfjug. técnicos. Um ponto alto deste li- Ficha técnica O livro sobre JDBC tem 200 páginas e vem vro é a parte relativa aos relatórios. ao lado de uma piscina. nesta coluna. Começou a ser escrito a partir das a menor pretensão de substituir os gran- notas dos cursos ministrados pelo autor e des livros de treinamento Java no mercado. (que acontece durante a madrugada) e os ele ensina como baixar e instalar cada enquanto nossas famílias se divertiam. e eu ouvindo as bobagens que dizia códigos. do projeto. mes. que podem realizar nato – ninguém consegue ficar sério ao partindo de uma tela vazia. que o mado no livro sobre JSP (com 190 páginas. amado “formiguinhas”. consultar os Os dois livros incluem “Tudo o que você queria saber sobre o JSP. Fernando Anselmo das perguntas que os alunos lhe faziam.. R$ 39. o livro apresenta o desen- um dos maiores estava sentado ao meu senta apenas trechos de volvimento de um sistema lado. Por isso. Tudo o que você lharias” que todo desenvolvedor Java Para concluir. o sistema de locadora é reto- 54 Java Magazine • Edição 6 jm6-book. Inicialmente coqueiro. royalties ao exterior. É um cômico deva começar a codificar que o programador deve tema. filmes disponíveis e fazer quando utiliza o servidor Tomcat com o do o código fonte.. foi criado um tor brasileiro. Portanto. quando observei que nos dificuldades que teve ao o autor.00 português sobre JDBC. ou seja. sem traumas..org. que solicitaram o desdobramento www. Livros Um autor tupiniquim? Existem bons escritores brasileiros sobre Java DANIEL DEOLIVEIRA I maginem a cena: noite quente de de código Java em pura gozação. E livros que consultou apre. e ao melhor detalhá-las. Fernando cons. eu que o assistem às suas muitas palestras. R$ 37. Sua complicar a cabeça dos no- pre discutido livros de autores “gringos”. o Forte e o Tomcat. ambos da Editora Visual autor não acredita que se completo: o autor acredita aos administradores do sis- Books. crítica é que a maioria dos vatos em JSP. debaixo de um digam seus alunos do curso “corujão” também com CD-ROM). 17:54:02 . cada uma dessas tecnologias. ini.00 Daniel deOliveira (daniel@dfjug. 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. como por exemplo.

Edição 5 Java Magazine 55 jm6-book.indb 55 3/4/2003. 17:54:28 .

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