如何将Java对象存储在HttpSession中?

38

我正在尝试让一个servlet在被请求时将Java对象添加到用户的session中。但是当servlet重定向到下一页并尝试检索对象时,我得到了一个null对象。

以下是我在servlet中用于将对象添加到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。


4
你正在设置 HttpRequest,但问题中提到的是 HttpSession。你想要做哪一个? - CoolBeans
还要确保在您的JSP顶部有以下内容:<%@page language="java" session="true" %>。 - Romain Hippeau
对象是否为空?我发现无法从request.getSession()中解析任何对象,我必须在第二个页面上创建另一个会话对象,并且需要使用session.getAttribute("object");。 - meltdownmonk
这个链接很有帮助 https://dev59.com/FnVD5IYBdhLWcg3wAGiD?answertab=votes#tab-top - Mojtaba
4个回答

50

你没有将对象添加到会话中,而是将其添加到请求中。
你需要做的是:

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

在Servlet中,您有4个可以存储数据的范围。

  1. 应用程序
  2. 会话
  3. 请求
  4. 页面

请确保您理解这些。欲了解更多,请查看此处


6
您可以通过request.getSession()方法获取会话。 - MeBigFatGuy
<%Object obj = request.getAttribute("object");%> - Tamer
12
@Tamer: 你读过这行代码吗?它写的是 request,而不是 session。如果你已经在 session 上设置了属性,那么也需要从 session 中获取它! - BalusC
是的,但我也尝试过:<%Object obj = request.getSession().getAttribute("object");%>。然而,都对我没用。 - Tamer
1
@Romain Hippeau,您能否发布一些有用的链接,介绍如何将数据存储在会话(session)、应用程序(application)和请求(request)范围内? - Sadanand

13
将它添加到会话(session),而不是请求(request)中。
HttpSession session = request.getSession();
session.setAttribute("object", object);

同时,不要在JSP中使用脚本小程序(scriptlets)。相反,使用EL表达式语言;只需使用${object}即可访问object

JSP技术版本2.0的一个主要特点是支持表达式语言(EL)。表达式语言使得访问存储在JavaBean组件中的应用程序数据变得更加容易。例如,JSP表达式语言允许页面作者使用简单的语法访问bean,如对于简单变量使用${name},对于嵌套属性使用${name.foo.bar}


7

您可以使用HttpRequestHttpSession来实现。而且我认为您的问题在JSP中。

如果您要使用内部servlet,请按照以下步骤操作:

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

或者

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

在使用请求或会话设置属性之后,可以使用以下方法在JSP中访问它:

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

或者

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

看起来你的问题在JSP中。

如果你想使用scriptlets,应该按照以下方式进行:

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

或者可以使用以下表达式:
<%= session.getAttribute("object")%>

或者可以使用以下EL表达式: ${object}${sessionScope.object}

2

请求对象并不是会话对象。

您希望使用会话对象进行存储。会话被添加到请求中,这是您希望跨请求保留数据的地方。可以从中获取会话:

HttpSession session = request.getSession(true);

接下来,您可以在会话上使用setAttribute或getAttribute。

有关JSP会话的更多最新教程,请参阅:http://courses.coreservlets.com/Course-Materials/pdf/csajsp2/08-Session-Tracking.pdf


我遇到了类似的问题,使用EL表达式,我可以访问应用程序和请求范围内的属性,但无法访问会话范围内的属性。我正在使用正确的语法。 - kiwicomb123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接