Куда относятся данные сеанса в Wicket? - PullRequest
2 голосов
/ 07 декабря 2011

Поскольку Wicket автоматически управляет состоянием сеанса путем сериализации компонентов на моей странице, мне остается только задуматься, на каком уровне мне следует прикреплять свои данные о состоянии. Точнее говоря, похоже, что ошибка, которую я имею, вызвана тем, что объект WebApplication распределяется между сеансами.

  • Является ли экземпляр приложения общим для сеансов?
  • Должен ли я всегда прикреплять данные сеанса к экземпляру Page?
  • Что произойдет, если я повторно использую компоненты с прикрепленным состоянием сеанса на нескольких страницах? Распространяются ли эти экземпляры, т. Е. Если я устанавливаю состояние компонента на одной странице, переносится ли оно на другую?

Я предполагаю, что третий пункт пули зависит от идентичности объекта. Что использует Wicket, чтобы определить, equals() (например, использует ли Map)?

Данные, которые я прикрепил к объекту приложения, находятся в состоянии, которое мне нужно на многих страницах, поэтому я не прикреплял их к объектам страницы. Это правильный способ сделать это в Wicket?

1 Ответ

7 голосов
/ 07 декабря 2011
  1. Да, в этом и есть смысл Application объекта.Вы можете хранить и получать доступ к данным всего приложения (обычно к конфигурации) через ваш Application подкласс в любой точке.
  2. Нет.Существуют случаи, когда вам необходимо обмениваться данными сеанса на нескольких страницах, когда более целесообразно хранить их в объекте Session.(Примером может быть логин пользователя, который определенно принадлежит сеансу и может использоваться любой страницей.) Конечно, вы можете передавать данные между страницами, но это не очень хорошая стратегия.Где точка отсечения будет вашим решением: если данные распределяются между двумя страницами, вы можете захотеть передать их с одной на другую, если есть 20 страниц, вы определенно не захотите.
  3. Вы не должны повторно использовать экземпляры компонентов на разных страницах.Конечно, вы будете использовать класс повторно, но вам придется создавать новый на каждой странице.Именно здесь может пригодиться хранение данных в объекте Session.

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

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

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

Существует несколько способов получить текущий объект Session.Проверьте документацию класса , чтобы узнать, как это сделать.

Чтобы суммировать полученную информацию: Wicket не рекомендует использовать свойства типа небезопасных сеансов, не предоставляя общих setProperty -подобных методов.Вместо этого вы должны расширить Session, или для большинства проектов, более адекватно, WebSession и поместить безопасные для типов свойства в этот класс.Затем вы переопределяете newSession в своем классе приложения.

...