Ответ 1
Сессия с состоянием Bean (SFSB) должна сочетаться с сеансом HTTP в веб-среде, поскольку это чистый бизнес Bean, который сам ничего не знает о веб-уровне.
Традиционно EJB даже обязательно жили внутри своего модуля (модуль EJB), который даже не мог получить доступ к веб-артефактам, если они этого хотели. Это аспект многоуровневых систем. Дополнительную информацию об этом см. В упаковке EJB в JavaEE 6 WAR vs EAR.
Исходными клиентами для сеанса Stateful Session Beans были среди прочих настольные приложения Swing, которые передавались с удаленного EJB-сервера через двоичный протокол. Приложение Swing получит соединение с удаленным сеансом с состоянием Bean через объект proxy/stub. Встроенный в этот прокси-сервер - это идентификатор некоторого типа, который сервер может связывать с определенным SFSB. Держась за этот прокси-объект, клиент Swing может совершать повторные вызовы, и они перейдут к тому же экземпляру Bean. Таким образом, создается сеанс между клиентом и сервером.
В случае веб-приложения, когда браузер выполняет первоначальный запрос к веб-приложению Java EE, он получает JSESSIONID
, который сервер может связать с конкретным экземпляром HTTPSession
. Удерживая это JSESSIONID
, браузер может предоставить его с каждым последующим запросом, и это активирует одну и ту же серверную сессию http.
Итак, эти понятия очень похожи, но они автоматически не сопоставляются друг с другом.
Браузер получает только JSESSIONID
и не знает ни одного идентификатора SFSB. В отличие от приложения Swing, браузер взаимодействует с веб-страницами, а не напрямую с Java beans.
Для сопоставления клиентского запроса с определенным сеансом с состоянием bean контейнер EJB заботится только об идентификаторе, предоставленном через прокси-сервер SFSB. Он не видит, произошел ли звонок из кода в веб-модуле и не может/не должен/не иметь доступа к каким-либо HTTP-контекстам.
Веб-уровень, являющийся клиентским кодом, который обращается к SFSB, должен "удерживать" ссылку на конкретную ссылку прокси. Удержание на что-то в веб-слое обычно означает сохранение его в сеансе HTTP.
Однако существует технология моста под названием CDI
, которая может сделать это автоматическое соединение. Если вы комментируете свой SFSB с помощью CDI @SessionScoped
и получаете ссылку на SFSB через CDI (например, с помощью @Inject
), вам не нужно вручную помещать SFSB в сеанс http. Тем не менее, за кулисами CDI будет делать это в любом случае.