在我的Play(FOR JAVA)应用程序中,我有一个对象列表(java.util.List),它将传递给视图并将显示给用户。然后用户可以删除或不删除列表中的一些对象,之后,我想将编辑后的列表传回控制器,但我不能做最后一部分(从视图传递到控制器)。
因为我的列表可能很大,我不想用GET这样做(GET也有点不安全?!)并且不知道怎么用POST来做,(或者还有其他吗?溶液?)
如果我能得到一些帮助,那就太好了。
我的列表中的对象来自这种类型:
public class CalObj {
private String pdfFileName;
private String serialNo;
private Date calDate;
private Device device;
}
更新 谢谢@biesior,我的视图(calExtractionResults.scala.html)现在看起来像这样:
@for(calObj <- calObjList) {
<tr>
<td> @calObj.getPdfFileName</td>
<td> @calObj.getSerialNo</td>
<td> @calObj.getDevice.name</td>
<td> @calObj.getDevice.calDateToString()</td>
<td> @calObj.getCalDate</td>
<td>
<form action="@DateExtractorContr.updateList(calObjList, calObj)" method="POST">
<input type="hidden" name="serialNo" value="@calObj.getSerialNo"/>
<input type="submit" value="Delete"/>
</form>
</td>
</tr>
}
这是在我的控制器中:
public static Result updateList(List<CalObj> calObjs, CalObj objToDel){
List<CalObj> newList = calObjs;
newList.remove(objToDel);
return ok(calExtractionResults.render(newList));
}
但是当我打开相关页面时,会出现问题:
[ConcurrentModificationException: null]
答案 0 :(得分:1)
这很简单:
使用@for
语句迭代列表,并使用单独的表单包装每个元素:
@for(item <- yourList) {
<h1>@item.name</h1>
<form action="/link/to/delete/action" method="POST">
<input type="hidden" name="id" value="@item.id"/>
<input type="submit" value="Delete"/>
</form>
}
因此,删除该项目后,您可以再次重定向到列表视图。
正如您所看到的,您需要一些唯一的ID(也许serialNo
可以保留您的角色,dunno)。
编辑:当然你也可以创建一个表格复选框作为数组,如果你想删除许多元素,立即发送它。