Java:从web内容portlet获取文章id

Java:从web内容portlet获取文章id,java,liferay,portlet,Java,Liferay,Portlet,我的网页上有两个portlet: 第一个是web内容portlet,它允许拾取并显示文章 另一个是我在Struts MVC上工作的portlet。 我想在第二个portlet中做的是获取用于在第一个portlet中显示web内容的文章id 可能吗 谢谢大家! 是的,通过在会话中设置数据,可以在两个不同的portlet之间共享数据。通过编辑第一个portlet的portlet代码来设置文章ID,在会话中设置它并在portlet中检索它 对于设置和获取portlet间通信示例->的值,您可以使用一些

我的网页上有两个portlet:

第一个是web内容portlet,它允许拾取并显示文章

另一个是我在Struts MVC上工作的portlet。 我想在第二个portlet中做的是获取用于在第一个portlet中显示web内容的文章id

可能吗


谢谢大家!

是的,通过在会话中设置数据,可以在两个不同的portlet之间共享数据。通过编辑第一个portlet的portlet代码来设置文章ID,在会话中设置它并在portlet中检索它


对于设置和获取portlet间通信示例->

的值,您可以使用一些特定于Liferay的API来完成,尽管这种方法并不完美,但它可以工作

您可以使用Liferay API获取页面上当前可用的portlet列表。然后,您可以通过portlet ID确定哪些portlet属于WebContentDisplay类型。然后,您可以读取他们的首选项,并显示他们显示的WebContent文章的ID

但请注意,在某些情况下,页面上可能有多个WebContent Display portlet,或者一个也没有。您可以读取每个呈现页面上的Portlet列表,也可以创建一个配置页面,在该页面上可以显示一个选择框,供站点管理员选择应从中获取值的WebContent display Portlet实例

让我向您展示第一个选项的代码,如果您需要第二个选项,我想您将根据给定的代码示例以及注释推断如何实现它:

import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.PortletConstants;
import com.liferay.portal.model.PortletPreferences;
import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portlet.PortletPreferencesFactoryUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

import java.io.IOException;
import java.util.List;

import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * Portlet implementation class WCDPrefReaderPortlet
 */
public class WCDPrefReaderPortlet extends MVCPortlet {

    public void doView(RenderRequest request, RenderResponse response)
            throws IOException, PortletException {
        // Obtain Liferay's ThemeDisplay object (typical operation in Liferay)
        ThemeDisplay themeDisplay = (ThemeDisplay) request
                .getAttribute(WebKeys.THEME_DISPLAY);

        // Get ID of current page
        long plid = themeDisplay.getPlid();
        try {
            // Obtain portlets on current page as list of
            // com.liferay.portal.model.PortletPreferences
            List<PortletPreferences> pagePortlets = PortletPreferencesLocalServiceUtil
                    .getPortletPreferencesByPlid(plid);
            for (PortletPreferences portlet : pagePortlets) {
                // Portlet ID
                String portletId = portlet.getPortletId();
                // WebContent Display portlet has ID 56. Also it's instanceable,
                // so we expect instance ID to be present, i.e.
                // 56_INSTANCE_NWWDuJPL64xa
                // 56_INSTANCE_N1m7pQGwcScG
                // would be IDs of WebContent Display portlet

                // PortletConstants.getRootPortletId(portletId) will return
                // portlet ID part without instance ID. I.e. we expect just "56"
                if ("56".equals(PortletConstants.getRootPortletId(portletId))) {
                    // If we would have portlet ID stored, we could load it's
                    // preferences using this code:
                    // PortletPreferencesLocalServiceUtil.getPortletPreferences(plid,
                    // portletId);
                    // Not needed for now, since we already have the
                    // corresponding
                    // com.liferay.portal.model.PortletPreferences object

                    // Here we get portlet preferences as XML -
                    // Liferay stores them that way
                    String prefsAsXml = portlet.getPreferences();

                    // Parsing XML and creating Portlet API PortletPreferences
                    // object
                    javax.portlet.PortletPreferences prefs = PortletPreferencesFactoryUtil
                            .fromDefaultXML(prefsAsXml);

                    // Read preference named "articleId" - WebContent Display
                    // Portlet uses this preference to store articleId
                    String articleId = prefs.getValue("articleId", null);

                    // Do something with the articleId value
                    System.out.println(articleId);
                }
            }
        } catch (SystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        super.doView(request, response);
    }

}

Web内容Portlet是Liferay内置的Portlet。。。我怎样才能编辑那个porlet?谢谢。请查看com.liferay.portlet.journalcontent.action.WebContent/ViewContentAction类。我认为您可以在类中获取文章ID,并从这里设置相同的ID。进行更改,然后再次在portal-impl.jar中添加已编辑的.class文件。获取liferay源代码,进行更改,然后将已编辑的.class文件添加回portal-impl.jar中。如果答案对解决我们的问题有帮助,请接受答案。这就是stackoverflow让我们留在这里的原因。你的回答给了我一些很好的启示。然而,它并没有真正为我的问题提供一个明确的解决方案。例如,我不能修改portal-impl.jar文件:出于不同的原因,我们是不允许的。我希望你能理解。