Obrigado pelas respostas galera.
Me sinto tentado a optar pela segunda opção pelo fato de que a aplicação será bastante utilizada remotamente inclusive por usuários com conexões de baixa qualidade.
Porém o ponto fraco é que essa abordagem gera esse tipo de código:
(Essa página lista o cadastro de uma fatura que possui n parcelas. O usuário pode adicionar/remover/editar essas parcelas.)
function adicionarItem(){
$(
'<tr> <br />' +
'<td><input type="hidden" name="fatura.parcelas['+$('#parcelas tr').length+'].id" /></td> <br />' +
'<td><input type="text" name="fatura.parcelas['+$('#parcelas tr').length+'].dataVencimento" class="data" /></td> <br />' +
'<td><input type="text" name="fatura.parcelas['+$('#parcelas tr').length+'].valor" /></td> <br />' +
'</tr> <br />'
).appendTo('#parcelas');
inicializarComponentes();
}
Mais adiante na mesma página, temos o código com a JSTL que irá listar os itens:
<c:forEach items="${fatura.parcelas}" var="i" varStatus="s">
<tr>
<td><input type="hidden" name="fatura.parcelas[${s.index}].id" value="${fatura.parcelas[s.index].id}" /></td>
<td><input type="text" name="fatura.parcelas[${s.index}].dataVencimento" value="${fatura.parcelas[s.index].dataVencimento}" class="data"/></td>
<td><input type="text" name="fatura.parcelas[${s.index}].valor" value="${fatura.parcelas[s.index].valor}"/></td>
</tr>
</c:forEach>
Esse é o problema, duplicidade no código, e fora a qualidade do HTML que é gerado que é bem ruin porque perde a identação (bem, isso é até aceitável ^^).
Dei uma olhada no conceito de “teamplating” com javascript, mas não vi como isso poderia me ajudar a solucionar esse tipo de problema.
Obrigado