【问题标题】:Best way to edit an object with Thymeleaf and Spring MVC使用 Thymeleaf 和 Spring MVC 编辑对象的最佳方法
【发布时间】:2019-01-05 11:54:00
【问题描述】:

我正在开发一个网站,用户可以在其中添加和编辑内容(具体描述这些内容是什么并不相关)。 我使用 Thymeleaf 作为前端,Spring MVC 作为后端,JPA 作为数据库逻辑来实现它。现在我正在尝试实现编辑逻辑,但我不知道哪种方法是最好的方法。 我在想的是:向用户显示他被允许编辑的所有输入字段(在 HTML 页面上),已经用当前值填充。然后他可以编辑他想要的任何字段,最后按下编辑按钮以保留更改。 在后端获得新对象后,我会从数据库中检索旧版本,以检查用户更改了哪个字段。对于每个更改的字段,我都会更新旧版本,只有在完成后我才会调用 JPA 方法 save 并保留该对象的新版本。 有更好的方法吗? 如果我放置在模型中以便在 HTML 页面内向用户显示其所有字段的对象能够保留旧对象的所有信息,而不仅仅是用户可以更改的信息,那将是完美的。让我用一个例子更好地解释我想说的话:

假设我们正在尝试编辑的对象称为 Person 并具有以下属性:

  • 身份证
  • 姓名
  • 昵称

但用户只能编辑以下属性:

  • 昵称

所以处理页面获取请求的控制器如下所示:

@GetMapping("person/{personId}/edit")
public String getEditPersonPage(@PathVariable Integer personId, Model model) {
    Person person = personService.getById(personId); //person has all the attributes filled in
    model.addAttribute("person", person);

处理 put 请求的控制器如下所示:

@PutMapping("person/{personId}/edit")
    public String editPerson(@ModelAttribute Person person, @PathVariable Integer personId){
        personService.editPerson(person); //person has only the three fields filled in and all the other attributes as NULL
        return "redirect:/person/" + personId;
    }

HTML 页面:

<form th:object="${person}" th:method="PUT">
    <fieldset>
        <p th:text="*{id}"></p>
        <p th:text="*{name}"></p>
        <p th:text="*{surname}"></p>

        <input type="number" th:field="*{money}" th:value="*{money}" />
        <input type="text" th:field="*{nickname}" th:value="*{nickname}" />
        <input type="text" th:field="*{sex}" th:value="*{sex}" />

        <input type="submit" value="Edit" />
    </fieldset>
</form>

当我在模型中插入对象 person 以呈现 HTML 页面时,该对象具有所有属性。事实上,我可以决定它的哪些属性显示在 HTML 页面中(在本例中只有三个:金钱、昵称和性别)。但是当用户按下提交按钮(编辑)时,我只收到 HTML 页面内显示的字段(金钱、昵称、性别)。所以我要做的是:我必须把这三个字段,检查它们是否被改变,如果是,更新旧版本。 如果当用户按下提交按钮时,控制器可以检索到人员的所有字段(而不仅仅是他被允许更新的那三个),那将是完美的。在这种情况下,我可以跳过检查阶段并直接将新版本保存在数据库中(旧值不变且未设置为 NULL)。

有什么想法吗?

【问题讨论】:

标签: java spring-mvc thymeleaf


【解决方案1】:

您可以将readonly 属性用于不会被编辑的属性。

我认为这是保持表单中所有值可见的最佳方式,以便将所有信息提供给正在编辑的用户。所有值都将与您的对象一起提交和序列化,但表单只允许编辑您需要的三个。

readonly 元素是不可编辑的,但会在相应的表单提交时发送。 disabled 元素不可编辑,也不会在提交时发送。

【讨论】:

  • 是的,但是如果我使用浏览器的检查工具并删除输入字段的只读属性怎么办?
猜你喜欢
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多