Spring Boost Thymeleaf тот же экземпляр передается между конечными точками как @ModelAttribute - PullRequest
0 голосов
/ 27 октября 2019

У меня вопрос по поводу Thymeleaf и Spring Boot. Я создаю мастер форм и хотел бы, чтобы один и тот же объект передавался между несколькими контроллерами, чтобы объект (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";
}

Большое спасибо за все ценные советы и помощь. Я искал в Интернете, но не смог найти ничего полезного, чтобы указать мне правильное направление.

РЕДАКТИРОВАТЬ: Но если вы сделаете так, чтобы CharacterDto имел больше полей, например, раса, класс, атрибуты и использовать только каждый разОдна страница (одна форма) для предоставления одного поля, пружина «забывает» другое свойство при открытии следующей формы. Например: 1-я страница: гонка установлена, класс 2-й страницы (здесь нет поля гонки), но в этом месте ранее установленная гонка уже была забыта.

Поля 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;

1 Ответ

1 голос
/ 27 октября 2019

Во-первых, поле вашего персонажа находится в форме пружины? Если да, вы также можете сохранить свою переменную в скрытом поле и передать ее по @ RequestParam . Следуйте примеру:

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

И в свой метод контроллера добавьте переменную параметра запроса

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

Если она не работает, вы также пытаетесь использовать что-то вроде стратегии шаблона ссессия. Помещение вашей переменной в область сеанса, изменение переменной при каждом запросе и удаление ее при последнем доступе.

Вот хорошая ссылка о данных доступа из шаблонов: https://www.thymeleaf.org/doc/articles/springmvcaccessdata.html

ОБНОВЛЕНИЕ Вам необходимо объединить атрибуты модели и сеанса на страницах вашего рабочего процесса. В вашем контроллере добавьте атрибут SessionAttribute, указывающий на DTO, который использует, например:

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

И когда вы закончили свой поток, вы можете завершить атрибуты сеанса таким образом.

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

Если вы посмотрите на мой пример кода, я добавлю новую страницу для очистки сессии и перезапущу форму со значениями DTO по умолчанию.

...