如何通过多个请求在会话上设置变量

时间:2018-01-29 19:33:44

标签: jsp session tomcat servlets liferay-7

在我的Liferay 7主题中,我想记住用户点击的最后一页。所以,在我的主题中,我有以下内容:

<#if nav_item.isSelected()>
  ${request.getSession().setAttribute("LAST_ACTIVE",nav_item.getName())}
</#if>

在我的portlet JSP中,我想要检索值:

request.getSession().getAttribute("LAST_ACTIVE")

但是,我总是得到一个null值,可能是因为每个请求都重新创建了会话。如何存储值以使其持续多个请求?

3 个答案:

答案 0 :(得分:1)

Portles(来自您提到的.jsp)可能有一个私有portlet范围的会话,它不需要与主题的会话完全相等。 您应该在前面添加LIFERAY_SHARED_作为会话属性的前缀。 如果这不起作用,您可以尝试在读取和写入会话属性时添加PortletSession.APPLICATION_SCOPE作为附加范围参数。

答案 1 :(得分:1)

我建议你从另一边看问题。会话方法并不错,但可能更好的方法是使用过滤器或预先操作来填充请求属性。优点是,您可以将属性设置为实际更改。通过主题会话方法,您总是有点落后。

答案 2 :(得分:1)

根据您的评论,将我对安德烈问题的评论提升为答案:

主题中的

${request.getClass().getName()}通常会显示HttpServletRequest的后代,而portlet通常使用PortletRequest - 这些是不同的元素(如此处列出的私有属性除非明确共享)。

在portlet JSP中,请注意${request} JSP Spec 预定义为HttpServletRequest(因此在portlet中通常无用),而 Portlet Spec 定义${renderRequest}。确保在JSP中使用正确的一个。在portlet世界中,这通常是后者。