JSR-286中有一个接口叫 PortletSessionUtil ,一度迷惑了我

 

  1. public class PortletSessionUtil 
  2.   private static final String PORTLET_SCOPE_NAMESPACE = "javax.portlet.p."
  3.  
  4.   public static String decodeAttributeName(String name) 
  5.   { 
  6.     if (name.startsWith("javax.portlet.p.")) { 
  7.       int index = name.indexOf('?'); 
  8.       if (index > -1) { 
  9.         name = name.substring(index + 1); 
  10.       } 
  11.     } 
  12.     return name; 
  13.   } 
  14.  
  15.   public static int decodeScope(String name) 
  16.   { 
  17.     int scope = 1
  18.     if (name.startsWith("javax.portlet.p.")) { 
  19.       int index = name.indexOf('?'); 
  20.       if (index > -1) { 
  21.         scope = 2
  22.       } 
  23.     } 
  24.     return scope; 
  25.   } 

其实,这个接口是解决如下获取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就可以正确的拿到属性值了。方法是:

 

  1. String attributeName = {encode后的如同javax.portlet.p.<window_id>?<attribute_name>形式的属性名}; 
  2. String decodedName = 
  3. PortletSessionUtil.decodeAttributeName(attributeName); 
  4. if(decodedName.equals("某原始属性名"
  5. && PortletSessionUtil.decodeScope(attributeName) 
  6. == PortletSession.PORTLET_SCOPE) { 
  7. myAttrValue = session.getAttribute(attributeName);