Post-Redirect-получить при передаче данных в форму?


У меня есть несколько сценариев, в которых сервлет должен передать данные в форму в JSP из полученных записей из базы данных. В настоящее время я сохраняю эту информацию в запросе, используя RequestDispatcher для пересылки на страницу, и все хорошо.

Однако это не соответствует шаблону PRG (AFAIK) и, конечно, означает, что обновление результирующего JSP означает повторный запуск сервлета, что нежелательно.

Я мог бы, конечно, хранить эти значения в сеанс, но это означало бы их последующее удаление, и даже использование сеанса кажется немного халтурным для отображения записи из базы данных.

Мне просто интересно, что было бы лучшей практикой в этой ситуации? Должен ли я продолжать использовать запрос, использовать сеанс или какую-то другую технику?

Заранее благодарю.

Редактировать: После прочтения нескольких статей и ответов на переполнение стека я не могу найти нигде другого варианта, кроме использования запрос и диспетчер при передаче данных от сервлета к JSP. Мне это кажется неправильным, но и сеанс тоже. Кто - нибудь может пролить на это свет?

1 2

1 ответ:

Я не уверен, что полностью понимаю проблему, но две модели являются лучшими практиками:

    Всегда проходите через контроллер, который заполняет модель, сохраняет ее в запросе и отправляет в представление, которое отображает данные в модели. Это шаблон MVC
  1. Всегда перенаправляйте после успешного неидемпотентного запроса (т. е. сообщения, если вы уважаете протокол HTTP). Это шаблон post-redirect-get.

Итак, это означает, что вы должны имеем:

  • запрос 1 отправляется сервлету.
  • сервлет получает данные для отображения в форме и сохраняет их в запросе, затем пересылает в JSP
  • JSP отображает форму
  • форма передается сервлету (запрос 2)
  • сервлет хранит данные в базе данных, которая генерирует идентификатор для созданных данных
  • сервлет перенаправляет на URL-адрес типа /product?id=<generatedId> или /product/<generatedId>
  • браузер отправляет запрос на этот URL (запрос 3). Этот запрос идет к сервлет
  • сервлет получает данные, идентифицированные идентификатором, из базы данных. Он сохраняет данные в запросе и пересылает их в JSP
  • JSP отображает данные.

Конечно, вы можете выбрать перенаправление на другую страницу, например, на список продуктов.

Если вас беспокоит использование запроса для хранения данных при пересылке из сервлета в JSP, то это не должно вас беспокоить: это единственный чистый способ сделать это. Область действия данных будет ограничена только запрос, и быть собранным мусором, когда запрос был обработан.