#java #jsf #myfaces
#java #jsf #myfaces
Вопрос:
В принципе, моя проблема в том, что если пользователь нажимает одну кнопку и ожидает ответа страницы, а затем нажимает другую кнопку, кажется, что возникает состояние гонки.
Как я могу избежать кода для первой кнопки, используя те же переменные, что и код для второй кнопки?
Я подозреваю, что оба запроса будут вызывать одни и те же средства получения и установки в некотором случайном порядке, потому что каждое нажатие кнопки будет происходить на разных этапах модели JSF.
Вот пример. Предположим, пользователь нажимает кнопку, функция action изменяет некоторую переменную. Эта переменная связана с получателем и установщиком с фактическим тегом jsf. Теперь предположим, что функция action выполнена на 50%. Теперь пользователь нажимает ту же кнопку. JSf вызовет средства получения и установки, связанные с этой же переменной, восстанавливая состояние или что-то еще. По сути, эта переменная сбрасывается обратно к тому, что было до того, как действие изменило ее. Теперь функция action для первого щелчка продолжает выполняться, и она снова изменяет переменную. Даже без второго вызова action это условие гонки.
Ответ №1:
Что ж, на стороне клиента вы можете захотеть посмотреть на JavaScript, чтобы отключить несколько отправлений, например, отключить тип ввода отправки после его нажатия. Однако это ни в коем случае не надежный механизм.
В самом JSF это зависит от области действия компонента. Если это область сеанса, вы могли бы синхронизировать доступ к его методу действия (т. Е. методу invoke application), чтобы логику мог выполнять только один поток одновременно. Аналогичным образом вы могли бы синхронизировать доступ к общим данным. Это сработает, только если у вас есть привязка к сеансу. Если вы этого не сделаете, то вам придется туго!
Однако само дерево компонентов (значения обновления, проверки процесса и т.д.) Все равно будет вызвано для второго запроса. Может быть, вы могли бы посмотреть на PhaseListener или что-то еще, чтобы предотвратить это, но это кажется сложным и, возможно, излишним.
Обычно способ кодирования и сборки вашего приложения означает, что вы должны иметь возможность обрабатывать несколько запросов от одного и того же пользователя. Хотя лично я предпочитаю подход JavaScript для предотвращения отправки нескольких форм. Не хотите ли вы объяснить более подробно, возможно, с помощью фрагментов кода, какую проблему вы видите?
Комментарии:
1. Хммм. Я бы отключил отправку дублирующейся формы с помощью JavaScript. Если ваш вспомогательный компонент ограничен областью запроса, то у вас будет два объекта, каждый из которых работает независимо, с различными данными. Это было бы проблемой? Полагаю, у постоянных данных должна быть какая-то стратегия блокировки. Если это область сеанса, вы могли бы посмотреть на некоторую синхронизацию, например, в фильтре сервлета: synchronized(request.getSession();) { цепочка. doFilter(req, соответственно); } , поэтому одновременно может обслуживаться только один запрос, привязанный к определенному сеансу.
2. Можете ли вы предоставить более подробную информацию о фильтрации сервлетов?
3. Для этого я бы обратился к руководству по J2EE: java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets8.html#103101
4. Я нашел это thierrywasyl.wordpress.com/2009/06/22 / … полезно, и это показало, как получить сеанс viralpatel.net/blogs/2009/02 /…