Java Spring MVC-Thymeleaf表单与arraylist绑定
在特定视图中,我确实有一个可扩展的员工列表。每个员工有两个字段,分别是Java Spring MVC-Thymeleaf表单与arraylist绑定,java,spring,spring-mvc,thymeleaf,Java,Spring,Spring Mvc,Thymeleaf,在特定视图中,我确实有一个可扩展的员工列表。每个员工有两个字段,分别是工时和预付款。点击一个按钮,我想发布整个表单。为了实现这一点,我将向视图发送一个列表,其中包含几个POJO(基于员工数量) 添加到列表中的POJO如下所示: @Setter @Getter @NoArgsConstructor public class WorkdayCommand { private Long employeeId; private Integer hoursWorked; priv
工时
和预付款
。点击一个按钮,我想发布整个表单。为了实现这一点,我将向视图发送一个列表,其中包含几个POJO(基于员工数量)
添加到列表中的POJO如下所示:
@Setter
@Getter
@NoArgsConstructor
public class WorkdayCommand {
private Long employeeId;
private Integer hoursWorked;
private Integer advancePayment;
}
<form th:object="${workdayForm}" th:action="@{/addworkday}">
<!-- table headers -->
<tr th:each="workdayCommand, i : ${workdayForm.workdayCommand}">
<td><input type="text" class="form-control" placeholder="Enter hours" th:field="*{workdayCommands[__${i.index}__].hoursWorked}"></td>
<td><input type="text" class="form-control" placeholder="Enter payment" th:field="*{workdayCommands[__${i.index}__].advancePayment}"></td>
<td><input type="hidden" th:field="*{workdayCommands[__${i.index}__].employeeId}"/></td>
</tr>
<!-- table footers -->
</form>
在控制器中,我确实有一行代码将列表添加到模型中:
model.addAttribute("workdayCommands", employeeService.getListOfWorkdayCommandsWithIds());
以及形成实际列表的方法:
public List<WorkdayCommand> getListOfWorkdayCommandsWithIds(){
List<WorkdayCommand> listOfCommands = new ArrayList<>();
List<Long> listOfIds = employeeRepository.getListOfIds();
for(int i = 0; i < employeeRepository.getNumberOfEmployees(); i++){
WorkdayCommand workdayCommand = new WorkdayCommand();
workdayCommand.setEmployeeId(listOfIds.get(i));
listOfCommands.add(workdayCommand);
}
return listOfCommands;
}
如何将arraylist与视图正确绑定?我想问题是arraylist中没有hoursweed
这样的字段。我应该使用哪个th:field
参数来访问实际的workday命令。hoursweated
字段,然后遍历列表以遍历所有员工?如果您需要更多信息,请随时询问
我试着做一些事情,比如:
th:field="*{[__${iter.index}__].hoursWorked}"
…但这仍然不起作用。我跟名单上的第一个POJO没什么关系
编辑2
我的完整视图如下所示:
在一个表格行中,我确实有一些员工信息以及2个输入和2个按钮。每一行的创建都得益于:
<tr th:each="employee : ${employees}">
点击submit按钮时,将创建一个新的Workday对象,然后将其保存到数据库中。发生这种情况时,需要将工作日关联到相应的员工。因此,我的:
<tr th:each="employee : ${employees}">
…我还分配了一个隐藏的
id
字段。然后我们有workday命令
,它从视图中收集所有信息。因此,employeeId
字段是我将工作日与相应员工关联的方式。它应该使用为每个显示所有信息的对象传递的id
值。希望现在清楚了。您不能将数组列表作为th:object
直接绑定到该列表。相反,您应该创建一个将ArrayList作为属性的对象
@Setter
@Getter
@NoArgsConstructor
public class WorkdayForm {
private List<WorkdayCommand> workdayCommands = new ArrayList<>();
}
@Setter
@吸气剂
@诺尔格构装师
公务舱工作日表格{
private List workday commands=new ArrayList();
}
然后循环,并像这样绑定它们:
@Setter
@Getter
@NoArgsConstructor
public class WorkdayCommand {
private Long employeeId;
private Integer hoursWorked;
private Integer advancePayment;
}
<form th:object="${workdayForm}" th:action="@{/addworkday}">
<!-- table headers -->
<tr th:each="workdayCommand, i : ${workdayForm.workdayCommand}">
<td><input type="text" class="form-control" placeholder="Enter hours" th:field="*{workdayCommands[__${i.index}__].hoursWorked}"></td>
<td><input type="text" class="form-control" placeholder="Enter payment" th:field="*{workdayCommands[__${i.index}__].advancePayment}"></td>
<td><input type="hidden" th:field="*{workdayCommands[__${i.index}__].employeeId}"/></td>
</tr>
<!-- table footers -->
</form>
您还应该重复使用workday命令
,就像在员工
上一样,我在哪里可以这样做?在表单中
标签?好的。这是合理的。还有一个问题。首先,在遍历雇员时,隐藏字段id
将获得分配的值。需要将相同的值传递到支持对象中的employeeId
字段。这样,我可以肯定,工作时间和报酬都分配给了正确的员工。我不能在单个表行中包含2th:each
。。。关于如何解决这个问题有什么线索吗?我不知道你的意思。。。workCommand
上的employeeId
是什么?为什么需要循环遍历员工?workdayCommand应该将员工作为其属性,然后。。。作为循环的一部分,您可以像这样显示员工信息:
,或者您可以只循环员工而不是Workday命令。在我看来,一切都会保持不变。