Thyme leaf-SpringBoot-Targetting Map.Entry在Form绑定对象的Map属性中

时间:2016-03-25 15:01:41

标签: java spring-mvc spring-boot thymeleaf

无法找到任何示例或方法来执行此操作,最后注册到此论坛寻求帮助! 我的应用程序是问卷调查表 - 我显示问题,用户从下拉列表中选择答案。 我有两个模型属性 1)问题对象列表" questionList"是模型中的变量名称 2)salesResponse是另一个属性的变量名 - 它是SalesResponse类的对象。 SalesResponse有一个名为"的回复"这是一个TreeMap。它有一个默认的构造函数,以及"响应"的setter / getter。 在POST时,密钥应该是问题的ID,值应该是所选选项的值。 所以,应该是TreeMap。这是我想在用户进行POST时在我的salesResponse对象中填充的地图。

我的控制器将这两个对象加载到上下文中...我不确定如何编写表单!这大致是我需要的:

<form action="#" th:action="@{/ehc}" th:object="${salesResponse}"
method="post">
<table>
  <tr th:each="question: ${questionList}">
    <td th:text="${question.questionText}" th:value="${question.ID}"  
        th:name=${..what??..}
        th:field="*{THIS SHOULD BECOME the KEY in responses TreeMap}"></td>
    <td><select th:field="*{THIS SHOULD BECOME THE VALUE in responses TreeMap}">
      <option th:text="${question.option1}" th:value="2"></option>
      <option th:text="${question.option2}" th:value="4"></option>
      <option th:text="${question.option3}" th:value="6"></option>         
    </select> 
  </td>
</tr>
<tr>
    <td><input type="submit" value="Submit" /></td>
    <td><input type="reset" value="reset" /></td>
</tr>
</table>
</form>

应该怎么写? Spring会不会足够聪明,一次填充响应TreeMap,One Map.Entry?

编辑:我试过这个,它没有工作(得到这个例外),但也许它给了别人灵感来解决这个问题! java.lang.NumberFormatException: For input string: "iterStat.index"

试用代码:

<form action="#" th:action="@{/ehc}" th:object="${salesResponse}"
method="post">
<table>
<tr th:each="question,iterStat: ${questionList}">
    <td><input type="number" readonly="readonly"
        th:text="${question.questionText}" th:name="${responses}" 
        th:value="${question.ID}" 
        th:field="*{responses[iterStat.index].key}"/></td>
    <td><select th:field="*{responses[iterStat.index].value}">
      <option th:text="${question.option1}" th:value="2"></option>
      <option th:text="${question.option2}" th:value="4"></option>
      <option th:text="${question.option3}" th:value="6"></option>         
    </select> 
  </td>
</tr>
<tr>
    <td><input type="submit" value="Submit" /></td>
    <td><input type="reset" value="reset" /></td>
</tr>
</table>
</form>

1 个答案:

答案 0 :(得分:0)

在经历了许多不眠之夜之后,我已经开始工作,并将其记录下来以便其他人尝试这样做会有所帮助: 以下是视图中的代码:

<form action="#" th:action="@{/ehc}" th:object="${salesResponse}" 
method="post">

<table>
<tr th:each="entry,iterStat: ${responses}">
  <td th:text="${salesResponse.questionList[iterStat.index].questionText}"></td>
  <td><select th:name="'responses[' + ${entry.key} +']'">
<!--  <td><select th:field="*{responses[__${entry.key}__]}">-->
      <option selected="selected" th:text="${salesResponse.questionList[iterStat.index].option1}"
                                  th:value="2" ></option>
      <option th:text="${salesResponse.questionList[iterStat.index].option2}"
              th:value="4" ></option>
      <option th:text="${salesResponse.questionList[iterStat.index].option3}"
              th:value="6" ></option>         
    </select> 
  </td>

</tr>
<tr>
    <td><input type="submit" value="Submit" /></td>
    <td><input type="reset" value="reset" /></td>
</tr>
</table>

</form>

关键因素是使select标签正确。呈现HTML时,您可以看到&#34;响应[n]&#34;在选择的名称字段中。这基本上是指&#39; Key&#39;生成的映射和值字段是相应的值。 现在,做完这个,我确实注意到当我使用&#34; th:field&#34;我的回复getter在地图上只被调用了300次,只有15个条目。我用th:name替换了th:field来生成相同的html,现在只调用了15次。试图在网上寻找原因,但没有发现任何东西。现在,我很高兴继续前行,因为花了这么多时间在这个障碍上!