收集并保存多个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获取发送数组