在Thymeleaf模板上绑定嵌入的对象列表以获取POST请求

时间:2016-11-17 18:25:47

标签: java spring-mvc thymeleaf

我正在开发一个杂货店列表Web应用程序。一个功能应该是(un)检查列表中找到/购买的项目。显示所有值工作正常。但是,当我检查一些购买的项目上的一些复选框并尝试POST后,spring MVC控制器中的inc @ModelAttribute为空(除了id)。

我希望你能帮助我。

以下是我的课程:

public class PurchaseList {

private Long id;
private List<PurchaseItem> purchaseItemList;
private DateTime purchaseDate;
private boolean done;
}


public class PurchaseItem {

private Long id;
private String purchaseItemName;
private PurchaseCategory purchaseCategory;
private PurchaseList purchaseList;
private boolean found;
}

控制器:

@RequestMapping(value="/{id}", method=RequestMethod.POST)  
public String postPurchaseList(@PathVariable(value="id") Long id, @ModelAttribute("purchaseList") PurchaseList purchaseList, Model model) {
  List<PurchaseList> notDonePurchaseList = purchaseListService.getNotDonePurchaseList();
  model.addAttribute("notDonePurchases", notDonePurchaseList);
  purchaseListService.savePurchaseList(purchaseList);
  return "purchaseList";
}

Thymeleaf模板

<form action="#" th:action="@{/purchaseList/{purchaseListId}/(purchaseListId=${purchaseList.id})}" th:object="${purchaseList}" method="post">
      <table class="table table-bordered table-hover">
        <thead>
          <tr>
            <td>Found</td>
            <td>Item</td>
            <td>Category</td>
          </tr>
        </thead>
        <tr th:each="item,status : ${purchaseList.purchaseItemList}">
          <td><input type="checkbox" th:checked="${item.found}" th:value="*{purchaseItemList[__${status.index}__].found}" /></td>
          <td th:text="${item.purchaseItemName}"></td>
          <td th:text="${item.purchaseCategory.categoryName}"></td>
        </tr>
      </table>
      <input type="submit" value="Submit" id="submit" />
      </form>

我知道我没有设置其他值(只有found属性)。或者这是问题吗?

祝你好运

修改

  1. 根据建议ArrayList purchaseItemList初始化。现在,空的ArrayList将返回给控制器。

2 个答案:

答案 0 :(得分:1)

初始化PurchaseList类中的purchaseItemList。 public class PurchaseList { private Long id; private List<PurchaseItem> purchaseItemList=new ArrayList<>(); private DateTime purchaseDate; private boolean done; }

为输入字段指定一个这样的id。

<td><input type="checkbox" th:checked="${item.found}" th:value="* {purchaseItemList[__${status.index}__].found}" th:id='purchaseList.purchaseItemList[__${status.index}__].found'/></td>

答案 1 :(得分:0)

我发现了问题和解决方案。

我在一些教程和博客文章中看到th:field=*{..}的用法,但我没有使用它,因为我信任Spring Tool Suite(它不提供th:field属性自动完成。因此我确信此属性不能再使用。但我错了。我将模板代码中的一些*th:value=${..}属性更改为th:field=*{..},如下所示:

<form action="#" th:action="@{/purchaseList/{purchaseListId}/(purchaseListId=${purchaseList.id})}" th:object="${purchaseList}" method="post">
  <input type="hidden" th:field="*{id}" />
  <input type="hidden" th:field="*{purchaseDate}" />
  <input type="hidden" th:field="*{done}" />
  <table class="table table-bordered table-hover">
    <thead>
      <tr>
        <td>Found</td>
        <td>Item</td>
        <td>Category</td>
      </tr>
    </thead>
    <tr th:each="item,status : ${purchaseList.purchaseItemList}">
      <td><input type="checkbox" th:checked="${item.found}" th:field="*{purchaseItemList[__${status.index}__].found}" th:id="${'purchaseList.purchaseItemList[__${status.index}__].found' + 'status.index'}"/></td>
      <td th:text="${purchaseList.purchaseItemList[__${status.index}__].purchaseItemName}">
        <input type="hidden" th:field="*{purchaseItemList[__${status.index}__].purchaseItemName}" 
        th:value="${purchaseList.purchaseItemList[__${status.index}__].purchaseItemName}"
        th:id="${'purchaseList.purchaseItemList[__${status.index}__].purchaseItemName'}"
        />
      </td>
      <td th:text="${item.purchaseCategory.categoryName}">
        <input type="hidden" th:field="*{purchaseItemList[__${status.index}__].purchaseCategory.categoryName}" 
        th:value="${purchaseList.purchaseItemList[__${status.index}__].purchaseCategory.categoryName}"
        th:id="${'purchaseList.purchaseItemList[__${status.index}__].purchaseCategory.categoryName'}"
        />
      </td>
    </tr>
  </table>
  <input type="submit" value="Submit" id="submit" />
  </form> 

现在效果更好。我在控制器中获得“找到”属性。其他值未设置。但我认为我在隐藏的输入字段中弄乱了一些东西。