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

Jsp 如何通过多个请求在会话上设置变量,jsp,session,tomcat,servlets,liferay-7,Jsp,Session,Tomcat,Servlets,Liferay 7,在我的Liferay 7主题中,我想记住用户单击的最后一页。因此,在我的主题中,我有以下几点: <#if nav_item.isSelected()> ${request.getSession().setAttribute("LAST_ACTIVE",nav_item.getName())} </#if> 但是,我总是得到一个null值,可能是因为每次请求都会重新创建会话。如何存储该值以使其持续多个请求?Portles(来自您提到的.jsp)可能有一个私有的port

在我的Liferay 7主题中,我想记住用户单击的最后一页。因此,在我的主题中,我有以下几点:

<#if nav_item.isSelected()>
  ${request.getSession().setAttribute("LAST_ACTIVE",nav_item.getName())}
</#if>
但是,我总是得到一个
null
值,可能是因为每次请求都会重新创建会话。如何存储该值以使其持续多个请求?

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

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

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

我建议您从另一个角度看待问题。会话方法不错,但可能更好的方法是使用过滤器或预操作来填充请求属性。这样做的好处是,可以将属性设置为实际更改。使用主题会话方法,您总是有点落后。

根据您的评论,将我对Andre问题的评论提升为回答:

主题中的
${request.getClass().getName()}
通常显示
HttpServletRequest
的后代,而portlet通常使用
PortletRequest
——这些元素是不同的元素(此处列出了私有属性,除非显式共享)


在portlet JSP中,请注意,
${request}
由JSP规范预定义为
HttpServletRequest
(因此在portlet中通常是无用的),而portlet规范定义了
${renderRequest}
。确保在JSP中使用正确的。在portlet世界中,这通常是较晚的。

根据您的评论,将我对Andre问题的评论提升为回答:

主题中的
${request.getClass().getName()}
通常显示
HttpServletRequest
的后代,而portlet通常使用
PortletRequest
——这些元素是不同的元素(此处列出了私有属性,除非显式共享)


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

你能确认nav_项。getName()没有返回null吗?是的,我已经确认它没有返回null。你能确认nav_项。getName()没有返回null吗?是的,我已经确认它没有返回null。作为一个额外的解释和心智模型:
${request.getClass().getName()}主题中的
通常显示HttpServletRequest的后代,而portlet通常使用PortletRequest-这些是不同的元素(此处列出了私有属性,除非显式共享)。在portlet JSP中,请注意,
${request}
由JSP规范预定义为
HttpServletRequest
(在portlet中通常是无用的),而portletSpec定义了
${renderRequest}
。请确保在JSP中使用正确的工具。@OlafKock这就是问题所在,从未注意到,谢谢!作为一个额外的解释和心智模型:
${request.getClass().getName()}
在主题中通常显示HttpServletRequest的后代,而portlet通常使用PortletRequest-这些是不同的元素(此处列出了私有属性,除非显式共享)。在portlet JSP中,请注意,
${request}
由JSP规范预定义为
HttpServletRequest
(在portlet中通常是无用的),而portletSpec定义了
${renderRequest}
。请确保在JSP中使用正确的工具。@OlafKock这就是问题所在,从未注意到,谢谢!我为我迟来的反应道歉。Miroslav,你有关于过滤/预处理方法的更多信息吗?基本上,我要解决的问题是,在Liferay中,当我单击一篇文章时,该文章将显示在一个单独的页面中,该页面隐藏在导航栏中。因此,最后单击的导航项应该是具有活动css类的导航项。我的解决方法是在会话变量中包含最后一个nav_项,在呈现navbar时,我会检查url中的“/-/”以及是否存在会话变量。如果是这样,我将活动类添加到最后一个元素。我很想知道是否有更好/更容易的解决办法。我为我反应迟钝而道歉。Miroslav,你有关于过滤/预处理方法的更多信息吗?基本上,我要解决的问题是,在Liferay中,当我单击一篇文章时,该文章将显示在一个单独的页面中,该页面隐藏在导航栏中。因此,最后单击的导航项应该是具有活动css类的导航项。我的解决方法是在会话变量中包含最后一个nav_项,在呈现navbar时,我会检查url中的“/-/”以及是否存在会话变量。如果是这样,我将活动类添加到最后一个元素。我很想知道是否有更好/更简单的解决方案
request.getSession().getAttribute("LAST_ACTIVE")