收集并保存多个dynamicHTMLinput的提交值返回到servlet

我可以使用JSTL在JSP窗体中显示一个Bean的ArrayList ,方法是循环访问列表并在HTMLinput标记中输出Bean属性。

 <c:forEach items="${listOfBeans}" var="bean"> <tr> <td><input type="text" id="foo" value="${bean.foo}"/></td> <td><input type="text" id="bar" value="${bean.bar}"/></td> </tr> </c:forEach> 

我该如何对JSP进行编码,以便在页面提交时更新的值位于ArrayList的相应项目中?

鉴于这个简化的模型:

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

提供${items}List<Item>如下:

 <c:forEach items="${items}" var="item"> <tr> <td> <input type="hidden" name="id" value="${item.id}" /> <input name="foo_${item.id}" value="${fn:escapeXml(item.foo)}" /> </td> <td> <input name="bar_${item.id}" value="${fn:escapeXml(item.bar)}" /> </td> </tr> </c:forEach> 

(注意fn:escapeXml()作为XSS攻击防范的重要性)

因此,基本上,您需要将项目的唯一标识符设置为每行中的隐藏input字段,如上面代码段所示:

 <input type="hidden" name="id" value="${item.id}" /> 

而你应该反过来使用这个id作为同一行中所有input字段的name的后缀,如:

 <input name="foo_${item.id}" ... /> 

在servlet中,您可以通过request.getParameterValues()从所有行中收集<input type="hidden" name="id" ...>的所有值。 只需循环,然后通过id获取各个input。

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

你也可以在没有这个id情况下完成所有的操作,并像name="foo"request.getParameterValues("foo")那样通过名字获取所有的input,但是请求参数的sorting不受你控制。 HTML表单将按顺序发送,但最终用户可以轻松地操作订单。

这里不需要JavaScript的混乱。

也可以看看:

  • 在JSP页面中使用MVC和DAO模式在HTML中显示JDBC ResultSet
  • ServletRequest.getParameterMap()返回Map <String,String []>和ServletRequest.getParameter()返回String?
  • 用HTTP获取发送数组