如何在 HttpSession 中存储 Java 对象?

Posted

技术标签:

【中文标题】如何在 HttpSession 中存储 Java 对象?【英文标题】:How do you store Java objects in HttpSession? 【发布时间】:2011-08-11 14:41:05 【问题描述】:

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

这是我将对象添加到 HttpSession(在 servlet 中)的操作:

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。

【问题讨论】:

您正在设置为 HttpRequest。但问题是HttpSession。你想做什么? 还要确保在您的 JSP 顶部有: obj 是否为空?我发现我无法从 request.getSession() 获得任何对象来解析,我必须在我的第二页上创建另一个会话对象,我需要做 session.getAttribute("object");而是。 这个链接很有帮助***.com/questions/123657/… 【参考方案1】:

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

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

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

    应用 会话 请求 页面

确保您了解这些内容。更多请看here

【讨论】:

可以从request.getSession()获取会话 <%Object obj = request.getAttribute("object");%> @Tamer:你读过这行代码吗?它说request,它没有说session。如果您在session 上设置了属性,那么您还需要从session 获取它! 是的,但我也尝试过:<%Object obj = request.getSession().getAttribute("object");%>。但是,两者都不适合我。 @Romain Hippeau 你能发布一些有用的链接,如何将数据存储在会话、应用程序、请求范围中吗?【参考方案2】:

将其添加到会话,而不是请求

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

另外,不要在 JSP 中使用 scriptlet。请改用EL;要访问object,您只需要$object

JSP 技术 2.0 版的一个主要特性是它对表达式语言 (EL) 的支持。表达式语言可以轻松访问存储在 JavaBeans 组件中的应用程序数据。例如,JSP 表达式语言允许页面作者使用简单的语法访问 bean,例如 $name 用于简单变量或 $name.foo.bar 用于嵌套属性。

【讨论】:

【参考方案3】:

请求对象不是会话。

您想使用会话对象来存储。会话被添加到请求中,并且您想要跨请求保留数据。会话可以从

获得
HttpSession session = request.getSession(true);

然后你可以在会话上使用 setAttribute 或 getAttribute。

关于 jsp 会话的最新教程是:http://courses.coreservlets.com/Course-Materials/pdf/csajsp2/08-Session-Tracking.pdf

【讨论】:

我遇到了类似的问题,使用 EL,我可以从应用程序和请求范围访问属性,但不能访问会话范围。我使用了正确的语法。【参考方案4】:

在这里您可以使用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 中。

如果要使用scriptlet,应该如下,

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

或者可以使用如下表达式,

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

或者可以如下使用EL, $object$sessionScope.object

【讨论】:

以上是关于如何在 HttpSession 中存储 Java 对象?的主要内容,如果未能解决你的问题,请参考以下文章

HttpSession 数据存储在哪里?

在java后台服务器,如何根据HttpSession获得客户端ip?

如何获取 Web 应用程序中所有 HttpSession 对象的列表?

服务器端(HttpSession)

小结java使用Websocket获取HttpSession出现的问题

java使用websocket,并且获取HttpSession,源码分析