Ответ 1
Я ищу универсальный механизм, чтобы избежать повторной отправки формы при обновлении страницы.
Для этого существует не менее двух решений, которые нельзя комбинировать:
-
Выполните перенаправление после синхронного сообщения. Таким образом, обновление будет только повторно выполнять перенаправленный запрос GET вместо первоначального запроса. Недостаток: вы больше не можете использовать область запроса, чтобы обеспечить обратную связь с конечным пользователем. JSF 2.0 решил это, предложив новую флэш-область. См. Также Как отобразить сообщение лиц на перенаправленной странице.
-
Выполните POST асинхронно в фоновом режиме (используя ajax). Таким образом, обновление обновит только первоначальный запрос GET, который открыл форму. Вам нужно только убедиться, что эти формы изначально открыты только с помощью запроса GET, т.е. Вы никогда не должны выполнять переключение между страницами по почте (что само по себе уже плохой дизайн). См. Также Когда следует использовать h: outputLink вместо h: commandLink?
или когда кнопка отправки снова нажата
Для этого в основном есть как минимум 2 решения, которые при необходимости можно объединить:
-
Просто заблокируйте, чтобы конечный пользователь смог нажать кнопку отправки во время отправки и/или после успешной отправки. Для этого существуют разные способы, в зависимости от конкретных функциональных и конструктивных требований. Вы можете использовать JavaScript для отключения кнопки во время отправки. Вы можете использовать атрибуты JSF
disabled
илиrendered
, чтобы отключить или скрыть кнопку после отправки. См. Также Как сделать двойной клик в JSF 2. Вы также можете использовать оверлейное окно во время обработки ajax-запросов для блокировки любого взаимодействия с пользователем. Для этой цели PrimeFaces имеет<p:blockUI>
. -
Подтвердить уникальность недавно добавленного объекта на стороне сервера. Это намного надежнее, если вы абсолютно хотите избежать дублирования по техническим причинам, а не по функциональным причинам. Это довольно просто: поставьте ограничение
UNIQUE
на столбец DB, о котором идет речь. Если это ограничение нарушено, то база данных DB (и DB), такая как JPA), вызовет исключение нарушения ограничения. Это лучше всего сделать в сочетании с настраиваемым JSF-валидатором, который предварительно проверяет ввод, выполнивSELECT
именно в этом столбце и проверив, не возвращается ли запись. JVF-валидатор позволяет отображать проблему во вкусе сообщения дружественных лиц. См. Также среди других Проверка формата и уникальности электронной почты для DB.