Получение атрибутов portletSessionScope в портлете JSR 286
Я работаю над портлетом JSR 286 (спецификация портлета 2.0). У меня есть некоторые значения, которые я пытаюсь установить в JSP, которые я устанавливаю в своем коде Java через session.setAttribute()
, Тем не менее, я не могу вернуть атрибут из PortletSession
в JSP без использования имени пространства имен портлета.
Мое понимание JSR 286 и PortletSession
это:
- Каждому портлету будет присвоен свой "сеанс портлета", который является подразделом HttpSession из веб-контейнера.
- Атрибуты, добавленные в "сеанс портлета", будут видны только этому портлету
- Разделение выполняется путем добавления пространства имен к атрибутам в форме "javax.portlet.p.?", Где это уникальный идентификатор портлета и имя атрибута.
Читая это, у меня сложилось впечатление, что с помощью 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>
Я вижу, что это там, просто предварительно с идентификатором портала, как это:
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 работать так, как я ожидал?
- Если нет, как я могу получить значение пространства имен, используемого для добавления к имени атрибута? Это не просто значение от
<portal:namespace>
Похоже, на нем также есть какая-то конкретная информация об ID экземпляра.
В случае, если это помогает выявить проблему, мы находимся на WebLogic 9.2 и Vignette 7.4.
1 ответ
После разговора с поставщиком, похоже, это известная ошибка в версии портала Vignette, на которой мы сейчас находимся. Ошибка заключается в том, что они неправильно строят карту переменных PortletSession, чтобы включить все переменные Session, а не только переменные PortletSession, что, в свою очередь, включает "javax.portlet.p.?". на передней части всех имен. В конечном итоге исправление будет заключаться в переходе на более новую версию, которую мы в настоящее время делаем в любом случае. В то же время я использую скриптлет (затворы, чтобы думать...), чтобы скопировать переменную прямо из PortletSession в pageContext следующим образом:
<portlet:defineObjects/>
<%
PortletSession sess = renderRequest.getPortletSession();
pageContext.setAttribute("message", sess.getAttribute("MESSAGE"));
%>
После чего я могу просто использовать JSTL/EL для возврата значения сообщения.