2012-03-08 84 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