2012-04-10 8 views
10

Сообщалось, что из-за тестирования иногда бывает несколько раз нажать кнопку, если ответ не отображается достаточно быстро, вызывая несколько обращений к внутреннему коду, чего мы не хотим.Как обрабатывать несколько представлений перед визуализацией ответа?

Приложение представляет собой веб-профиль Java EE 6 с использованием JSF 2.0 внутри Glassfish 3.1.1.

мне было интересно, как это должно быть правильно рассмотрены, и думали о нескольких сценариях:

  • Подающий должен отключить все кнопки с помощью JavaScript в то время как реакция визуализируется.
  • Флаг в области сеанса, в котором говорится, что он уже активен, поэтому секретный код пропускается и просто переходит к повторному рендерингу ответа для предыдущего представления.
  • Синхронизированный блок, откладывающий обработку до завершения предыдущего запроса. Затем следует обнаружить, что он уже обработан и пропущен.
  • Использование одной из «новых» областей, таких как преобразование для обработки обнаружения?

Мое непосредственное чувство кишки заключается в том, что лучший подход состоит в том, чтобы иметь блоки блокировки атома, но тогда проблема заключается в рендеринге правильного ответа.

Как мне подойти к этому?

+0

Вы пробовали что-то вроде jQuery blockui? Блок синхронизации BTW не будет работать в кластере. –

+0

Пока ничего не было сделано. Это хорошо, как я это делаю? сцена. –

ответ

2

Как сказал Адриан, я бы также использовал BlockUI. Существует BlockUI component от Primefaces. Когда вы отправляете свои формы через ajax, вы также можете использовать оверлей во время запроса. Для примера см. «Праймлайнс» Ajax Status.

10

Отправка должна отключать все кнопки, используя 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 работает на нескольких серверах. Ток синхронизатора проще, поскольку он будет выполняться до вызова методов действия. Ток синхронизатора также менее дорогостоящий, так как вы не получаете множество запросов в очереди, которые будут стоить только затраты/ресурсы.


Используя один из «новых» областей, таких как преобразование для обработки обнаружения?

Эта проблема не может быть решена путем игры с управляемыми компонентами бобов. Управляемые области боба служат другой целью: время жизни экземпляра компонента.

+0

В дополнение к «синхронизированному блоку» вы также можете посмотреть этот фильтр - http://onjava.com/onjava/2004/03/24/examples/RequestControlFilter.java –

+0

Благодарим вас за очень информативный ответ. Есть ли у вас дополнительные предложения, которые я не думал о себе? –

+0

Добро пожаловать. Нет, на самом деле нет других способов, кроме использования JS для отключения/блокировки взаимодействия с пользователем или использования шаблона токена синхронизации. – BalusC

Смежные вопросы