我正在研究JSR 286 Portlet(Portlet规范2.0)。我有一些我想在JSP上设置的值,我通过session.setAttribute()
在我的Java代码中设置。但是,我似乎无法在不使用portlet命名空间名称的情况下从JSP中的PortletSession
中取回该属性。
我对JSR 286和PortletSession
的理解是:
在阅读本文时,我的印象是在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"]}
然后就可以了。
所以,问题:
<portal:namespace>
的价值,它似乎也有一些特定的实例ID信息。如果它有助于识别我们在WebLogic 9.2和Vignette 7.4上的问题。
答案 0 :(得分: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来取消消息值。