Если я хочу отслеживать диалоговое состояние с каждым клиентом, использующим мое веб-приложение, которое является лучшей альтернативой - Бобом Сессии или Сеансом HTTP - для использования?
//request is a variable of the class javax.servlet.http.HttpServletRequest
//UserState is a POJO
HttpSession session = request.getSession(true);
UserState state = (UserState)(session.getAttribute("UserState"));
if (state == null) { //create default value .. }
String uid = state.getUID();
//now do things with the user id
В реализации ServletContextListener, зарегистрированного как веб-приложение Слушатель в WEB-INF/web.xml
:
//UserState NOT a POJO this this time, it is
//the interface of the UserStateBean Stateful Session EJB
@EJB
private UserState userStateBean;
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
servletContext.setAttribute("UserState", userStateBean);
...
В JSP:
public void jspInit() {
UserState state = (UserState)(getServletContext().getAttribute("UserState"));
...
}
В другом месте в теле того же JSP:
String uid = state.getUID();
//now do things with the user id
Мне кажется, что они являются почти тем же, при этом основное различие - то, что экземпляр UserState транспортируется в HttpRequest.HttpSession
в первом, и в a ServletContext
в случае последнего.
Какой из этих двух методов более устойчив, и почему?
Как указал @BalusC, в вашем примере EJB будет то же самое для всех клиентов - не то, что вы хотите.
Вы все еще можете изменить это и иметь один EJB для каждого клиента, если, например, вы создаете EJB, когда пользователь входит в систему и сохраняете его в сеансе, или что-то подобное.
Но есть и другие более тонкие различия между использованием HttpSession
и сессионного компонента с отслеживанием состояния (SFSB). Особенно эти два:
См. Этот ответ для более подробной информации: Правильное использование SFSB с сервлетами
В итоге: я бы посоветовал использовать подход HttpSession
и против SFSB в вашем случае; используйте SFSB только в том случае, если он предоставляет то, что вы не можете сделать с HttpSession
, что не так.
ServletContext
представляет область приложения. Атрибуты области приложения являются общими для всех запросов во всех сеансах. Это «глобальные приложения для всего приложения». Вы не хотите хранить там информацию о клиенте (а значит, о сеансе). Если новый клиент входит в систему, существующий EJB в области приложения будет заменен специфичным для клиента и будет отражен для всех клиентов.
Область сеанса предназначена именно для этой цели. Используйте это.