gpt4 book ai didi

java - Spring boot Thymeleaf 与 @ModelAttribute 一样在端点之间传递相同的实例

转载 作者:行者123 更新时间:2023-12-02 09:22:37 26 4
gpt4 key购买 nike

我有一个关于 Thymeleaf 和 Spring Boot 的问题。我正在创建一个表单向导,我希望在多个 Controller 之间传递相同的对象,以便该对象 (SimpleCharacter) 每次存储每个页面的值。

我现在所拥有的是,对于每个端点,我都会创建一个新对象,该对象“忘记”了我想要从上一页存储的内容。如何实现在端点之间传递相同的对象实例,并最终使用每个先前端点的字段完全完成对象?

private static final String CHARACTER = "character";

@GetMapping(value = "/new-char/01_race")
public String showCharWizRace(Model model) {
CharacterDto character = new SimpleCharacter();
model.addAttribute(CHARACTER, character);
return "new-char/01_race";
}

@PostMapping(value = "/new-char/02_class")
public String showCharWizClass(Model model, @ModelAttribute CharacterDto character) {
model.addAttribute(CHARACTER, character);
model.addAttribute("classes", charClassService.findAll());
return "new-char/02_class";
}

@PostMapping(value = "/new-char/03_attributes")
public String showCharWizAttributes(Model model, @ModelAttribute CharacterDto character) {
model.addAttribute(CHARACTER, character);
return "new-char/03_attributes";
}

非常感谢您提供的所有宝贵的提示和帮助。我在网上搜索过,但找不到任何有用的信息来指引我正确的方向。

编辑:但是,如果您使CharacterD具有更多字段,例如种族、类别、属性,并且每次仅使用一页(一个表单)来提供一个字段,则在打开下一个表单时,spring会“忘记”另一个属性。例如:第一页:已设置比赛,第二页(此处不存在比赛 field )已设置类别,但在该位置之前设置的比赛已被遗忘。

CharacterDto 字段,应在每个页面上逐步填写:

private String race;
private String charClass;

private int strength;
private int endurance;
private int dexterity;
private int charisma;
private int intelligence;
private int perception;

private String name;
private String surname;
private String description;
private String title;
private String avatar;

最佳答案

首先,您的字符字段位于 Spring 表单内?如果是,您还可以将变量存储在隐藏字段中并通过 @RequestParam 传递。请看一个例​​子:

<input th:field="*{character}" name="character"/>

并在您的 Controller 方法中添加一个请求参数变量

showCharWizClass(@RequestParam(value = "character", required = false) String character, otherVariables){}

如果它不起作用,您还可以尝试使用诸如带有 session 的模板策略之类的东西。将变量放入 session 范围中,根据每个请求更改变量并在上次访问时将其删除。

这里有一个关于从模板访问数据的好链接: https://www.thymeleaf.org/doc/articles/springmvcaccessdata.html

更新您需要在工作流程页面中组合模型和 session 属性。在您的 Controller 中添加一个指向正在使用的 DTO 的 SessionAttribute,如下所示:

@Controller
@SessionAttributes("character")
public class WizardController { ..

当您完成流程后,您可以通过这种方式结束 session 属性。

@GetMapping(value = "/new-char/04_clear")
public String clearSession(SessionStatus sessionStatus) {
sessionStatus.setComplete();
return "new-char/04_clear";
}

如果您查看我的示例代码,我会添加一个新页面来清理 session 并使用默认 DTO 值重新启动表单。

关于java - Spring boot Thymeleaf 与 @ModelAttribute 一样在端点之间传递相同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58575559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com