在play框架中将对象列表从视图传递到Controller

时间:2015-01-02 13:43:08

标签: java playframework playframework-2.2

在我的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));
}

但是当我打开相关页面时,会出现问题:

  1. 使用上面的代码,我得到:[ConcurrentModificationException: null]
  2. 如果我将updateList函数替换为不会产生并发异常的虚函数,则在显示页面之前,程序会通过该虚函数。在我点击删除按钮之前。

1 个答案:

答案 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)。

编辑:当然你也可以创建一个表格复选框作为数组,如果你想删除许多元素,立即发送它。