Velocity

Boas,

Tive aqui a procurar topicos relacionados com o velocity e vi um exemplo feito pelo Rafael aqui. No exemplo a servlet corria o ResultSet, passava o campo da tabela para um Array e depois esse array era enviado para o velocity para ser mostrado no ecran.

A minha questão é… não dá para enviar directamente o resultset para o velocity e correr os seus campos?
Se não dá… não gasta mta memoria e não é mau para o processamento estar a passar os campos todos para um array para que o velocity poder mostra-los?

Espero que alguem me possa esclarecer… Obrigado.

PEACE!

Bom… acho que da para acessar o resultset diretamente. Voce precisaria ter o numero total de registros e entao colocar o resultset no contexto do Velocity. Entao fazer um loop ate o total de registros e fazer o rs.next() no braco, para entao jogar os dados na tela.
Veja bem, nao testei isso que eu disse, mas teoricamente funciona. Um outro ponto a considerar eh que, dessa maneira, voce estaria misturando um pouco demais as camadas. De qualquer maneira, ficaria algo como

// Seila.java
...
context.put("rs", objRs);
// Colocar tmb o total de registros retornados
...
// template.html
...
#foreach [$i in [0..$totalRegistros]]
#set ($rsAtual = $objRs.next())

Nome: $rsAtual.getString("nome")<br>
#end

ou alguma coisa assim. Eu nao aconselharia fazer dessa maneira, e creio que o proejtos “corretos” tambem nao fazem.

Logicamente, colocando tudo em um array/Collection ocupara objetos na memoria, porem nao se esqueca que, como o Velocity faz introspeccao para descobrir o tipo de determinada variavel, isso consome um certo processamento extra tambem, entao nao tem mto como fugir de um certo overhead.

Rafael

Obrigado pela ajuda Rafael, mas já agora… voçê é que é o perito :slight_smile: como voçê faria?

Eu coloco em uma Collection. ArrayList, HashMap, HashMap dentro de ArrayList… o que for mais conveniente. Existe um Design Pattern chamado “Value Object”, que apesar de nao ser especificamente para este caso, consiste mais ou menos nessa ideia: colocar todo o resultado em algum array e enviar tudo de uma vez soh.

Rafael

O meu ResultSet tem vários campos… vou ter q criar um ArrayList para cada campo ? acho q isso ocuparia mta memoria não? Não estou a conseguir ver qual será a melhor maneira de fazer isto…

Voce pode criar um HashMap, e colocar os campos no HashMap. Depois coloque o HashMap dentro do ArrayList.

Rafael