如何在Liferay中正确获取portlet首选项?

Dim*_*ims 1 java portlet preferences liferay liferay-6

如果portlet是一个Web应用程序,那么为什么从ServletRequest获取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");
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

更新2

我在我的应用程序中也使用servlet和静态对象.人们可以知道静态对象在应用范围内.我想知道我可以将portlet首选项对象保留在某个静态对象中,还是每次都需要从请求中重新获取它?

实际上我已经假设这个并且它有效,但我想知道它是否正确?

Mar*_*lin 6

com.liferay.portal.util.PortalUtil.getPreferences(HttpServletRequest) 
Run Code Online (Sandbox Code Playgroud)

只是一种实用方法.

如果你看看实现,你会看到发生了什么

public PortletPreferences getPreferences(HttpServletRequest request) {
    RenderRequest renderRequest = (RenderRequest)request.getAttribute(
        JavaConstants.JAVAX_PORTLET_REQUEST);

    PortletPreferences preferences = null;

    if (renderRequest != null) {
        PortletPreferencesWrapper preferencesWrapper =
            (PortletPreferencesWrapper)renderRequest.getPreferences();

        preferences = preferencesWrapper.getPreferencesImpl();
    }

    return preferences;
}
Run Code Online (Sandbox Code Playgroud)

在您的处理程序中,您可以/应该使用request.getPreferences()."request"是PortletRequest,RenderRequest,ActionRequest,ResourceRequest的实现.

UPDATW:

如果您需要从servlet访问特定的portlet首选项,您可以尝试使用

com.liferay.portlet.PortletPreferencesFactoryUtil.getPortletSetup(HttpServletRequest p_request, String p_portletId)
Run Code Online (Sandbox Code Playgroud)

它是静态方法,并返回PortletPreferences,因此知道您的portlet的id并具有请求对象,您应该能够获得首选项.