Spring Thymeleaf中的可编辑表格

时间:2019-04-08 11:51:37

标签: spring-boot spring-mvc thymeleaf

作为后端程序员,我很少处理网络方面的事情。可以这么说,至少我对总体框架(尤其是Thymeleaf)的了解相对简单。但是现在我需要创建一个基本的但希望仍然不错的网站来维护数据库。这是一个非常小的架构,将仅由内部用户更新。因此,不必使客户面对所有攻击者,也不必面对任何攻击。我中的程序员仍然希望它不仅仅是垃圾。

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

几年前,我对JQuery做过类似的事情。我还记得,知道自己在做什么的人最好使用JQuery。因此,我正在尝试以较少的复杂性来实现这一目标。我想仍然使用Thymeleaf至少使事情变得有趣。

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

由于在表的大小上设置一些限制似乎是个好主意,因此我的SpringMVC控制器将返回一个包含检索到的模型对象的Page对象。因此,我的回复如下所示:

enter image description here

无耻地复制示例,将模型显示在表格中很简单,例如

  <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的返回类型是否正确:匹配设置器的参数类型?

这一切都是很合理的。我真正需要做的是将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

添加了表单信息

1 个答案:

答案 0 :(得分:0)

这里的问题是表达式*{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之类的表达式。