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