Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Forms 使用thymeleaf获取对象列表_Forms_Jsp_Spring Mvc_Thymeleaf - Fatal编程技术网

Forms 使用thymeleaf获取对象列表

Forms 使用thymeleaf获取对象列表,forms,jsp,spring-mvc,thymeleaf,Forms,Jsp,Spring Mvc,Thymeleaf,我试图用thymeleaf得到一种形式的值。表单是一个表,其中有多个表示CallDataRecord的一行。我正在寻找的行为是获取包含每个元素列表的CallDataRecord 这是我的控制器: @RequestMapping(value="/usage", method=RequestMethod.POST) public ModelAndView usageSubmit(@ModelAttribute CallDataRecord cdr, ModelAndView mav) { S

我试图用thymeleaf得到一种形式的值。表单是一个表,其中有多个表示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;
}
public类CallDataRecord{
私人ArrayList记录;
... 
}
公共类CallDataRecordLine{
字符串计费数量;
字符串fromNumber;
字符串编号;
字符串dt;
字符串用法;
}
和我的相关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>

1.
消息
资料
呼叫
最后,我获取了我的CallDataRecord,其中的列表是实例化的,但为空,因此它不能按预期工作。 我尝试在另一个JSP中只检索一个CallDataRecordLine,它工作正常。所以问题是列表上的迭代

感谢您抽出时间来

以下几件事:

  • 您正在生成列而不是数据行(只需确保这是您所追求的)
  • 将th:field=“${}”的所有实例更改为th:field=“*{}”并删除calldatarecordline(如下面的检查)

    input type=“text”th:field=“*{fromNumber}”name='fromNumber'占位符='+555…'class=“表单控制”

  • 您已经为整个节将对象设置为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.
    消息
    资料
    呼叫
    
    1。th:字段是列是的,它将表示我的CallDataRecordLine的属性。我要寻找的是,对于每个(嵌套在中)我想要创建一个新的CallDataRecordLine,它将通过对象th:object=“${cdr}”传递。该对象是一个包含列表的CallDataRecord。2.我试图用新语法更新代码,但最终还是得到了一个空列表。我认为我的错误可能是在th:object或th:each的声明中。当我将对象切换到CallDataRecordLine时,它工作了,我将其传递到构造函数并获取输入值。当我查找CallDataRecord时,它会通过构造函数,因此我得到一个列表,但它从未传递到CallDataRecordLine构造函数中。因此,我有一个空列表。好的,我重写了你的表单,以便能够创建数据行,尝试一下,让我知道。谢谢,我更新了表单,但最终还是得到了一个空列表。再次在调试模式下,我将进入CallDataRecord的构造函数,但决不在CallDataRecordLine的构造函数中…您所问的控制器是您用来调用此代码的控制器吗?