Одноэлементное приложение RAP

Итак, я читал о приложениях RAP и не могу перестать задаваться вопросом, как мне создать статические переменные только для текущего сеанса (в случае, если к приложению одновременно обращаются несколько человек). Я читал о SingletonUtil. Тем не менее, у меня есть несколько вопросов по этому поводу.

1- Должен ли я создать один SessionSingleton для приложения? Или я должен создать один SessionSingleton для каждого класса, который у меня есть в моем приложении (я знаю, что это звучит глупо, и я, вероятно, должен создать только один SessionSingleton для приложения, но... Просто убедитесь).

2- Как только я создам этот синглтон, каждый пользователь (или сеанс) будет иметь доступ только к своим статическим полям, верно? правильно ли утверждать, что они не будут получать данные из других статических полей из разных сессий? (Предположим, я создаю корзину для покупок. Это было бы невозможно сделать, если бы клиенты могли видеть корзину из другого сеанса).


person Marcelo Amoretti    schedule 09.03.2017    source источник
comment
Короче говоря: вы вообще не должны использовать переменные static. Фреймворк каким-то образом предоставляет вам объект-контейнер области сеанса (я не знаю о RAP). И вы должны использовать это для любой вещи, которая должна пережить текущий вызов и не нуждается в сохранении в базе данных.   -  person Timothy Truckle    schedule 09.03.2017


Ответы (1)


Чтобы повторить то, что сказал Тимоти Тракл, вам следует держаться подальше от синглтонов, насколько это возможно.

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

Чтобы предоставить корзину для каждого сеанса, вы можете использовать SingletonUtil для

Либо вот так

SoppingCart cart = SingletonUtil.getSessionInstance( ShoppingCart.class );

or

SoppingCart cart = SingletonUtil.getUniqueInstance( ShoppingCart.class, session );

В первом варианте используется текущий сеанс пользовательского интерфейса — тот, который назначен текущему выполняемому потоку запросов.

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

UISession session = RWT.getUISession( display );

Thread thread = new Thread( this::calcualteItemsInShoppingCart );
thread.start();

void calculateItemsInShopingCart() {
  SoppingCart cart = SingletonUtil.getUniqueInstance( ShoppingCart.class, session );
  // use cart...
}

В общем, используйте синглтоны (сеанс/приложение) только в крайнем случае. Рано или поздно они станут обузой. Постарайтесь спроектировать свой код так, чтобы вы могли создать корзину или пример в точке входа и передать ее тем частям кода, которым требуется доступ к ней.

Обратите внимание, что в RAP может быть несколько сеансов пользовательского интерфейса (по одному на окно/вкладку браузера) на сеанс сервлета.

См. также Одиночки и статические поля в RAP глава документации ПДП.

Это отвечает на ваш вопрос?

person Rüdiger Herrmann    schedule 10.03.2017
comment
Да, это так. Спасибо, Рюдигер! - person Marcelo Amoretti; 10.03.2017