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 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