Post-Redirect-получить при передаче данных в форму?
У меня есть несколько сценариев, в которых сервлет должен передать данные в форму в JSP из полученных записей из базы данных. В настоящее время я сохраняю эту информацию в запросе, используя RequestDispatcher для пересылки на страницу, и все хорошо.
Однако это не соответствует шаблону PRG (AFAIK) и, конечно, означает, что обновление результирующего JSP означает повторный запуск сервлета, что нежелательно.
Я мог бы, конечно, хранить эти значения в сеанс, но это означало бы их последующее удаление, и даже использование сеанса кажется немного халтурным для отображения записи из базы данных.
Мне просто интересно, что было бы лучшей практикой в этой ситуации? Должен ли я продолжать использовать запрос, использовать сеанс или какую-то другую технику?
Заранее благодарю.
Редактировать: После прочтения нескольких статей и ответов на переполнение стека я не могу найти нигде другого варианта, кроме использования запрос и диспетчер при передаче данных от сервлета к JSP. Мне это кажется неправильным, но и сеанс тоже. Кто - нибудь может пролить на это свет?
1 ответ:
Я не уверен, что полностью понимаю проблему, но две модели являются лучшими практиками:
Всегда проходите через контроллер, который заполняет модель, сохраняет ее в запросе и отправляет в представление, которое отображает данные в модели. Это шаблон MVC
- Всегда перенаправляйте после успешного неидемпотентного запроса (т. е. сообщения, если вы уважаете протокол HTTP). Это шаблон post-redirect-get.
Итак, это означает, что вы должны имеем:
- запрос 1 отправляется сервлету.
- сервлет получает данные для отображения в форме и сохраняет их в запросе, затем пересылает в JSP
- JSP отображает форму
- форма передается сервлету (запрос 2)
- сервлет хранит данные в базе данных, которая генерирует идентификатор для созданных данных
- сервлет перенаправляет на URL-адрес типа
/product?id=<generatedId>
или/product/<generatedId>
- браузер отправляет запрос на этот URL (запрос 3). Этот запрос идет к сервлет
- сервлет получает данные, идентифицированные идентификатором, из базы данных. Он сохраняет данные в запросе и пересылает их в JSP
- JSP отображает данные.
Конечно, вы можете выбрать перенаправление на другую страницу, например, на список продуктов.
Если вас беспокоит использование запроса для хранения данных при пересылке из сервлета в JSP, то это не должно вас беспокоить: это единственный чистый способ сделать это. Область действия данных будет ограничена только запрос, и быть собранным мусором, когда запрос был обработан.