Подтвердить что ты не робот

Чистая реализация Java/JSF для двойного представления

Мы используем JSF 2.0 в WebSphere v8.5 с несколькими библиотеками компонентов PrimeFaces 4.0, Tomahawk 2.0, RichFaces и т.д.

Я ищу общий механизм, чтобы избежать повторной отправки формы при обновлении страницы или при повторном нажатии кнопки отправки. У меня много приложений с разными сценариями.

Теперь я рассмотрел возможность отключения кнопки с фрагментом JavaScript в атрибуте onclick, но это не удовлетворяет. Я ищу чистую реализацию Java для этой цели, что-то вроде Struts2 <s:token>.

4b9b3361

Ответ 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.

Ответ 2

Вместо создания маркера вручную вы можете использовать решение BalusC. Он предложил шаблон Post-Redirect-GET в своем блоге

Альтернативные решения можно найти в следующих ответах: