Разделение компонентов между представлениями - как улучшить мой дизайн?

88
12

Я работаю над веб-приложением JSF, целью которого является обернуть программу командной строки.
Одной из его основных функций является возможность совместного использования сеанса между пользователями (например, для целей курсов), так что, когда ввод отправляется экземпляру приложения, вывод отправляется каждому подписчику для этого сеанса.


В результате этой конструкции webapp в основном состоит из bean с видом, который будет запрашивать контроллер приложения командной строки.
Также было выбрано определение сеанса с фрагментом URL (например, mydomain/myapp/# SESSIONID), так что любой, кто использует URL-адрес с одним и тем же фрагментом, будет совместно использовать входы и выходы, , используя свой собственный экземпляр представления -scoped bean, но совместно использующий один и тот же контроллер


Чтобы подтолкнуть результаты всем подписчикам, я использую Primefaces Push. Результаты - это, прежде всего, текст, который должен быть прикреплен к терминалу webapp, но некоторые команды приводят к программному созданию компонента JSF.
Чтобы справиться с этим, я просто передаю эти компоненты строке, которую я отправляю всем подписчикам.


Затем я понял, что для обработки ajax-запросов от компонентов (и от каждого подписчика) соответствующий UIComponent необходимо добавить в UIViewRoot в контексте (не знаю, как выразить это) каждый вид - scope bean.


Фактически я сначала попытался привязать "общий контейнер" (UIForm) к свойству области видимости bean, в которой я бы поставил программно созданные компоненты, но мне, очевидно, пришлось столкнуться проблема с курицей/яйцом @BalusC рассказывает о своем блоге, потому что компонент был добавлен снова в каждом запросе ajax. Установка javax.faces.PARTIAL_STATE_SAVING на false тоже не помогла (я использую MyFaces 2.2.5)


Итак, в качестве некоторого обходного пути, когда контроллеру необходимо создать новый компонент, он в основном добавляет идентификатор компонента к нажатым данным (в HashMap, преобразованном в Json), и все подписчики будут запускать (назад) remoteCommand к его собственному экземпляру области видимости bean, чтобы обновить "общий контейнер" из собственного UIViewRoot.


Это работает, но мне это не нравится!


Итак:


    Можно ли обрабатывать этот вид совместного использования между областью вида beans (с тем же именем), которые хранятся в разных сеансах HTTP? Я ссылаюсь на этот ответ из @BalusC... возможно, играя с javax.faces.ViewState - возможно ли это?


    Есть ли "магическая" область для моего текущего вида bean, который я мог бы использовать?


    Должен ли я использовать совершенно другой дизайн?


Спасибо!

спросил(а) 2021-01-19T22:36:58+03:00 2 месяца, 3 недели назад
1
Решение
75

Если вы хотите делиться данными между всеми пользователями вашего приложения, вы можете использовать область применения.


Если вы все еще хотите использовать область представления, вы можете связать свою область видимости с другой областью приложения следующим образом:


ApplicationView appView = BeanUtil.findBean("applicationView", FacesContext.getCurrentInstance());

import javax.faces.context.FacesContext;

публичный класс BeanUtil {


@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName, FacesContext context) {
return (T) context.getApplication().evaluateExpressionGet(context,
"#{" + beanName + "}", Object.class);
}

}

ответил(а) 2021-01-19T22:36:58+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема