当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf:编辑窗体的对象列表

游炳
2023-03-14

我希望有一个PropertyBean(由property、value和datatype组成)的多个实例来描述一个文档。因此,在Thymeleaf前端(带有Spring后端)中,一个文档应该显示为一个表,其中包含一个这样的PropertyBean实例列表。每个实例的“值”字符串应该在一个输入字段中,允许修改。(后来也是其他的,但我觉得从小开始是个好主意。

这就是我所拥有的:

package beans;

public class PropertyBean {
    private String property;
    private String value;
    private String datatype;

    public PropertyBean() {
    }

    public PropertyBean(String property, String value, String datatype) {
        super();
        this.property = property;
        this.value = value;
        this.datatype = datatype;
    }

    public String getProperty() {
        return property;
    }
    public void setProperty(String property) {
        this.property = property;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getDatatype() {
        return datatype;
    }
    public void setDatatype(String datatype) {
        this.datatype = datatype;
    }

    @Override
    public String toString() {
        return "property = "+this.property+",value = "+this.value+", datatype = "+this.datatype;
    }

}

PropertyWrapper类(用作Thymeleaf的包装):

package beans;

import java.util.ArrayList;

public class PropertyWrapper {
    private ArrayList<PropertyBean> properties;

    public PropertyWrapper() {};

    public ArrayList<PropertyBean> getProperties() {
        if (this.properties == null) {
            this.properties = new ArrayList<PropertyBean>();
        }
        return properties;
    }

    public void setProperties(ArrayList<PropertyBean> properties) {
        this.properties = properties;
    }

    public void newProperty(String property, String value, String datatype) {
        PropertyBean newPr = new PropertyBean(property,value,datatype);
        this.getProperties().add(newPr);
    }

    public void printAll() {
        for (PropertyBean p : getProperties()) {
            System.out.println(p.toString());
        }
    }
} 

这是Spring文档控制器的重要部分:

/******************************************************
 * POST of one specific document
 ******************************************************/
@PostMapping("documents/{doc_id}")
public String editDocument(@PathVariable String doc_id,
        @ModelAttribute("properties_wrapper") PropertyWrapper propertiesWrapper, Model model) {

    //Just print the values
    propertiesWrapper.printAll();

    saveInDatabase(propertiesWrapper);

    Message info_msg = new Message("Changes successuflly saved!", "alert-success");
    return document(doc_id, model, info_msg);
}

/******************************************************
 * GET of one specific document
 ******************************************************/
@RequestMapping(path = "documents/{doc_id}", method = RequestMethod.GET)
public String document(@PathVariable String doc_id, Model model, Message msg) {

    PropertyWrapper prwrapper = loadFromDatabase(doc_id);

    if (msg != null) {
        model.addAttribute("msg", msg);
    }

    model.addAttribute("doc_id", doc_id);
    model.addAttribute("properties_wrapper", prwrapper);

    return "documentTmpl";
}

下面是thymeleaf模板的表单部分:

<form action="#" method="post" th:action="@{/documents/{id}(id=${doc_id})}" th:object="${properties_wrapper}">
    <h1 th:text="${doc_id}">Document</h1>
    <table class="table table-striped">
        <tr>
            <th>Property</th>
            <th>Value</th>
            <th>Datatype</th>
        </tr>
        <tr th:each="propertyItem,status : ${properties_wrapper.properties}">
            <td th:text="${propertyItem.property}">Property</td>
            <td>
                <!-- here the problem occurs: -->
                <input th:field="*${properties_wrapper.properties[__${status.index}__].value}"></input>
            </td>
            <td th:text="${propertyItem.datatype}"> </td>
        </tr>
    </table>
    <button type="submit" class="btn btn-default">Submit</button>
</form>
org.thymeleaf.exceptions.TemplateProcessingException: Could not parse as expression: "*${properties_wrapper.properties[__${status.index}__].value}" (documentTmpl:26)

如果没有这个输入标记,所有的都将正确地显示在get-call中

共有1个答案

马冯浩
2023-03-14

在Thymeleaf的Spring标准方言中没有*${}表达式。但是,您可以使用以下五个表达式1(参考:http://www.thymeleaf.org/doc/articles/standarddialt5minutes.html):

>

  • ${...}:变量表达式。这些是SpringEL表达式。

    *{...}:选择表达式。同上,除非它只在先前选定的对象上执行。(由th:object设置的对象)

    #{...}:消息(i18n)表达式。用于从外部源检索特定于区域设置的消息。

    回答

    这一行:

    1-摘自Thymeleaf-th:field=“${}”和th:field=“*{}”之间有什么区别?

  •  类似资料:
    • 我正在尝试为我的列表模式中的每个对象创建一个包含该对象数据的表单。 所以我的控制器中有: 在我的ThymeLeaf模板中: 控制器: ThymeLeaf模板: 这种情况不会引发任何异常,但为空

    • 6.2 操作编辑对象 与 Vim 可视编辑的有关的几个概念对象是缓冲(buffer)、窗口(window)与标签页( tabpage),还有目前较少用到的在命令行参数提供的文件列表(argument list)。VimL 也提供了许多函数以供脚本来控制这些编辑对象。 编辑对象背景知识 很早期的 vi 一次只能编辑一个文件。不过从命令行启动时可以提供多个文件名参数, 首先编辑第一个文件,编辑完后可以

    • 假设我让玩家创建团队并创建团队调用团队类的新实例,该实例具有称为成员的数组列表。 现在在主课堂上,我如何在被邀请后将球员添加到团队中?我在team类中有一个addPlayer方法,只需将它们添加到arraylist中,但是如果teams类当前有多个实例(其他玩家创建了团队),它怎么知道要加入哪一个呢? 我在teamLeader的Teams类中有一个变量,在创建实例时设置该变量,如果这可以帮助我编辑

    • 我试图在JavaFX中创建一个可编辑的TableView。我从2个连接的表中获取数据,所以我在TableView中使用对象。 我已经将表和列设置为可编辑,,我尝试对列的执行操作(例如,类似于textfield)。 我还没能解决这个问题。 那么,如何使包含对象的单元格可编辑呢?谢谢你的回答

    • 我很难将表单发回控制器,因为它应该只包含用户可以编辑的对象的arraylist。 表单加载正确,但在发布时,它似乎从未真正发布任何内容。 这是我的表格: 上面的工作正常,它正确加载列表。但是,当我发布时,它返回一个空对象(大小为0)。我认为这是由于缺少,但无论如何,这里有一个控制器POST方法: 我尝试添加一个,但不管我做什么,它都会导致异常。 我试过: 我不能访问当前客户端(编译错误),我甚至不

    • 我想将两个对象从thymeleaf表单传递到控制器。这是我的ThymileAF代码: 在表单中,除了这里实际提交的付款对象之外,我想将学生对象或id传递给我的控制器,因为任何付款都应该对应于特定的学生。我找了很多,直到现在才找到办法。 PaymentController方法,我希望在其中传递对象,因为我使用提交表单,所以无法在th:action中传递变量 请建议。我被困在这里了