2016-07-19 2 views
-2

Я разрабатываю веб-приложение Java, и у меня есть некоторые проблемы с обменом переменными. Насколько я знаю, существует два способа: (1) с использованием статических переменных, каждый класс может получить доступ к данным var, (2), используя setter и getter.Обмен переменными между классами в Java EE

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

Итак, кто-нибудь может объяснить мне, как обмениваться информацией только для данного сеанса?

Чтобы быть более явным:

Я попытался отделить модель от вида аспекта моего приложения. Таким образом, модель пакета будет содержать все запросы к базам данных или запросы веб-сервисов, например, и пакет View будет содержать все страницы сервлетов и пользовательские взаимодействия с программой. Когда пользователь выбирает параметр, эта информация хранится в открытом статическом var, а другие классы могут получить доступ. Но конфликты возникают, когда два пользователя выбирают два разных варианта. Причина, по которой переменная является статической ... Мне нужна переменная, которая может быть разделена между классами и сохранять ее значение только для данного пользователя.

+0

Нам действительно нужно хорошее количество деталей, чтобы помочь вам. Какие переменные? Являются ли они частными для пользователя? Являются ли они глобальными для всего приложения? Возможно, отредактируйте свой пост и предоставите более подробную информацию. – stdunbar

ответ

1

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

Ваш второй вариант, «(2) с помощью setter и getter», не совсем понятен.

Если вы хотите сохранить состояние, в котором оно отображается только одному пользователю, вы можете поместить его в HttpSession. Вещи, хранящиеся в HttpSession, специфичны для текущего пользователя, входившего в систему. Это временное место хранения, только когда сеанс заканчивается, содержимое сеанса уходит. Слишком много вещей в HttpSession может быть проблемой; он может занимать много памяти и может вызвать замедление в кластерном приложении, поскольку узлы пытаются скопировать информацию между узлами, чтобы поддерживать содержимое сеанса каждого сервера. (Альтернативой является привязка пользователей к заданному серверу, в результате чего распределенная загрузка распределяется неравномерно.)

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

+0

Большое спасибо, я не знал httpSession, на самом деле, очень полезно мы можем хранить (устанавливать и получать) все данные, которые нам нужны в соответствии с каждым пользователем – pseudo2188

Смежные вопросы