Introdução ao Velocity  XML
Índice dos Fóruns » Artigos e Tutoriais
Autor Mensagem
Administrador
Java Eldar

Membro desde: 02/08/2002 12:27:02
Mensagens: 0
Offline

Assunto: Através deste longo tutorial, apresentaremos as vantagens e facilidades de utilizar uma ferramenta de templates. Desta maneira, você irá separar a lógica do seu programa da apresentação dos resultados.

Você pode ler este tutorial na íntegra http://www.guj.com.br/java.artigo.18.1.guj

Por favor, coloque as suas dúvidas e seus comentários sobre este tutorial aqui.
Sinta-se livre para fazer qualquer tipo de pergunta, desta maneira você estará nos ajudando e aos outros usuários!

This message was edited 1 time. Last update was at 19/07/2005 21:29:56

[Email]
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Acho que deu para entender legal como o velocity funciona. O código está bem simples e fácil de entender.

è bom ficar claro, que apesar do VTL ser uma linguagem de template, que processa essa linguagem é o próprio java!

Tem gente que me pergunta "Se eu usar o velocity, vou estar usando outra linguagem, precisa compilar ou algo assim?". A linguagem do velocity eh interpretada, e o interpretador eh em java! O interpretador faz parte do pacote do velocity. Voce nem chega a mexer com ele diretamente!

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Outra coisa que me perguntaram era se o velocity trabalhava junto com HTML.

Bom, menciono isso no tutorial, mas acho que nao deve ter ficado muito claro. De qualquer maneira, SIM, Velocity pode ser usado no meio de HTML, tanto que esse eh um dos maiores usos da ferramenta. Com Velocity vc NAO PRECISA DE JSP, ele substitui jsp.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
FLC
JavaGuru

Membro desde: 15/08/2002 15:30:08
Mensagens: 212
Localização: São Paulo
Offline

To com uma duvida...

Eu tenho uma variavel $vetor, que eh uma referencia pra um array do Java. Eu posso usar o foreach pra iterar pelo vetor, certo? Mas tem como eu pegar um elemento em uma posicao especifica do vetor? Algo como $vetor[1]???
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

hum

acho que de array nao, mas se fosse um ArrayList, voce poderia dar um $vetor.get(1)

lembre-se, que usando isso, voce ta meio que quebrando o MVC. mas nao tem como evitar muito. soh fica esperto para nao deixar muito o business logic no seu view, que ai eh fogo!

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
PJ2002
Debugger

Membro desde: 11/11/2002 23:15:35
Mensagens: 54
Localização: São Paulo
Offline

Opz... Paulo... surgiu aquela duvida quando vc mensionou sobre uma eventual quebra do pattern MVC.
Olha jah utilizei vector retornando de uma camada d negocio junto a jsps, e realmente nao eh legal.
Com Velocity como poderia funcionar substituindo o jsp?
Como um exemplo p/ ti quando usei um vector com jsp's, foi da seguinte maneira.

<select name="Nacionalidade" onchange="setarNacionalidade()">
<%!Vector vNac = new Vector();%>
<%oNac.setAcationNac("findNacionalidade");%>
<%oNac.execActionNac();%>
<%vNac = oNac.getID_Pais();%>
<%int size = vNac.size();%>
<%int divize = size / 2;%>
<%String[] ID_Nacionalidade = new String[divize];%>
<%String Pais[] = new String[divize];%>
<option value="none">Escolha um Pais
<%for(int i=0; i < size; i++) { /* ini2 */%>
<option value="<%=ID_Nacionalidade[0] = (String) vNac.get(i)%>">
<%i++;%><%=Pais[0] = (String) vNac.get(i)%>
<%} /* fim2 */%>
<%} %>

Teria alguma dica a exemplificar o meu caso!? Sou iniciante em velocity e gostaria de ter uma dica d como um template poderia ser usado neste caso, para nao usar jsp's (se for o necessario) e assim deixar a camada View mais clara e eficiente para uma possivel manutencao.

Agradeço pela atencao!

PJ2002.
[Email] [MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Bom, antes de mostrar como fazer com Velocity, o seu codigo JSP ficaria muito mais legivel se fosse feito assim:



ps: achei meio estranho vc criar um array de size / 2 tamanho mas sempre atribuir os dados a posicao 0 no array..

Bom, indo pro assunto principal, para fazer isso com Velocity vc tera que mudar o codigo Java para um arquivo .java, o qual ira executar as acoes de encontrar a nacionalidade etc etc.. entao, ao inves de fazer um loop como vc fez, vc primeiro coloca em um ArrayList e entao configura esse ArrayList em um contexto visivel ao Velocity, e depois eh so usar as tags da VTL ( Velocity Template Language - tem um tutorial aqui no guj sobre isso ) para mostrar os dados.
Como nao entendi mto bem o teu exemplo, vou mostrar com um outro codigo bem simples de entender: pegamos do banco de dados a relacao de nomes dos empregados de uma empresa, e entao fazer um template para mostrar esses nomes em um <select>.
Se fossemos fazer em JSP ficaria mais ou menos assim:



Para fazer isso com Velocity, movemos o codigo java para um arquivo .java, o qual ira se encarregar se processar tudo e colocar em um ambiente visivel ao velocity. Se fosse um ambiente real de producao e se quisessemos seguir corretamente as regras de Design Patterns, o exemplo aqui teria que ser mais separado as camadas ainda, mas para fins didaticos nao eh necessario tamanha abstracao .
Basicamente o que precisamos fazer eh isso:



ps: o codigo acima ( o que cria o contexto do velocity ) na maior parte das
vezes vai ser um Servlet.

Bom, com isso ja tiramos o codigo Java da camada de apresentacao, agora precisamos montar o template para mostrar os dados na tela:



e pronto!!! Viu como a parte de montar o layout ficou super simples e sem uma unica linha de java dentro?!

Bom, basicamente eh isso. Apesar de dar mais trabalho na hora de programar, ja que eh preciso pensar melhor como o codigo vai ser feito, precisa fazer os .java e o Servlet, a medio/longo prazo compensa mto, pois a manutencao do sistema fica muito mais facil e simples.
Sei que o exepmlo fico meio grande e nao mostrou codigos concretos, mas eh que ficaria inviavel postar tudo no topico. Como voce ja deve ter visto, ja entrou um tutorial sobre a VTL, e na semana que vem ja estara entrando mais um tutorial de Velocity, o qual ira mostrar - e explicar - exemplos de aplicacoes usando Servlets e XML com Velocity. Portanto, caso nao tenha entendido tudo, ja esta vindo um tutorial ai

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
debora
Smalltalk

Membro desde: 29/01/2003 14:32:10
Mensagens: 1
Offline

Rafael,

no meu caso coloquei um a seguinte instrução no meu action:

resultContext.put("pm_cList", pm_cList.toArray());

e no meu html estou colocando:

teste: $pm_rfpList.length

porém a mesma expressão é impressa, ao invés de

teste: 1

como se o objeto em questão não existisse, a prova que o objeto está ok está mais abaixo no código:

#foreach ($pm_rfp in $pm_rfpList)

esta expressão está funcionando corretamente.

vc saberia me dizer onde está o problema?

grata

Débora
Paulo Silveira
Administrador
[Avatar]

Membro desde: 07/08/2002 18:38:50
Mensagens: 4204
Localização: São Paulo
Offline

Debora

os nomes das suas variaveis nao estao batendo!

voce colocou no context uma tal de "pm_cList", mas dentro do tempalte voce tenta acessar "$pm_rfpList", que simplesmente nao existe no contexto, por isso ele nao interpreta

http://blog.caelum.com.br twitter: @paulo_caelum


[Email] [WWW]
Bruno Cardoso
Java Ninja

Membro desde: 30/11/2002 14:35:21
Mensagens: 260
Localização: Porto, Portugal
Offline

Boas!

Gostei do tutorial, realmente o velocity parece facilitar as coisas em relação à apresentação dos dados, só queria alertar q o tutoral tem um pequeno erro, repare no seguinte código:


Em cima foi usado a variavel $lista para representar o array mas depois no ciclo foi usada a $list, ou seja os elementos não vão ser listados pq n existe nenhum array chamado $list mas sim um chamado $lista, é um pequeno erro fácil de detectar mas de qq maneira pode levar mta gente ao engano.

Fiquem bem

"If I find 10.000 ways something won't work, I haven't failed." - Thomas Edison
[Email]
rbarioni
GUJ Master
[Avatar]

Membro desde: 02/09/2002 10:49:11
Mensagens: 1317
Localização: Campinas
Offline

fala galera.....

seguinte....gostei mto da utilidade do velocity....

mas tenho a seguinte situacao aqui....
preciso gerar relatorios via web no meu sistema....nao quero usar .pdf pq toda vez q gerar, vai ter q abrir o acrobat, etc...

entao o nosso amigo dukejeffrie me disse p/ usar o Velocity p/ exibir os relatorios como HTML....

alguem pode me ajudar a resolver esse problema??
estou gerando meus relatorios usando o JasperReports ( ele gera um .xml e monta o relatorio a partir dele)...

valew galera.

"Ozzy Osbourne pode ter inventado o heavy-metal, mas com certeza, Metallica o aprimorou."
[Email] [MSN] [ICQ]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

***Editado***
Eita o tutorial é do Rafael. Mals ai. Qualquer um que puder respondel ta blz.
***Editado***
Paulo, acabei de ler o tutorial de velocity. Tem como processar o velocity junto com xml?

Digo, no exemplo, foi escrito uma classe que "configurava" o contexto sobre o qual o velocity ia ser processado. Significa que tenho que ter uma classe para cada ".vm" certo?

Imagine agora que você escreve uma única classe que funcione como um template output builder e você configuraria o contexto através de .xml.

No caso, você não teria a classe da listagem VelocityListProcess e sim um xml +- assim.



No caso, teriamos duas referências: "lista" que, por possuir varias filhas "value", o builder entende que é uma coleção e "cargo", com um único valor e uma variável "normal".

Dessa forma, você não precisa recompilar classes java.

Não sei nada de velocity ainda, acabei de ler o primeiro tutorial. Ele já tem algo parecido? Se não tem, vale a pena implementar algo do tipo (pergunto isso pela experiência que vocês devem possuir, talvez o ganho seja mínimo)?

Como só vi chamadas as referências, pode ser que a idéia conflita com algo que haja mais na frente.

[]'s

Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
Rafael Steil
Administrador
[Avatar]

Membro desde: 31/08/2002 02:35:53
Mensagens: 5984
Localização: São Paulo
Offline

Elvis.The.Pelvis wrote:
Digo, no exemplo, foi escrito uma classe que "configurava" o contexto sobre o qual o velocity ia ser processado. Significa que tenho que ter uma classe para cada ".vm" certo?


Nao, nao precisa. Voce pode ter uma unica classe para a qual voce passa qual template processsar, por exemplo. Ou seja, voce implementa da maneira que achar melhor.

No mais, o que voce perguntou sobre o XML nao da para fazer, nativamente com o Velocity. Seria necessario fazer a implementacao da classe que processa o XML para entao trabalhar com o Velocity.

Rafael

"working code attracts people who want to code. Design documents attract people who want to talk about coding - Charles Miller"

http://rafaelsteil.com
http://twitter.com/rafaelsteil
http://www.jforum.net
http://www.flickr.com/photos/rafaelsteil
[Email] [WWW]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

A idéia é essa mesmo, desenvolver uma classe.
Mas dessa forma, eu teria que ter conhecimento prévio dos valores da variável que precisariamos passar, para colocar no XML.
Com certeza isso é o que menos acontece, os parâmetros vem dinâmicos...
Acho que não rola não.

Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
Elvis.The.Pelvis
JavaGuru
[Avatar]

Membro desde: 18/12/2002 17:45:34
Mensagens: 220
Localização: Recife/PE
Offline

Paulo ou Rafael, preciso de um help no velocity. Não sei se vocês deram uma olhada no macros.vm da aplicação velocity + struts.

O que tentei fazer foi uma mini biblioteca de macros, para "parsear" dentro de meus outros templates. Cada template meu teria então:

#parse("macros.txt")

Pois todos utilizariam as macros contidas nesse template. Dessa forma, não preciso colar o texto de todas as macros em cada template que eu possua. Se vocês viram, não consegui fazer isso.

Quando usei #include, o conteudo foi incluido e gerado como output, mas ao usar #parse, não consegui usar as macros de dentro do template, ele não reconheceu as macros. To fazendo algo errado?

E mais, como faço para quando o usuario acessar algo do tipo http://localhost/projeto ele não liste o conteúdo do diretório, mas redirecione para o meu VelocityServlet e ele reconheça que deve chamar o index.vm? (não quero usar o welcomefile).

Mais uma coisa, posso definir vários paths para
file.resource.loader.path?

Se não fosse o C, até hoje estaríamos programando em BASI, PASAL e OBOL.
Elvis.The.Pelvis é Daniel Freitas
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Artigos e Tutoriais
Ir para:   
Powered by JForum 2.1.8 © JForum Team