【发布时间】: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)。
有什么想法吗?
【问题讨论】:
-
我不完全确定,但我认为 stackoverflow.com/questions/27818334/… 涵盖了您的问题,因为我正在研究同样的挑战。
标签: java spring-mvc thymeleaf