Контекст вкладки браузера Apache Wicket 6

Для моего приложения apache wicket мне нужен какой-то объект контекста вкладки браузера, аналогичный Application и Session, только для отдельных вкладок браузера.

Причина, по которой мне это нужно, заключается в том, что все данные, просматриваемые на странице в приложении, связаны с определенной датой в истории. Эта дата в настоящее время хранится в моем объекте Session. Если пользователь использует две (или более) вкладки браузера и меняет дату на вкладке 1 и перезагружает вкладку 2, на вкладке 2 теперь используется та же дата. Но он должен сохранить свою собственную дату.

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

Пример:

Начните с вкладки 1 на странице 1 с датой = d1: t1p1d1
Пользователь переходит к p2: t1p2d1
Пользователь изменяет дату на d2: t1p2d2
Пользователь переходит к p3 с помощью «Открыть в новой вкладке»: t2p2d2
> Пользователь изменяет дату с t2 на d3: t2p2d3
Пользователь переходит с t1 на p4: t1p4d2

Единственное решение, которое я могу сейчас представить, — это передача даты во всех ссылках через PageParameters и сохранение ее на странице. При изменении даты необходимо обновить переменную, а также каждую ссылку на странице (это будет полная перезагрузка страницы).

Есть ли лучшие идеи для этого без раздувания URL-адресов? Что-то вроде Page.get().getDate() или Tab.get().getDate(), похожее на Session.get().getDate()? Может быть, какая-то магия ThreadLocal или Javascript window.name или функция API сервлета...

Может быть, кто-то уже делал что-то подобное?


person Matthias    schedule 30.04.2015    source источник


Ответы (1)


Лучшее, что я могу придумать, это использовать https://github.com/apache/wicket/blob/master/wicket-core/src/main/java/org/apache/wicket/ajax/AjaxNewWindowNotifyingBehavior.java для определить, когда экземпляр страницы открыт в двух вкладках/окнах. Таким образом, вы можете сохранить дату как свойство страницы. Если AjaxNewWindowNotificationBehavior обнаруживает вторую вкладку для того же экземпляра страницы, просто создайте новый экземпляр того же класса: setResponsePage(getPage().getClass()). Таким образом, на новой вкладке будет отображаться новый экземпляр страницы со своим собственным свойством Date.

person martin-g    schedule 30.04.2015
comment
Это также работает для разных экземпляров страницы? Я использую BookmarkablePageLinks со страницами с аннотациями @MountPath, поэтому очень редко один и тот же экземпляр страницы открывается в новой вкладке. - person Matthias; 03.05.2015
comment
Нет. Это обнаруживается только тогда, когда один и тот же экземпляр страницы открывается более одного раза. Если экземпляры страниц отличаются от вы можете сохранить дату в иерархии страниц. Он не будет конфликтовать с теми, что на других страницах. - person martin-g; 03.05.2015