Variáveis velocity - Como obte-las?

10 respostas
Elvis.The.Pelvis

Como faço para saber quais as variáveis que existem no meu template velocity (para, por exemplo, construir uma interface gráfica para preenche-las)?

O método getKeys() do VelocityContext só retorna as variáveis que já possuam algum valor atribuído…

10 Respostas

cv1

Rolou uma discussao sobre isso nas listas de discussao do Velocity ha um tempo atras. Vou ver se acho as mensgens e ja retorno :wink:

cv1

AHA!

http://www.mail-archive.com/[email removido]/msg09348.html

:wink:

Paulo_Silveira

credo
eh quase um reflection dentro do template! :slight_smile:

Elvis.The.Pelvis

Valeu cv.

Eh isso emsmo Paulo.

Mas eu não posso acreditar que não seja possível.
Quando você faz context.put(“nome”, “algo”); o velocity vai ter que procurar pela variável ${nome} não é verdade? Acredito que ele não parseie o template toda vez para saber se a variável existe. Ele deve conter um HashMap interno (ou alguma outra forma de armazanar isso) com os nomes.

Vou dar uma olhada nas listas. Falows!!!

[]s

Paulo_Silveira

entao
o Context eh um mapa sim
o getKeys resolve nesse caso!

voce coloca o contexto dentro do contexto

context.put(“contexto”,context)

e no template

#foreach($var in $contexto.keys)

Elvis.The.Pelvis

Assim não rola paulo.

Eu não quero listar as keys dentro de um template (como vc fez usando #foreach).

O que eu quero é o seguinte:

1 - minha classe Java lê o tamplate.
2 - Depois ela pega o nome das variáveis que existem no template.
3 - Ela usa o nome dessas variaveis para montar uma GUI, contendo text areas para que o usuário preencha os valores delas.
4 - Para cada valor preenchido, eu chamo context.put(“nome da variavel”, o valor que o usuario preencheu atarvés da GUI).
5 - Chamo o merge() para gerar o output.

Seria algo ± assim

//esse é o método que eu quero descobrir se existe no velocity
String [] variaveis = context.meListeAsVariaveisDoTemplate("templateX");

exibeGui(variaveis);

for(int i = 0; i < variaveis.length; i++) {
  context.put(variaveis[i], GUI.getValor(variaveis[i]));
}

template.merge(...);

Sacou?

Preciso de ajuda pra isso. Acho que o velocity não faz isso não :(.
Rafael, alguma ajuda aki???

[]s

Rafael_Steil

Nao eh exatamente assim o funcionamento. O VelocityContext usa um mapa interno, no qual voce vai colocando todas as variaveis/objetos que deseja que estejam disponiveis a determinado template.
A partir do momento que merge() eh chamado, o parser do template vai la, abre o arquivo e sai procurando pelas tags. A partir do momento em que ele acha algum $xxx, procura no contexto uma key com esse nome, e faz a devida troca.

De qualquer maneira, o core do Velocity me foge a um conhecimento detalhado. De uma olhada na classe TemplateNodeView, talvez de pra fazer algo com ela.

Rafael

Elvis.The.Pelvis

Tô ligado. O contexto guarda as “variáveis” velocity. Dessa forma você pode usar o mesmo contexto para vários templates. É só possuir as variáveis que vão ser necessárias lá.

Ok então. De qualquer forma, como o usuário vai criar o template através da própria GUI, posso colocar um botão lá (Criar Variável…) que armazena seu nome e sua descrição em um arquivo properties.

Dessa forma, quando for rodar o template, a GUI lê o properties associado e exibe as variáveis através de sua descrição.
Como a classe property me permite obter todas as keys dela o problema está resolvido.

Se alguém precisar criar um tmeplate na mão, paciência. Vai ter que configurar o property na mão.

Valeu pela força…

[]s

louds

Quer realmente todas properties?
Pega a gramatica do velocity, acho que é para javacc, e modifica ela para te informar isso apenas.

Vc vai ter exatamente as mesmas informações que o velocity.

cv1

…e e’ exatamente isso que o Template Tool que eu mostrei na 3a msg dessa thread faz, louds :wink:

Criado 8 de agosto de 2003
Ultima resposta 8 de ago. de 2003
Respostas 10
Participantes 5