将列表列表的Spring-Boot模型字段与Thymeleaf

时间:2018-02-07 13:27:17

标签: java spring spring-mvc thymeleaf

我是StackOverflow的新手并且讨厌提出一个问题的想法,因为我已经看到如此多的人因为被问得不好或在其他地方被回答而被枪杀,但我似乎没有无论我怎么努力,都能找到答案。开始!

我在Spring-Boot应用程序中有以下模型:

public class Timesheet {

    //some straightforward getters/setters (e.g. id)

    public List<TimesheetRow> getTimesheetRow() {
        return timesheetRow;
    }

    public void setTimesheetRow(List<TimesheetRow> timesheetRow) {
        this.timesheetRow = timesheetRow;
    }
}

public class TimesheetRow {

    //some straightforward getters/setters (e.g. rowId)

    public List<TimesheetTask> getTimesheetTask() {
        return timesheetTask;
    }

    public void setTimesheetTask(List<TimesheetTask> timesheetTask) {
        this.timesheetTask = timesheetTask;
    }
}

public class TimesheetTask {

    //some straightforward getters/setters (e.g. taskId)

}

希望到目前为止一切顺利,并且我已经编写了Service和DAO层以获取适当的数据 - 我已经手动将一些数据写入数据库并验证了当我调用访问方法时,正在返回正确的数据。

但是,当我尝试使用Thymeleaf渲染此数据时,会出现问题。到目前为止我的代码是这样的(请原谅可怕的格式化,我只是想在整理表格结构之前让它工作):

 <table>
     <tr th:each="row,iteration : ${timesheet.timesheetRow}">
         <td>
              <!--This part actually works. Huzzah!-->
              <input type="hidden" th:field="*{timesheetRow[__${iteration.index}__].id}"/>
              <input type="text" th:field="*{timesheetRow[__${iteration.index}__].projectId}" />
         </td> 
         <td>
         <span th:each="task,iteration2 : ${row.timesheetTask}">

              <!--These two lines are particularly poor, and are just my futile attempts at trying different ways to try and reference appropriately. Sorry.-->
              <input type="hidden" th:field="*{timesheetRow.get(__${iteration.index}__).getTimesheetTask.get(__${iteration2.index}__).getId()}"/>
              <input type="text" th:field="*{task.work}"/>

         </span>
         </td>
     </tr>
 </table>

我试图根据以下答案自行解决这个问题:

nested (double) loop with thymeleaf

How to bind an object list with thymeleaf?

...但是,当第一次讨论要进入&#34;两层深,&#34;我似乎无法访问第二层,即每个单独的时间表行中的时间表任务。

据我所知,我尝试的概念代码是

的内容。
timesheet.timesheetRow[0].timesheetTask[0] 

或类似的,但这显然是可怕的语法,Java没有认识到,所以ThymeLeaf每次机会都不太可能对它做任何事情。

使用ThymeLeaf这可能完全不可能,我考虑重构代码只是将所有任务字段添加到Timesheet Row,但这可能吗?如果是这样,它将如何实现?

非常感谢,如果我不得不提出另一个问题,我将非常感谢任何有关如何改善我在黑暗的日子里提问技巧的反馈意见!

1 个答案:

答案 0 :(得分:1)

这是正确的语法:

<table>
     <tr th:each="row,iteration : ${timesheet.timesheetRow}">
         <td>
              <input type="hidden" th:field="*{timesheetRow[__${iteration.index}__].id}"/>
              <input type="text" th:field="*{timesheetRow[__${iteration.index}__].projectId}" />
         </td> 
         <td>
         <span th:each="task,iteration2 : ${row.timesheetTask}">
              <input type="hidden" th:field="*{timesheetRow[__${iteration.index}__].timesheetTask[__${iteration2.index}__].id}"/>
              <input type="text" th:field="*{timesheetRow[__${iteration.index}__].timesheetTask[__${iteration2.index}__].work}"/>

         </span>
         </td>
     </tr>
</table>