Как вы храните объекты Java в HttpSession?

Итак, я пытаюсь заставить сервлет добавить объект Java в сеанс пользователя, когда этот сервлет запрашивается. Но после того, как сервлет перенаправляет на следующую страницу и я пытаюсь получить объект, вместо этого я получаю объект null.

Вот что я делаю, чтобы добавить объект в HttpSession (в сервлет):

request.setAttribute("object", obj);

Затем я пытаюсь получить его (в JSP):

 Object obj = request.getAttribute("object");

Итак, как мне заставить obj не быть нулевым?

Обновление: я также пробовал это ни с чем:

HttpSession session = request.getSession();
session.setAttribute("object", obj);

со следующим в JSP:

 Object obj = request.getSession().getAttribute("object");

Оба способа по-прежнему возвращают значение null.


person Tamer    schedule 23.04.2011    source источник
comment
Вы устанавливаете HttpRequest. Но вопрос говорит HttpSession. Какой из них вы пытаетесь сделать?   -  person CoolBeans    schedule 23.04.2011
comment
Также убедитесь, что в верхней части вашего JSP указано: ‹%@page language=java session=true %›   -  person Romain Hippeau    schedule 07.03.2013
comment
Является ли объект нулевым? Я нашел что-то, что не мог получить какие-либо объекты для разрешения из request.getSession(), мне нужно создать еще один объект сеанса на моей второй странице, и мне нужно было сделать session.getAttribute(object); вместо.   -  person meltdownmonk    schedule 09.10.2013
comment
эта ссылка полезна stackoverflow.com/questions/123657/   -  person Mojtaba    schedule 08.06.2017


Ответы (4)


Вы не добавляете объект в сеанс, вместо этого вы добавляете его в запрос.
Вам нужно следующее:

HttpSession session = request.getSession();
session.setAttribute("MySessionVariable", param);

В сервлетах у вас есть 4 области, в которых вы можете хранить данные.

  1. Применение
  2. Сессия
  3. Запрос
  4. Страница

Убедитесь, что вы понимаете это. Подробнее см. здесь

person Romain Hippeau    schedule 23.04.2011
comment
и вы можете получить сеанс из request.getSession() - person MeBigFatGuy; 23.04.2011
comment
@Tamer: Вы читали эту строку кода? Там написано request, а не session. Если вы установили атрибут на session, то вам нужно получить его и на session! - person BalusC; 24.04.2011
comment
Да, но я также пробовал: <%Object obj = request.getSession().getAttribute("object");%>. Однако ни один из них не работал для меня. - person Tamer; 24.04.2011
comment
@Romain Hippeau, можете ли вы опубликовать полезную ссылку, как данные могут храниться в сеансе, приложении, области запроса? - person Sadanand; 28.07.2014

Добавьте его в сеанс, а не в запрос.

HttpSession session = request.getSession();
session.setAttribute("object", object);

Кроме того, не используйте скриптлеты в JSP. Вместо этого используйте EL; для доступа к object все, что вам нужно, это ${object}.

Основной особенностью технологии JSP версии 2.0 является поддержка языка выражений (EL). Язык выражений позволяет легко получить доступ к данным приложения, хранящимся в компонентах JavaBeans. Например, язык выражений JSP позволяет автору страницы обращаться к компоненту с помощью простого синтаксиса, такого как ${name} для простой переменной или ${name.foo.bar} для вложенного свойства.

person Matt Ball    schedule 23.04.2011

Здесь вы можете сделать это, используя HttpRequest или HttpSession. И подумайте, что ваша проблема в JSP.

Если вы собираетесь использовать внутренний сервлет, сделайте следующее:

Object obj = new Object();
session.setAttribute("object", obj);

or

HttpSession session = request.getSession();
Object obj = new Object();
session.setAttribute("object", obj);

и после установки вашего атрибута с помощью запроса или сеанса используйте следующее для доступа к нему в JSP,

<%= request.getAttribute("object")%>

or

<%= session.getAttribute("object")%>

Похоже, ваша проблема в JSP.

Если вы хотите использовать скриптлеты, это должно быть следующим образом:

<%
Object obj = request.getSession().getAttribute("object");
out.print(obj);
%>

Или можно использовать следующие выражения:

<%= session.getAttribute("object")%>

или может использовать EL следующим образом, ${object} или ${sessionScope.object}

person Chathuranga Withana    schedule 24.04.2011

Объект запроса не является сеансом.

Вы хотите использовать объект сеанса для хранения. Сеанс добавляется к запросу, и вы хотите сохранить данные между запросами. Сессию можно получить

HttpSession session = request.getSession(true);

Затем вы можете использовать setAttribute или getAttribute в сеансе.

Более актуальный учебник по сеансам jsp: http://courses.coreservlets.com/Course-Materials/pdf/csajsp2/08-Session-Tracking.pdf

person ditkin    schedule 23.04.2011
comment
У меня аналогичная проблема, используя EL, я могу получить доступ к атрибутам из приложений и областей запросов, но не к области сеанса. Я использую правильный синтаксис. - person kiwicomb123; 18.09.2016