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