我正在一个网站上,用户可以在其中添加和编辑内容(描述这些内容的含义无关紧要)。 我正在使用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);
以及处理放置请求的控制器如下:
@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>
当我在模型内部插入对象人以呈现HTML页面时,该对象具有所有属性。实际上,我可以决定在HTML页面中显示其属性中的哪一个(在这种情况下,只有三个属性:金钱,昵称和性别)。但是,当用户按下“提交”按钮(编辑)时,我仅收到HTML页面内显示的字段(金钱,昵称,性别)。因此,我要做的是:我必须接受这三个字段,检查它们是否被更改,如果是,则更新旧版本。 如果用户按下“提交”按钮,人员的所有字段(而不仅仅是允许他更新的那三个字段)可以被控制器检索,那将是完美的。在那种情况下,我可以跳过检查阶段,直接将新版本保留在数据库中(旧值不变且未设置为NULL)。
有什么想法吗?
答案 0 :(得分:0)
您可以将readonly
属性用于将不被编辑的属性。
我认为这是使表格中所有值保持可见以将所有信息提供给正在编辑的用户的最佳方法。所有值将被提交并与您的对象序列化,但是该表格仅允许编辑您需要的三个值。
readonly
元素只是不可编辑的,而是在提交相应表单时发送的。 disabled
元素不可编辑,也不会在提交时发送。