2014-04-08 7 views
2

JSR 286 포틀릿 (포틀릿 스펙 2.0)을 작성 중입니다.을 통해 Java 코드에서 설정하고있는 JSP에서 설정하려고하는 일부 값이 있습니다. 그러나 포틀릿 이름 공간 이름을 사용하지 않고 JSP의 PortletSession에서 특성을 다시 가져올 수없는 것처럼 보입니다.JSR 286 포틀릿에서 portletSessionScope 특성 얻기

JSR 286 및 PortletSession의 나의 이해는 이것이다 : 각 포틀릿은 웹 컨테이너에서의 HttpSession의 하위 섹션 그 자체 "포틀릿 세션"을 받게됩니다

  • 속성 "포틀릿 세션"에 추가 된 것은 해당 포틀릿에서만 볼 수 있습니다.
  • 분리는 "javax.portlet.p?"형식으로 특성에 네임 스페이스를 추가하여 수행됩니다. 포틀릿이며 속성의 이름입니다. 나는 JSP에서 portletSessionScope 객체를 사용하는 것은 나를 다시 밖으로 비슷한에 당신이 일반에 그것을 어떻게 값을 얻을 수 있도록 나에게 속성에 드 참조 액세스 권한을 부여 할 것이라는 인상이 글을 읽는에서

했다 -ol JSP 코드 및 HttpSession. 그러나, 그것은 사실이 아닌 것처럼 보입니다.

는 다음과 같은 자바 코드를 가지고 :

<%@ 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> 태그에 인쇄 아무것도 얻을 :

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 코드에서 잘 작동하는 다음과 같은 기대. 나는 또한 시도 :

  • ${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 메시지

나는 그것을 가지고가는 경우에 그것은 지난 다음에? <%=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 및 비 네트 7.4에 있습니다.

+0

PortletSession.APPLICATION_SCOPE 또는 $ { MESSAGE} 중 하나를 시도해보십시오. – Gautam

+0

따라갈 수 있을지 잘 모르겠습니까? 다음과 같이하면된다 :'<% = portletSession.getAttribute ("MESSAGE", PortletSession.APPLICATION_SCOPE) %>'? 별도의 포틀릿 세션을 갖는 목적을 상쇄하지 않습니까? ''를 사용할 때, 값은 속성 이름에 사용 된 것과 같지 않습니다. 그것의 일부로 포함되어 있지만 전체 문자열 접두사의 1/3 정도를 차지합니다. 가치가있는 부분에 대해서는 이러한 제안을 시도했지만 효과가 없었습니다. – CodeChimp

답변

1

공급 업체와상의 한 후 Vignette 포털 버전에 알려진 버그가있는 것으로 보입니다. 버그는 PortletSession 변수의 맵을 부적절하게 작성하여 PortletSession 변수 대신 모든 Session 변수를 포함하고 "javax.portlet.p.?" 모든 이름 앞에. 수정 프로그램은 궁극적으로 현재 진행중인 새로운 버전으로 이전하는 것입니다.

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

후 나는 단순히를 얻기 위해 JSTL/EL을 사용할 수 있어요 : 한편, 나는 (... 생각하는 셔터)과 같이 pageContext에로 PortletSession에서 바로 변수를 복사 스크립틀릿을 사용하고 있습니다 메시지 값을 취소합니다.