在JSR 286 Portlet中获取portletSessionScope属性

时间:2014-04-08 18:22:44

标签: jsp jstl el jsr286 vignette

我正在研究JSR 286 Portlet(Portlet规范2.0)。我有一些我想在JSP上设置的值,我通过session.setAttribute()在我的Java代码中设置。但是,我似乎无法在不使用portlet命名空间名称的情况下从JSP中的PortletSession中取回该属性。

我对JSR 286和PortletSession的理解是:

  • 每个portlet都将被赋予它自己的" portlet会话",这是来自Web容器的HttpSession的子部分
  • 添加到" portlet会话的属性"只会对该portlet可见
  • 通过在属性中添加命名空间来完成分离,其形式为" javax.portlet.p。?",其中是Portlet的唯一标识符,是属性的名称

在阅读本文时,我的印象是在JSP中使用portletSessionScope对象会让我对该属性进行取消引用访问,从而允许我将值恢复为类似于您在普通的JSP代码和HttpSession。但是,情况似乎并非如此。

使用以下Java代码:

private static void processGetMessage(ActionRequest request, ActionResponse response) throws PortletException, IOException {
    PortletSession session = request.getPortletSession();
    session.setAttribute("MESSAGE", "This is a sample message", PortletSession.PORTLET_SCOPE);
}

我希望以下内容在JSP代码中正常工作:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet_2_0" %>
<portlet:defineObjects/>
<html>
  <body>
    <div>
       ${portletSessionScope.MESSAGE}
    </div>
  </body>
</html>

但是我在<div>标签中没有打印任何内容。我也尝试过:

  • ${portletSessionScope.sessionData.MESSAGE}
  • ${portletSessionScope[MESSAGE]}
  • ${portletSessionScope["MESSAGE"]}
  • <%=portletSession.getAttribute("MESSAGE", PortletSession.PORTLET_SCOPE)%>

以及其他一些人。但是,如果我打印出pageSessionScope中的所有变量,就像这样:

<table>
    <c:forEach items="${portletSessionScope}" var="s">
        <tr><td>${s.key}</td><td>${s.value}</td></tr>
    </c:forEach>
</table>

我在那里看到它,只是预先设置了门户ID,如下所示:

  

javax.portlet.p.9f4396132993df65a8017810d6c48a0c-a6f0dbfb9072591830fbfb10d6c48a0c-96d16bb01556c9c7725e4632d6c48a0c?MESSAGE

如果我接受并将其过去如下: <%=portletSession.getAttribute("javax.portlet.p.9f4396132993df65a8017810d6c48a0c-a6f0dbfb9072591830fbfb10d6c48a0c-96d16bb01556c9c7725e4632d6c48a0c?MESSAGE", PortletSession.PORTLET_SCOPE)%>

甚至

${portletSessionScope["javax.portlet.p.9f4396132993df65a8017810d6c48a0c-a6f0dbfb9072591830fbfb10d6c48a0c-96d16bb01556c9c7725e4632d6c48a0c?MESSAGE"]}

然后就可以了。

所以,问题:

  1. 为什么使用JSTL和EL的简单表单不起作用?
  2. 是否有可能让JSTL / EL工作正如我所期望的那样?
  3. 如果没有,我怎样才能获得用于预先添加到属性名称的命名空间的值?它不仅仅是来自<portal:namespace>的价值,它似乎也有一些特定的实例ID信息。
  4. 如果它有助于识别我们在WebLogic 9.2和Vignette 7.4上的问题。

1 个答案:

答案 0 :(得分:1)

与供应商交谈后,它似乎是我们目前所在的Vignette门户版本中的一个已知错误。错误是他们不正确地构建PortletSession变量的映射以包括所有Se​​ssion变量而不仅仅是PortletSession变量,而后者又包括“javax.portlet.p。?”。在所有名字的正面。该修复程序最终将转移到更新的版本,我们目前正在进行此操作。在此期间,我使用scriptlet(快门思考......)将变量直接从PortletSession复制到pageContext中,如下所示:

<portlet:defineObjects/>
<%
    PortletSession sess = renderRequest.getPortletSession();
    pageContext.setAttribute("message", sess.getAttribute("MESSAGE"));
%>

之后我可以简单地使用JSTL / EL来取消消息值。