@PreserveOnRefresh — цель и потребность?

У меня есть сомнения относительно цели аннотации @PreserveOnRefresh. Какова цель этой конкретной аннотации и каковы сценарии, в которых она должна использоваться? Каковы последствия использования/не использования этой аннотации?

Спасибо, Daniccan VP


person Daniccan    schedule 12.05.2014    source источник


Ответы (2)


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

Ваадин 7

Этот ответ относится к Vaadin 7.

Vaadin 6 в чем-то отличается.

Сессия продолжается

Как только браузер пользователя достигает вашего приложения Vaadin, создается сеанс сервлета. VaadinSession содержит оболочка этого сеанса сервлета, доступная через VaadinSession.getSession().

Сеанс продолжается до тех пор, пока не истечет время ожидания, вы явно не закроете его, пользователь не закроет приложение браузера или другое подобное завершающее событие. Но пользователь, использующий функцию перезагрузки/обновления, не является таким завершающим событием.

Кнопка перезагрузки/обновления

Пока этот сеанс продолжается, пользователь может щелкнуть/коснуться функции значка перезагрузки/обновления в веб-браузере. По умолчанию это приводит к замене вашего текущего объекта подкласса пользовательского интерфейса новым новым объектом подкласса пользовательского интерфейса.

Для вашего пользователя кажется, что ваше приложение было перезапущено. Но на самом деле ваше приложение было не прервано, а было удалено только содержимое в этом конкретном окне/вкладке браузера. Ваше приложение (ваш VaadinSession) живет.

В вашем приложении могут быть открыты другие окна/вкладки браузера, каждая со своим собственным объектом подкласса пользовательского интерфейса. Эти другие окна/вкладки по-прежнему будут работать с тем же объектом пользовательского интерфейса. Все запущенные экземпляры пользовательского интерфейса привязаны к одному и тому же VaadinSession.

Сохранять объект пользовательского интерфейса при перезагрузке/обновлении

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

Вы хотите, чтобы пользователь мог сделать «переделку», чтобы начать заново с нуля? Если это так, сохраните это поведение по умолчанию. Не применяйте аннотацию.

Если вы хотите изменить эффект перезагрузки/обновления браузера, чтобы сохранить объект пользовательского интерфейса и его состояние, примените ссылку PreserveOnRefresh аннотация. Легко, почти как по волшебству.

Два уровня охвата

В Vaadin 7 вы можете хранить состояние либо на уровне окна/вкладки браузера (UI) или для всего приложения (на VaadinSession).

Если вы хотите, чтобы некоторые данные сохранились после удаления объекта UI, сохраните эти данные в VaadinSession, вызывая методы get/setAttribute. Например, вы должны хранить информацию о входе/аутентификации пользователя в VaadinSession.

Чтобы узнать больше об этих двух уровнях области действия, включая важную информацию о безопасности потоков, см. этот другой вопрос, как поместить данные в переменную сеанса и получить данные на другой странице в vaadin?.

Диаграмма

На этой диаграмме показана иерархия сеансов. Верхние три уровня (Servlet Container, ServletContext и HttpSession) являются стандартной технологией сервлетов. Ниже находятся уровни, специфичные для Vaadin.

диаграмма контейнера сервлетов, контекста и сеанса

person Basil Bourque    schedule 01.09.2014
comment
Что происходит с компонентами пользовательского интерфейса в отношении их жизненного цикла. Будет ли закрытие браузера или выход из системы запускать процесс GC при условии, что у меня есть написанные для него методы. - person Mahendran Ayyarsamy Kandiar; 13.09.2016
comment
@MahendranAyyarsamyKandiar Под «GC» вы имеете в виду сборку мусора? После завершения сеанса все связанные с сеансом объекты (VaadinSession, HTTPSession, атрибуты сеанса, UI и все ваши виджеты Vaadin в этих UI объектах) становятся кандидатами на сборку мусора, если вы неправомерно сохранили ссылки на них в других объектах. GC происходит автоматически, вам не нужно «писать методы». - person Basil Bourque; 27.04.2018

Когда конечный пользователь нажимает F5 (или нажимает «Обновить») в веб-браузере, поведение следующее:

С @PreserveOnRefresh -> Используйте тот же сеанс, просто обновите пользовательский интерфейс из состояния сервера.

Без @PreserveOnRefresh -> Vaadin создает новый сеанс для пользователя, и пользователю показывается «первая» страница вашего приложения.

Таким образом, обычно @PreserveOnRefresh является предполагаемым поведением, иначе пользователь выходит из системы, когда он нажимает на обновление.

person André Schild    schedule 12.05.2014
comment
Привет Андре, это не совсем правильно. Vaadin не будет создавать новый сеанс для пользователя при обновлении браузера. Вместо этого создается новый экземпляр класса пользовательского интерфейса приложения, который добавляется в сеанс пользователя. Старый экземпляр пользовательского интерфейса переходит в фоновый режим. Если используется @PreserveOnRefresh, существующий объект пользовательского интерфейса для обновленного окна браузера будет использоваться повторно. Это приводит к тому, что текущее состояние окна браузера (пользовательский ввод, текущая страница и т. д.) сохраняется даже после обновления. - person Roland Krüger; 13.05.2014
comment
Извините, я имел в виду новую сессию vaadin, а не http-сессию, но мое описание эффектов верное - person André Schild; 14.05.2014
comment
Все еще не совсем правильно ;) Сессия Vaadin — это просто оболочка для HTTP-сессии. Таким образом, при обновлении браузера вы также не получите новую сессию Vaadin. Речь идет только о том, создает ли сервлет новый экземпляр пользовательского интерфейса. См. vaadin.com/api/7.1.15/com/vaadin. /аннотации/ для справки. Без использования этой аннотации пользователь не выйдет из системы после обновления, если только эта информация для входа не будет сохранена в области пользовательского интерфейса (см. мой пост в блоге blog.oio.de/2013/02/22/ о пользовательском интерфейсе и области сеанса в Vaadin). - person Roland Krüger; 14.05.2014