2014-05-02 3 views
0

Я развернул веб-приложение на локальном сервере GlassFish. Это приложение получает информацию о заказе от пользователя и сохраняет его в переменной типа в бите сеанса без состояния. Объект списка создается в конструкторе.Состояние состояния бранда состояния без состояния

Открываю страницу заказа и добавляю в нее несколько заказов. Когда я открываю страницу заказов на шоу в разных вкладках и разных браузерах, она отображает весь компонент информации о заказе правильно, как будто состояние поддерживается в статусе без статусов!

Я думаю, что это поведение неверно, так как каждый браузер/вкладка должен создавать разные сеансы с сервером, и для каждого браузера/вкладки должна отображаться новая информация о заказе. Как объяснить это поведение?

+0

Я получаю ссылку на Session Bean с помощью тега DI '@ EJB'. Является ли JNDI более предпочтительным? Какой путь лучше? –

ответ

1

Ваш прецедент - это именно то, для чего предназначен сеансовый бит состояния, если вы хотите, чтобы ваш объект списка поддерживался через вызовы методов, и если вы хотите, чтобы каждому сеансу был назначен свой собственный компонент.

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

См. Также;

conversational state of session beans

и

Stateless and Stateful Enterprise Java Beans


Никогда не позволяйте, что вы не можете сделать получить в пути того, что вы можете сделать.

+0

Спасибо за ответ @RickF. Я понимаю.Для испытания я изменил аннотацию на '@ Stateful'. Теперь я ожидаю, что каждый вызов сервлета из другого браузера должен иметь свой сеанс. И это так. Я проверил идентификатор сеанса, и я использую другой браузер при использовании другого браузера. Но когда я печатаю «Список» заказов из другого браузера, он показывает тот же список, что и предыдущий. Мой список делится между двумя разными сессиями! Я не могу понять это поведение. Было бы здорово, если бы вы могли объяснить. –

+0

Я не могу быть уверен, что происходит, но кажется, что, возможно, вы добавили компонент состояния в свой сервлет как переменную экземпляра. Помните, что сервлеты будут обслуживать несколько потоков (несколько запросов из разных сеансов), поэтому любая переменная экземпляра будет доступна всем из них. Взгляните на это; RickF

+0

Да, я сделал это раньше. Также я использовал DI для инъекций. Согласно рекомендациям, которые вы предоставили в ответ, я удалил DI и использовал JNDI в методе doPost, так как он является предпочтительным способом для боба состояния. Это дает «NamingException», и я расследую, почему. –

0

Задача: Состоящий сеанс Бин не поддерживал отдельное состояние для каждого клиента. В примере, который я попробовал, я ввожу заказы со страницы JSP, которые были сохранены в List в компоненте Sessionful Session. Когда я вызывал тот же URL-адрес из другого браузера (т. Е. Другого сеанса), список заявок, введенных в предыдущем сеансе, был видимым. Тот же EJB ссылался на обе сессии. (Проверено sysouts)

Это как сказать, корзина для покупок какого-либо другого пользователя была непосредственно видна мне, как если бы они были моими заказами!

Решение: Использовали HttpSessionListener и получили зависимость Stateful EJB через JNDI, в sessionCreated(HttpSessionEvent se) методе. Затем добавили EJB состояния в HttpSession и получили доступ к EJB через сеанс в сервлете.

Предложения по использованию JNDI, а не DI, для компонента Session Session Bean и добавления EJB в HttpSession приведены в ответе выше. Не знаю, подходит ли это путь, но он работает!

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