我正在研究 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"]}
然后它工作得很好。
所以,问题:
- 为什么使用 JSTL 和 EL 的简单表单不起作用?
- 是否有可能让 JSTL/EL 像我期望的那样工作?
- 如果不是,我如何获取用于附加到属性名称的命名空间的值?这不仅仅是 from 的值
<portal:namespace>
,它似乎也有一些特定的实例 ID 信息。
如果它有助于识别我们在 WebLogic 9.2 和 Vignette 7.4 上的问题。