2014-12-10 1 views
1

Вопрос только о Ваадине, я много искал, не найдя полезной информации.Есть ли способ узнать, обновлен ли пользовательский интерфейс Vaadin (перезагрузка F5), когда он не является @PreservedOnRefresh

Мне нужно знать, обновлен ли пользовательский интерфейс, когда у него нет набора аннотаций @PreserveOnRefresh (что означает, что переопределение UI.refresh() не будет работать для меня).

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

Если пользователь запрашивает один и тот же пользовательский интерфейс (та же реализация пользовательского интерфейса, отображаемая конфигурацией Servlet @WebServlet) в браузере, мне нужно либо добавить этот пользовательский интерфейс тогда и только тогда, когда это пользовательский интерфейс, открытый в другом окне браузера или в другую вкладку и ничего не делать или лучше удалять старый интерфейс и помещать новый пользовательский интерфейс, если окно браузера обновляется.

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

Так как же я могу это сделать? Я нашел эту реализацию (кажется немного уродливой для меня) ->http://dev.vaadin.com/ticket/12191#trac-change-5-1374239207261117

Есть ли другой способ сделать это?

Спасибо за внимание!

ответ

4

Новый пользовательский интерфейс создается при обновлении, поэтому вы можете просто добавить экземпляр UI к карте в методе init для пользовательского интерфейса?

Чтобы удалить пользовательские интерфейсы с карты, вы можете добавить DetachListener, вызывая метод UI.addDetachListener. Этот метод будет вызываться, когда Ваадин отделяет пользовательский интерфейс от приложения.

+0

Благодарим вас за ответ! Да, я могу это сделать, но когда создается тот же пользовательский интерфейс, как я могу узнать, был ли он создан с помощью обновления браузера или просто потому, что пользователь открыл тот же интерфейс на другой вкладке браузера? Мне нужно отличить это, потому что, если я добавлю экземпляр UI, который был обновлен, мне нужно удалить старую ссылку на тот же интерфейс, который у меня был раньше, наоборот, если тот же пользовательский интерфейс создан, но на другой вкладке браузера, мне нужно переписать старую ссылку и добавить новую созданную. – tonix

+0

Я не могу работать с прослушивателем отсоединения, потому что я использую async push для пользовательских интерфейсов, и у меня есть кнопка выхода из системы, которая при нажатии перенаправляет все пользовательские интерфейсы, открываемые пользователем и закрывает сеанс, тогда я заметил, что внутри detach() метод Идентификатор сеанса WrappedSession (который я использую на карте) больше не доступен (я получаю исключение NullPointerException при попытке выполнить этот вызов 'String sessId = VaadinSession.getCurrent(). getSession(). getId();' inside ' public void detach() 'override) – tonix

+0

Отключить вещь легко исправить, так что вы очищаете карту по истечении срока действия сеанса, а в прослушивателе отсоединения вы удаляете только в том случае, если сеанс все еще существует. –

0

Просто переоценить метод refresh() в вашем классе UI. Он работает с @PreserveOnRefresh, поэтому вам не нужно повторно инициализировать свой экземпляр интерфейса.

@Override 
protected void refresh(VaadinRequest request) { 
    super.refresh(request); 
    // TODO do your thing here 
}