【问题标题】:Editable Table in Spring ThymeleafSpring Thymeleaf 中的可编辑表
【发布时间】:2019-08-29 13:37:57
【问题描述】:

作为一名后端程序员,我很少处理 Web 方面的事情。所以至少可以说,我对一般框架和 Thymeleaf 的掌握是相对简单的。但是现在我需要创建一个有点基本但希望仍然不错的网站来维护一个数据库。这是一个非常小的架构,只能由内部用户更新。因此,它不必面向客户,也不必针对所有攻击者进行强化或强化。我内心的程序员仍然希望它不仅仅是垃圾。

我认为最好是一个表示数据库行的 html 表 - DUH。但我希望整个表格都是可编辑的,而不是让我编写代码并让用户单击各个行进行编辑。

很久以前,我用 JQuery 做过类似的事情。我还记得 JQuery 最适合知道自己在做什么的人使用。所以我试图以更少的复杂性来实现这一点。我仍然想使用 Thymeleaf 至少让事情变得更有趣。

这就是我的知识搁浅的地方。我不知道如何访问数据。

由于对表的大小进行一些限制似乎是个好主意,因此我的 SpringMVC 控制器正在返回一个包含检索到的模型对象的 Page 对象。因此我的回复看起来像这样:

无耻地复制示例,在表格中显示模型是微不足道的,例如

  <tr th:each="restProvider : ${providerPage.content}">
  <td th:text="${restProvider.enabled}" />

这一切都很棒!但是当我试图使表格可编辑时,Thymeleaf 并没有那么适应。问题是我同意。事实上,现在很难理解它以前为什么有效。

<form action="#" th:action="@{/saveProvider}" 
    th:object="${providerPage.content}" method="post">

<table border="1">
    <tbody>
    <tr th:each="restProvider, i : ${providerPage.content}" >
    <td th:style="'text-align: center;'" /> <input type="text" th:field="*{content[__${i.index}__].enabled}"  />

    <td th:text="${restProvider.serviceName}" />

org.thymeleaf.exceptions.TemplateInputException:模板解析期间发生错误(模板:“类路径资源 [templates/listProviders.html]”)] 根本原因 org.springframework.beans.NotReadablePropertyException:bean 类 [org.springframework.data.domain.PageImpl] 的无效属性“restProvider”:Bean 属性“restProvider”不可读或具有无效的 getter 方法:getter 的返回类型是否匹配setter的参数类型?

这一切都说得通。我真正需要做的是将 PageImpl.content 转换为 RestProvider 对象数组。但我不知道该怎么做。

到目前为止,我最好的想法是要么完全放弃 Pagable,我不想这样做,要么将对象数组直接放入模型中 - 从而发送 2 个用户数据副本。

第一个想法删除了功能 - 或者至少让我手动编写代码。如此处提议:type cast in EL expressions using Thymeleaf

第二个实际上只是第一个的变体。我很确定它会起作用。这似乎也是一个彻头彻尾的糟糕想法,并且不能成为该工具应该使用的方式。

编辑 1

根据@Metroids 的建议,我更改了字段名称。但现在我明白了

Bean 属性 'content.content[0]' 不可读或具有无效的 getter 方法

于是我做了看似合乎逻辑的事情,取出了“内容”。这给我留下了:

<td th:style="'text-align: center;'" /> <input type="text" th:field="*{[__${i.index}__].enabled}"  />

但这只能让我:

Bean property 'content.[0]' is not readable or has an invalid getter method

我尝试了其他一些方法。包括弄乱如何指定迭代器。但是没有一个能去掉多余的“.”。

编辑 2

添加表单信息

【问题讨论】:

    标签: spring-boot spring-mvc thymeleaf


    【解决方案1】:

    这里的问题是表达式*{restProvider.enabled} 试图解析为providerPage.restProvider.enabled,这当然不是真实的。使用字段表达式时,不能使用由th:eachth:with 创建的临时变量。您已经构建了一个完整的表达式,可以解析为 th:object 形式。试试这个:

    <tr th:each="restProvider, i : ${providerPage.content}">
        <td>
            <input type="text" th:field="*{content[__${i.index}__].enabled}"  />
    

    这将解析为providerPage.content[0].enabled 之类的表达式。

    【讨论】:

    • 非常感谢!这让我更进一步。但不完全在那里。根据我的更新有什么想法吗?
    • 真的没什么可看的了。我添加了表格的其余部分,只留下了列标题。以及尚未转换为 INPUTS 的所有其他字段。但这确实是全部交易。
    • 你有th:object="${providerPage.content}"——这不是一个有效的对象。根据文档:Values for th:object attributes in form tags must be variable expressions (${...}) specifying only the name of a model attribute, without property navigation. 您必须像一开始一样使用th:object="${providerPage}",并使用th:field="*{content[__${i.index}__].enabled}" 作为字段。
    • 对不起。这现在开始有意义了。谢谢!
    猜你喜欢
    • 2021-04-27
    • 2014-09-29
    • 2018-02-08
    • 2020-12-16
    • 1970-01-01
    • 2020-05-01
    • 2018-10-02
    • 2021-04-04
    • 1970-01-01
    相关资源
    最近更新 更多