私は JSR 286 ポートレット (ポートレット仕様 2.0) に取り組んでいます。JSP で設定しようとしている値がいくつかあります。これは、Java コードでsession.setAttribute()
. PortletSession
ただし、ポートレットの名前空間名を使用しないと、JSPから属性を取得できないようです。
JSR 286 についての私の理解PortletSession
は次のとおりです。
- 各ポートレットには、Web コンテナーの 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>
次のように、ポータル ID が前に追加されているだけです。
メッセージ
私がそれを取り、それを次のように過去にすると:
<%=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 を使用しています。