Довольно нормальный случай:
У нас есть составной компонент 'портлет', который имеет два состояния: развернуто и свернуто. Портлеты начинаются как развернутые, но пользователь может свернуть их, нажав на них. Это состояние должно быть сохранено в сеансе, чтобы после обновления страницы пользователем или перехода на новую портлеты запоминали, развернуты ли они / свернуты.
В этом суть проблемы : Как бы вы реализовали такое сохранение состояния в компоненте, который можно вставлять на страницу несколько раз?
Некоторые предпосылки / идеи:
Реализация сохранения состояния для одного портлета может быть легко достигнута с помощью bean-объекта в области сеанса. Также можно поддерживать фиксированное количество портлетов, создавая фиксированное количество bean-объектов в сессионной области или объявляя разные свойства в один bean-компонент. Однако я не хочу даже упоминать, почему эти подходы плохие.
Моя первоначальная идея для этого состояла в том, чтобы создать Map (или некоторую структуру объекта) под одним сессионным компонентом для хранения состояний для всех портлетов. Однако я не могу напрямую ссылаться на эти данные из JSF (чтобы JSF также обновил их). Я подумал о том, чтобы написать конкретный метод получения / установки для извлечения / обновления правильного значения на карте, но это невозможно, поскольку во время выполнения методов получения и установки нет идентифицирующих данных.
Однако, вероятно, ясно, что мне нужно сохранять состояния в сессионный компонент. Я могу довольно легко сохранить состояние, отправив форму с f:ajax
и выполнив специальный метод с использованием listener
и отправленных данных. Чтобы поддерживать несколько экземпляров компонента, я мог бы использовать (несколько экземпляров) bean-объект в области запросов для обработки каждого раскрытия / свертывания. Однако для фактической публикации данных, идентифицирующих портлет и его состояние, мне нужно сначала вставить их в поля формы во время рендеринга.
Итак, как на самом деле предоставить каждому портлету правильные данные во время рендеринга (на самом деле просто укажите логическое / enum в этом случае, но рассмотрите случай, когда нужно обрабатывать больше данных)?
Кажется, что:
h:inputHidden
и h:inputText
не поддерживают установку начального значения, кроме атрибута value (который будет указывать на #{portletBean.portletState}
).
- Я не могу автоматически загружать бины запроса с правильными начальными значениями во время их создания, так как нет никакой идентифицирующей информации.
Еще раз мне кажется, что я что-то упускаю ... указатели?
Я полагаю, что по крайней мере один из ответов будет использовать UIComponent
, а не составные компоненты, но я хотел бы сохранить это как составной компонент, так как он содержит много необработанных HTML-элементов.
Обновление:
- Существует довольно похожий вопрос с предложением использовать bean-объект в области видимости. Однако я не думаю, что это жизнеспособно.