2012-03-08 83 views
1

如果一个portlet是一个web应用程序,那么为什么portlet首选项是从ServletRequest(在请求范围)获取的?如何在Liferay中正确使用portlet首选项?

http://docs.liferay.com/portal/6.1/javadocs/com/liferay/portal/util/PortalUtil.html#getPreferences(javax.servlet.http.HttpServletRequest

怎么可能采取的喜好,在应用范围对象?

更新1

我通过以下方式获得portlet首选项。这是对的吗?以下的prefs成员在应用程序范围内。

private synchronized void setupPreferences(HttpServletRequest request) { 
    // creating preferences 
    if(prefs == null) { 

     prefs = PortalUtil.getPreferences(request); 
     if(prefs != null) { 
      System.out.println("Preferences were taken from request"); 
     } 

     String portletResource = ParamUtil.getString(request, "portletResource"); 
     if (Validator.isNotNull(portletResource)) { 
      try { 
       System.out.println("Replacing preferences from 'portletRecource' parameter"); 
       prefs = PortletPreferencesFactoryUtil.getPortletSetup(request, portletResource); 
      } catch (SystemException e) { 
       e.printStackTrace(); 
      } catch (PortalException e) { 
       e.printStackTrace(); 
      } 
     } 

     if(prefs == null) { 
      System.out.println("Preferences were NOT obtained yet"); 
     } 
     else { 
      System.out.println("Preferences are OK"); 
     } 

    } 
} 

更新2

我用的也是servlet和我的应用程序的静态对象。正如人们所知,静态对象在应用程序范围内。我不知道我可以保持一些静态对象的portlet首选项对象,或者我需要每次从请求重新获取它?

其实我已经承认这一点,它的作品,但我想知道它是正确的?

回答

1

我猜你不是继承Liferay的MVCPortlet class?

反正是你传递到setupPreferences最初请求对象,你已经得到了HttpServletRequest的出的的PortletRequest对象?

如果是这样,您可以拨打PortletRequest.getPreferences();

+0

'request'对象既可以是'PortletRequest'也可以是普通的'HttpServletRequest'传递给普通的servlet。 – Dims 2012-03-09 11:44:36

6
com.liferay.portal.util.PortalUtil.getPreferences(HttpServletRequest) 

只是一种实用方法。

如果您在执行看一看,你会看到什么是对

​​

会在你处理,你可以/应该使用request.getPreferences()。 “请求”是PortletRequest,RenderRequest,ActionRequest,ResourceRequest的实现。

UPDATW:

如果您需要访问从servlet的特定的Portlet preferneces,你可以用

com.liferay.portlet.PortletPreferencesFactoryUtil.getPortletSetup(HttpServletRequest p_request, String p_portletId) 

尝试它是静态的方法,并返回PortletPreferences,所以知道你的portlet的ID,并具有请求对象你应该能够获得偏好。

+0

无论如何,在您的示例中,偏好也取自不同种类的请求。这是否意味着偏好是请求范围?在我的应用程序中,我不仅需要从Portlet呈现中访问首选项,还需要从其他位置访问首选项。 – Dims 2012-03-09 10:28:35

+0

是的,portlet首选项存储在portlet请求中。您可以在渲染,操作,资源处理程序或任何其他传递请求的方法中访问它们。你的意思是什么“其他地方”,请用这个更新问题。 – 2012-03-09 10:56:19

+0

问题是为什么他们存储在请求中,如果他们是应用程序范围? “其他地方”是servlet和静态对象,我已经更新了这个问题。 – Dims 2012-03-09 11:42:53