Introdução ao Velocity

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.

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.

<template-context>
  <reference name="lista">
    <value>Lista 1</value>
    <value>Lista 2</value>
    <value>Lista 3</value>
    <value>Lista 4</value>
    <value>Lista 5</value>
  </reference>

  <reference name="cargo">
    <value>Engenheiro de Software</code>
  </reference>
</template-context>

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

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

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.

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?

Voce precisa especificar quais arquivos de macros vc vai estar usando. Para isso, use a diretiva “velocimacro.library”, passando o nome ( ou nomes ) do arquivo com as macros.
Para desenvolvimento, eh interessante setar “velocimacro.library.autoreload” para “true”, assim qdo vc alterar o arquivo com as macros, nao sera necessario restartar o tomcat.

Outro detalhe: se vc colocar uma macro dentro de um template ( e nao no arquivo de templates ), toda vez que vc alterar essa macro local vc precisara restartar o tomcat, pois mesmo com o cache setado pra false, o Velocity parece ignorar as tuas alteracoes na macro local… puta saco isso.

Nao conheco outra forma de redirecionar que nao seja usando o welcome-file.

Rafael

[quote=“Rafael Steil”]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[/quote]

já entendi que vc pode utilizar o velocity para gerar qualquer tipo de código como HTML,JSP,XML… mas como assim não preciso usar JSP?

como gerar o código eu entendi… mas como fazer isso dinamicamente?

por exemplo, eu já tratei minha requisição com um Servlet e agora vou enviar a resposta a uma página com JSP… mas se o JSP foi substituido pelo Velocity… como eu faça então?

não seu se consegui deixar claro minha dúvida! :?

Ricardo

JSP voce usa para gerar o HTML, certo? Entao, com Velocity, ao inves de voce colocar as tags do JSP, voce coloca as do Velocity e usa uns metodos dele para fazer o processamento e jogar o resultado para o browser.

Rafael

O velocity pode o substituir JSP?

fica mais rápido?

Sim, pode perfeitamente.

Velocidade depende de como eh a qualidade do teu codigo. ( mas fica muito rapido sim ).

Rafael

[quote=“Elvis.The.Pelvis”]#parse(“macros.txt”)

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?
[/quote]

Deveria funcionar. Se voce vai usar como global essas macros, tem uma propriedade pra isso no velocity.properties. algo como global.vm.

Bem. Entao voce vai ter de mapear por servlet mapping.

[quote=“Elvis.The.Pelvis”]
Mais uma coisa, posso definir vários paths para
file.resource.loader.path?[/quote]

Sim, separa por virgula porque o velocity usa o extendProperties do jakarta-commons-colletcions. Voce pode setar essas variaveis em runtime tambem, eu acho mais interessante.

Bom dia a todos,

Gostaria de receber uma pequena dica. Acabo de instalar o velocity e tudo funcionou muito bem.

Gostaria de saber com posso configurar meu ambiente para não precissar usar o classpath, eu setei os .jars no classpath e isso me forçou a colocar o caminho de onde estão minhas classes também para que o classloader(java) as encontra-se. Gostaria de não precissar usar o classpath.

Obrigado
Marcos

Essas libs do Java que voce falou eh a rt.jar, por acaso?. Parece que voce esqueceu de incluir alguma coisa no classpath. Geralmente, fazendo

*nix ( bash )

export CLASSPATH=$CLASSPATH:/dir/meuJar1.jar:/dir/meuOutroJar.jar

Win

set CLASSPATH=%CLASSPATH%;c:\dir\meuJar1.jar

resolve o problema.

Rafael,

Primeiro obrigado.

A questão é a sequinte, quando eu instalo o velocity tenho que referenciar os .jars que contém as classes necessárias ao velocity. No artigo que tem no GUJ dis para eu setar no classpath o velocity-dep-x.x.x.jar e o velocity-x.x.x.jar no classpath onde x.x.x é a versão do velocity.

Ao faze-lo o meu ambiente passa a não enxergar orde está as minhas classes. por exemplo: c: esteVelocity este.java
c: esteVelocity este.vm
c: esteVelocity este.class
Ele compila legal mas não executa a classe, a menos que eu sete no mesmo classpath o diretório c: esteVelocity.

Ou seja tudo funcionou muito bem. Mas quero chegar a uma solução, caso tenha como, onde eu não tenha que setas no classpath os arquivos .jars para que assim eu não tenha que setas os diretórios onde eu tenho classes para executar.

E que eu nunca uso o classpath. Gostaria de saber como não usá-lo agora também. E aproveitando, gostaria de saber se não usar o classpath é uma boa ou não e porque.

Obrigado
Marcos

Quando as bibliotecas estao em .jar’s eh necessario referenciar cada uma mesmo, nao tem jeito. O problema que voce esta tendo eh porque faltou o diretorio corrente, representado pelo caracter de ponto, no classpath… por isso que ele nao achava a classe no diretorio que voce estava.

set CLASSPATH=.;XXXXX

note o “.;” ( ponto-e-virgula )… isso diz ao java para procurar as classes tambem no diretorio que voce se encontra.

Rafael

Rafael,

Muito obrigado.

Resolveu. Não sabia do “.;”. Se tivese que setar cada diretório onde tenho classes no classpath seria terrível.

Novamente Obrigado,
Marcos

Webwork2 e velocity!
Estou com essa dúvida de como fazer isso:

Seguinte:
preciso colocar valores dentro de um combobox usando tags do velocity no webwork2… uma combobox normal que seri no html

<select>
<option></option>
</select>

o que não ta dando certo seria colocar os valores no option…

to fazendo o seguinte :

eu crio meu array:
#set ($prior = [“Normal”, “Alta”, “Baixa”])

dai quando tento chamar os valores do array:

#bodytag (Form “name=‘name’” “action=‘InavisAction.action’” “method=‘post’”)

#tag(Select “label=‘Prioridade’” “name=‘inavis.avisTpPrioridade’” “value=$prior”)

#end
ele não consegue pegar o valor da variavel $prior dentro do value aí, o curioso é que se colocar fora ele traz os valores…

conclusão : não consigo miontar uma combobox com valores queeu quero definir…
alguem pode dar um help!

[/code][code]

Quer saber qual propriedade diz onde o Velocity grava os logs? Aqui está:

runtime.log = path/arquivo.log

penei muito para encontrar, aproveite a dica! :stuck_out_tongue:

[quote=“Rafael Steil”]Sim, pode perfeitamente.

Velocidade depende de como eh a qualidade do teu codigo. ( mas fica muito rapido sim ).

Rafael[/quote]

Bom, isso você está certo, usamos Velocity aqui para gerar códigos e com parser view, mas jsp é melhor… hehehe

Oi

Como consigo gerar arquivos .java com o velocity? alguem tem algum exemplo?

Obrigado…