Получение атрибутов 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"]}

Тогда это работает просто отлично.

Итак, вопросы:

  1. Почему простая форма с использованием JSTL и EL не работает?
  2. Можно ли заставить JSTL/EL работать так, как я ожидал?
  3. Если нет, как я могу получить значение пространства имен, используемого для добавления к имени атрибута? Это не просто значение от <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 для возврата значения сообщения.

Другие вопросы по тегам