【问题标题】:Get a list of object with thymeleaf用百里香叶获取对象列表
【发布时间】:2015-05-18 18:27:22
【问题描述】:

我正在尝试以百里香叶的形式获取值。该表单是一个表格,其中有几个代表 CallDataRecord 的一行。我正在寻找的行为是获取包含每个元素列表的 CallDataRecord。

这是我的控制器:

@RequestMapping(value="/usage", method=RequestMethod.POST)
public ModelAndView usageSubmit(@ModelAttribute CallDataRecord cdr, ModelAndView mav) {
    System.out.println(cdr.getRecords().size());
    return mav;
}  

对象来源:

public class CallDataRecord {
    private ArrayList<CallDataRecordLine> records;
    ... 
}

public class CallDataRecordLine {
    String chargedQuantity;
    String fromNumber;
    String toNumber;
    String dt;
    String usage;
}

还有我关联的 jSP

<form action="#" th:action="@{/usage}" th:object="${cdr}" method="post">
    <tr id='addr0'>
        <th:block th:each="calldatarecordline : ${cdr.records}">
            <td>1</td>
            <td><input type="text"  th:field="${calldatarecordline.fromNumber}" name='fromNumber'
                            placeholder='+555...' class="form-control" /></td>
            <td><input type="text" name='toNumber' th:field="${calldatarecordline.toNumber}" placeholder='+555...'
                            class="form-control" /></td>
            <td>
                <div class='input-group date'>
                    <input name='date' type="text" th:field="${calldatarecordline.dt}" class="form-control"><span
                                    class="input-group-addon"><i
                                    class="glyphicon glyphicon-th"></i></span>
                            </div>
                        </td>
            <td><input type="text" name='duration' th:field="${calldatarecordline.usage}" class="form-control" /></td>
                        <td><select class="form-control" name='usageType'>
                                <option value="value1">Message</option>
                                <option value="value2">Data</option>
                                <option value="value3">Call</option>
                        </select></td>
        </th:block>
    </tr>
</form>

最后,我获取了我的 CallDataRecord,里面的列表已实例化但为空,因此无法按预期工作。 我试图在另一个 JSP 中只检索一个 CallDataRecordLine 并且它工作正常。所以问题是列表上的迭代。

感谢您的宝贵时间

【问题讨论】:

    标签: forms jsp spring-mvc thymeleaf


    【解决方案1】:

    那么几件事:

    1. 您生成的是列而不是数据行(只是确保这是您所追求的)
    2. 将 th:field="${}" 的所有实例更改为 th:field="*{}" 并删除 calldatarecordline(查看以下示例)

      input type="text" th:field="*{fromNumber}" name='fromNumber' placeholder='+555...' class="form-control"

    您已经将对象设置为整个部分的 calldatarecordline 没有必要再次调用它。

    编辑 1:重写代码以便能够迭代

    <form action="#" th:action="@{/usage}" th:object="${cdr}" method="post">
        <table id='addr0'>
            <tr th:each="calldatarecordline : ${cdr.records}">
                <td>1</td>
                <td>
                    <input type="text" th:field="*{fromNumber}" name='fromNumber'
                           placeholder='+555...' class="form-control"/>
                </td>
                <td>
                    <input type="text" name='toNumber' th:field="*{toNumber}"
                           placeholder='+555...' class="form-control"/>
                </td>
                <td>
                    <div class='input-group date'>
                        <input name='date' type="text" th:field="*{dt}" class="form-control">
                        <span class="input-group-addon"><i class="glyphicon glyphicon-th"></i></span>
                    </div>
                </td>
                <td><input type="text" name='duration' th:field="*{usage}" class="form-control"/></td>
                <td>
                    <select class="form-control" name='usageType'>
                        <option value="value1">Message</option>
                        <option value="value2">Data</option>
                        <option value="value3">Call</option>
                    </select>
                </td>
            </tr>
        </table>
    </form>
    

    【讨论】:

    • 1. th:field 是列,是的,它将代表我的 CallDataRecordLine 的属性。我正在寻找的是每个 (嵌套在 )我想创建一个新的 CallDataRecordLine 将通过对象 th :object="${cdr}" 这个对象是一个包含 List 的 CallDataRecord。 2. 我尝试使用新语法更新我的代码,但我仍然得到一个空列表。我认为我的错误可能在 th:object 或 th:each 的声明中
    • 当我将对象切换到 CallDataRecordLine 时,它​​起作用了,我传递给构造函数并获取输入值。当我使用 CallDataRecord 时,它通过构造函数,所以我得到一个 List 但它从未传递到 CallDataRecordLine 构造函数中。因此我有一个空列表。
    • 好的,我重写了您的表单,以便能够创建数据行,试试吧,让我知道
    • 谢谢,我更新了表单,但我仍然得到一个空列表。再次在调试模式下,我将进入 CallDataRecord 的构造函数,但从未进入 CallDataRecordLine 的构造函数...
    • 您的问题是您用来调用此代码的控制器吗?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签