Прослушивание окончания пользовательского сеанса в управляемом компоненте JSF - PullRequest
5 голосов
/ 05 июня 2011

Можно ли сделать что-то вроде этого: когда пользовательский сеанс начинается, я считываю определенный интегральный атрибут из базы данных. Когда пользователь выполняет определенные действия в этом сеансе, я обновляю эту переменную (сохраненную в сеансе) и, когда сеанс заканчивается, затем я, наконец, сохраняю это значение в БД.

Мой вопрос заключается в том, как мне определить, используя инфраструктуру JSF, если сеанс пользователя завершился, и я должен затем сохранить значение обратно в БД?

Ответы [ 3 ]

9 голосов
/ 05 июня 2011

Помимо HttpSessionListener, вы можете использовать для этого управляемый компонент в рамках сеанса.Вы используете аннотации @PostConstruct (или просто конструктор бина) и @PreDestroy для создания и уничтожения сеанса

@ManagedBean
@SessionScoped
public class SessionManager {

    @PostConstruct
    public void sessionInitialized() {
        // ...
    }

    @PreDestroy
    public void sessionDestroyed() {
        // ...
    }

}

Единственное требование -на этот bean-компонент ссылаются на странице JSF или как @ManagedProperty для любого bean-объекта с областью запроса.Иначе это не будет создано.Но в вашем случае это не должно быть проблемой, так как вы, очевидно, уже используете управляемый bean-объект сессионной области, достаточно просто добавить метод @PreDestroy.

5 голосов
/ 05 июня 2011

Мой вопрос заключается в том, как определить, используя инфраструктуру JSF, если сеанс пользователя завершился, и я должен затем сохранить значение обратно в БД?

Платформа JSF не имеетотдельная концепция сеанса;он использует базовые функции управления сеансами спецификации сервлета.

Вам нужно будет создать HttpSessionListener , который предоставляет ловушки для захвата событий создания и уничтожения сеанса, где вы можете прочитатьзначение и сохранить его обратно в БД.

2 голосов
/ 05 июня 2011

HttpSessionListener, или если вам нужно Внедрение зависимости для этого сохранения, вы можете использовать @PostConstruct & @PreDestroy. Помните, что сеанс уничтожается при вызове invalidate() или после истечения времени ожидания сеанса, а не когда пользователь закрывает браузер. Почему вы все равно используете Session Scope, Conversation Scope может подойти вам лучше.

...