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

时间:2012-03-08 19:26:32

标签: java liferay preferences portlet 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");
        }

    }
}

更新2

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

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

2 个答案:

答案 0 :(得分:6)

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

只是一种实用方法。

如果你看看实施情况,你会看到发生了什么

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;
}

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

UPDATW:

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

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

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

答案 1 :(得分:1)

我猜你不是Liferay的 MVCPortlet 类的子类?

无论如何,你传递给setupPreferences的请求对象最初是一个 PortletRequest 对象,你已经得到了 HttpServletRequest 了?

如果是这样,您只需拨打 PortletRequest.getPreferences();