Отправка должна отключать все кнопки, используя javascript во время визуализации ответа.
Это самый простой способ реализации в общем виде. Если вы используете исключительно <f:ajax>
, вы можете использовать jsf.ajax.addOnEvent()
для выполнения задания в общем виде. Альтернативный подход JavaScript заключается в создании вида «Загрузка» наложения, который блокирует пользовательский интерфейс, чтобы конечный пользователь больше не мог взаимодействовать с основной страницей. Это в основном абсолютно скрытый <div>
, который охватывает весь видовой экран с некоторыми opacity
(прозрачность). Вы можете показать его на submit и скрыть его на рендеринге. Ключевое слово для этой техники - "modal dialog". Библиотеки компонентов JSF, ориентированные на пользовательский интерфейс, имеют, по меньшей мере, такой компонент уже в своем ассортименте. Например. PrimeFaces с <p:dialog modal="true">
внутри <p:ajaxStatus>
, или <p:blockUI>
Единственным недостатком является то, что он не будет работать, если клиент имеет JS отключен или не использовать его, и он, таким образом, не будет препятствовать HTTP клиентов от двойных ПРЕДСТАВЛЯЕТ.
флаг в рамках сессии говоря это уже активен, поэтому чувствительный код пропускается и просто переходит к повторной визуализации ответа на предыдущий представить.
Это более известный как "synchronizer token pattern" и никогда не было предложено для JSF по spec issue 559 который в настоящее время на билете целевой для 2.2, но не кажется, что будет какой-либо деятельности на нем. Часть обнаружения и блокировки технически проста в реализации, но часть обработки синхронного ответа нелегко реализовать, если вы хотите, чтобы конечный пользователь в конечном итоге извлекал ответ, сгенерированный первоначальным запросом. Асинхронная обработка ответов проста: просто не указывайте какие-либо компоненты для обновления, т. Е. Пустую коллекцию, возвращаемую PartialViewContext#getRenderIds()
. В конце концов, это более надежное, чем использование JS для отключения кнопок или блокировки пользовательского интерфейса.
Насколько я знаю, Seam 2 был единственным, кто предложил для этого повторно используемый компонент JSF, <s:token>
. Однако я должен признать, что это интересная идея для нового компонента OmniFaces. Возможно, я лично посмотрю на это.
Синхронизированный блок задержки обработки, пока предыдущий запрос не закончили. Затем следует обнаружить, что он уже обработан и пропущен.
Это непросто реализовать в целом, для этого потребуется изменение всех методов действий, чтобы проверить, выполнено ли задание. Он также не будет работать, если webapp работает на нескольких серверах. Ток синхронизатора проще, поскольку он будет выполняться до вызова методов действия. Ток синхронизатора также менее дорогостоящий, так как вы не получаете множество запросов в очереди, которые будут стоить только затраты/ресурсы.
Используя один из «новых» областей, таких как преобразование для обработки обнаружения?
Эта проблема не может быть решена путем игры с управляемыми компонентами бобов. Управляемые области боба служат другой целью: время жизни экземпляра компонента.
Вы пробовали что-то вроде jQuery blockui? Блок синхронизации BTW не будет работать в кластере. –
Пока ничего не было сделано. Это хорошо, как я это делаю? сцена. –