2

我正在研究 JSR 286 Portlet(Portlet 规范 2.0)。我尝试在 JSP 上设置一些值,我通过session.setAttribute(). 但是,我似乎无法从PortletSession但是,如果不使用 portlet 命名空间名称

我对 JSR 286 的理解PortletSession是这样的:

  • 每个 portlet 都会被赋予它自己的“portlet session”,它是来自 web 容器的 HttpSession 的一个子部分
  • 添加到“portlet 会话”的属性将仅对该 portlet 可见
  • 分离是通过向属性添加名称空间来完成的,格式为“javax.portlet.p.?”,其中 是 Portlet 的唯一标识符并且是属性的名称。

在阅读本文时,我的印象是,portletSessionScope在 JSP 中使用该对象会给我对属性的取消引用访问权限,从而使我能够像在普通 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. 如果不是,我如何获取用于附加到属性名称的命名空间的值?这不仅仅是 from 的值<portal:namespace>,它似乎也有一些特定的实例 ID 信息。

如果它有助于识别我们在 WebLogic 9.2 和 Vignette 7.4 上的问题。

4

1 回答 1

1

在与供应商交谈后,这似乎是我们当前使用的 Vignette 门户版本中的一个已知错误。错误是他们不正确地构建 PortletSession 变量映射以包含所有 Session 变量,而不仅仅是 PortletSession 变量,后者又包含“javax.portlet.p.?” 在所有名字的前面。修复最终将是迁移到更新的版本,我们目前正在这样做。与此同时,我正在使用 scriptlet(百叶窗思考......)将变量直接从 PortletSession 复制到 pageContext 中,如下所示:

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

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

于 2014-04-09T12:29:25.843 回答