Coletar e salvar valores enviados de várias inputs dinâmicas de HTML no servlet

Eu sou capaz de exibir um ArrayList de beans em um formulário JSP usando JSTL fazendo um loop através da lista e gerando as propriedades do bean em uma tag de input HTML.

       

Como faço para codificar o JSP de modo que, quando a página for enviada, os valores atualizados estejam no item apropriado do ArrayList ?

   

Dado este modelo simplificado:

 public class Item { private Long id; private String foo; private String bar; // ... } 

Veja como você pode fazer isso, desde que ${items} seja List :

            

(note a importância de fn: escapeXml () como prevenção de ataques XSS )

Então, basicamente, você precisa definir o identificador exclusivo do item como um campo de input oculto em cada linha, conforme mostrado no snippet acima:

  

E você deve usar este id como sufixo do name de todos os campos de input na mesma linha, como:

  

No servlet, você pode coletar todos os valores de de todas as linhas por request.getParameterValues() . Basta passar por cima e pegar as inputs individuais por id .

 for (String id : request.getParameterValues("id")) { String foo = request.getParameter("foo_" + id); String bar = request.getParameter("bar_" + id); // ... } 

Você também pode fazer tudo isso sem esse id e pegar todas as inputs pelo nome como uma matriz como name="foo" e request.getParameterValues("foo") , mas a ordenação dos parâmetros de solicitação não está sob seu controle. Formulários HTML irão enviá-lo em ordem, mas o usuário final pode facilmente manipular o pedido.

Não há necessidade de bagunça JavaScript aqui.

Veja também:

  • Mostrar o JDBC ResultSet em HTML na página JSP usando o padrão MVC e DAO
  • ServletRequest.getParameterMap () retorna Map e ServletRequest.getParameter () retorna String?
  • Envie um Array com um HTTP Get