JSR-286中有一个接口叫 PortletSessionUtil ,一度迷惑了我
- public class PortletSessionUtil
- {
- private static final String PORTLET_SCOPE_NAMESPACE = "javax.portlet.p.";
- public static String decodeAttributeName(String name)
- {
- if (name.startsWith("javax.portlet.p.")) {
- int index = name.indexOf('?');
- if (index > -1) {
- name = name.substring(index + 1);
- }
- }
- return name;
- }
- public static int decodeScope(String name)
- {
- int scope = 1;
- if (name.startsWith("javax.portlet.p.")) {
- int index = name.indexOf('?');
- if (index > -1) {
- scope = 2;
- }
- }
- return scope;
- }
- }
其实,这个接口是解决如下获取PortletSession 不同scope上的属性的一个辅助方法:
众所周知,在PortletSession上存储的属性有两种scope,一种是APPLICATION_SCOPE,另外一种是PORTLET_SCOPE,而如果某Servlet或者JSP页面通过HttpSession 访问PortletSession上存储的属性的时候,就会有如下的情况发生:
(1)如果属性是存在PortletSession的 APPLICATION_SCOPE上的,那么非常简单,直接httpSession.getAttribute("这个属性名") 就可以拿到。
(2)如果属性是存在PortletSession的PORTLET_SCOPE上的,那么这个属性将会以encode的形式存在 ,javax.portlet.p.<window_id>?<attribute_name>,因为一个页面上会有多个portlet,所以这里的window_id 用于表示第几个portlet窗口。这时候,如果直接用httpSession.getAttribute("encode后的属性名”),就会取不到,那么怎么办呢?这时候就需要PortletSessionUtil出场了,他可以负责把真正的属性名<attribute_name>从javax.portlet.p.<window_id>?<attribute_name>中“剥离”出来,从而httpSession就可以正确的拿到属性值了。方法是:
- String attributeName = {encode后的如同javax.portlet.p.<window_id>?<attribute_name>形式的属性名};
- String decodedName =
- PortletSessionUtil.decodeAttributeName(attributeName);
- if(decodedName.equals("某原始属性名")
- && PortletSessionUtil.decodeScope(attributeName)
- == PortletSession.PORTLET_SCOPE) {
- myAttrValue = session.getAttribute(attributeName);
本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/843946,如需转载请自行联系原作者