在Liferay中,如果能用好PortletPreferences那么会非常强大:

 

简介:

PortletPreferences是和当前用户相关的一组信息的结合,我们可以让一个已登陆用户在一个Portlet的不同页面,不同阶段通过这个PortletPreferences来共享数据,而无需担心其他用户去窃取这些数据。利用这个共享数据的好处是它不需要特定的实体存储,比如数据库,文件。

PortletPreferences分为2种,一种是静态的,一种是动态的.

 

静态的PortletPreference就是写在portlet.xml文件中的,如下:

   
   
   
   
  1. <portlet-preferences>  
  2.  <preference> 
  3.       <name>departmentname> 
  4.       <value>liferayvalue> 
  5.    preference> 
  6.  
  7.     <preference>        
  8. <name>companyname> 
  9.       <value>cignexvalue> 
  10.    preference> 
  11. portlet-preferences> 

我们在页面或者java代码中,可以用如下的代码来获取:

   
   
   
   
  1. PortletPreferences preferences = renderRequest.getPreferences(); 
  2. String department = preferences.getValue("departmentt"""); 

 

动态PortletPreferences就强大太多了,举一个简单的需求,比如我们要在Portlet的configure模式吧一些参数设置进去,比如REST请求url,还有一些头参数等,然后我们要在view模式吧这些信息读取出来。

那么,我们可以这样做:

首先,自定义一个Helper类,比如叫PortletHelper,它定义一个静态方法叫getPortletPreference():

   
   
   
   

  1.          public static PortletPreferences getPortletPreferences(ActionRequest actionRequest) throws PortalException, SystemException{ 
  2.         PortletPreferences preferences = actionRequest.getPreferences(); 
  3.         String portletResource = ParamUtil.getString(actionRequest, "portletResource"); 
  4.         if (Validator.isNotNull(portletResource)) { 
  5.          preferences = PortletPreferencesFactoryUtil.getPortletSetup(actionRequest, portletResource); 
  6.         } 
  7.         return preferences; 
  8.          } 

 

然后我们在config模式中新建一个PortletPreferences对象,然后把必要的内容填充进去:

   
   
   
   
  1. public void processAction(PortletConfig portletConfig, 
  2.  
  3.                                    ActionRequest actionRequest, ActionResponse actionResponse) 
  4.  
  5.                                    throws Exception { 
  6.  
  7.                 if(LOGGER.isDebugEnabled()){ 
  8.  
  9.                   LOGGER.debug("ConfigurationAction : processAction()"); 
  10.  
  11.              } 
  12.  
  13.        PortletPreferences preferences = PortletHelper.getPortletPreferences(actionRequest); 
  14.  
  15.       
  16.  
  17.      try
  18.  
  19.           FileOperationHelper.uploadFileToDest(actionRequest); 
  20.  
  21.           preferences.setValue(RS_LAUNCH_PORTLET_PREFERENCE_HTML_URL, ConfigurationActionHelper.getHtmlUrl(actionRequest)); 
  22.  
  23.           preferences.setValue(RS_LAUNCH_PORTLET_PREFERENCE_REST_WS_URL, ConfigurationActionHelper.getRestUrl(actionRequest)); 
  24.  
  25.           preferences.setValue(RS_LAUNCH_PORTLET_PREFERENCE_REST_WS_TYPE, ConfigurationActionHelper.getRestType(actionRequest)); 
  26.  
  27.           preferences.setValue(SERVICE_VERSION, ConfigurationActionHelper.getRestVersion(actionRequest)); 
  28.  
  29.           preferences.setValue(SERVICE_ENV, ConfigurationActionHelper.getRestEnv(actionRequest)); 
  30.  
  31.          preferences.setValue(CONSUMER_AUTH_TOKEN, ConfigurationActionHelper.getRestToken(actionRequest)); 
  32.  
  33.           preferences.setValue(CONSUMER_ID, ConfigurationActionHelper.getRestConId(actionRequest)); 
  34.  
  35.           preferences.store(); 
  36. .. 

 

最后我们在view模式中使用存储在PortletPreferences中的内容:

   
   
   
   
  1. @RenderMode(name = RS_LAUNCH_PORTLET_RENDER_MODE_VIEW) 
  2.          public void view(RenderRequest renderRequest, RenderResponse renderResponse) 
  3.                           throws PortletException, IOException, PortalException, 
  4.                           SystemException { 
  5.                  String jsp = null
  6.   
  7.                  if (LOGGER.isDebugEnabled()) { 
  8.                           LOGGER.debug("RSLaunchPortlet : view()"); 
  9.                  } 
  10.                  PortletHelper.createActionUrls(renderRequest, renderResponse); 
  11.   
  12.                  String portletInstanceId = (String) renderRequest 
  13.                                    .getAttribute(RS_LAUNCH_PORTLET_RENDER_REQUEST_ATTRIBUTE_PORTLET_ID); 
  14.   
  15.                  PortletPreferences preferences = renderRequest.getPreferences(); 
  16.                  String html_url = preferences.getValue( 
  17.                                    RS_LAUNCH_PORTLET_PREFERENCE_HTML_URL, StringPool.DOUBLE_QUOTE); 
  18.                  String rest_url = preferences.getValue( 
  19.                                    RS_LAUNCH_PORTLET_PREFERENCE_REST_WS_URL, 
  20.                                    StringPool.DOUBLE_QUOTE );
  1. ..
  2.   

 

这就达到了在与某个用户指定的Portlet之内共享部分数据的功能,还是很简单的。