2

这个帖子不是问题,当我浏览 Liferay 论坛时,有人提出了关于使用 PortletURL 的疑问。

在某些情况下,我在 javscript 方法中看到了这个 PortletURL

function createRowURL() {
   var portletURL = new Liferay.PortletURL();
   portletURL.setParameter("rowNumber", "25" );
   return portletURL.toString();
}

在某些情况下,我在方法中看到这个 PortletURL doView,如图所示

获取 currentURL :

PortletURL url = PortletURLUtil.getCurrent(renderRequest, mimeResponse or renderResponse)

从 renderResponse 创建 PortletURL :

  1. 对于 RenderURL:

    PortletURL renderURL = renderResponse.createRenderURL(); 
    
  2. 对于 actionURL:

    PortletURL actionURL = renderResponse.createActionURL();
    

谁能告诉我在哪种情况下 PortletURL 会有用?

4

1 回答 1

9

Portlet 应用程序不同于普通的 Web 应用程序。Portlet 是称为门户的父页面内的迷你页面,多个门户成为一本书(Weblogic 术语)。在这种情况下,普通 URL 将不起作用。除了上面给出的原因,一个portlet 有一个不同状态的生命周期。您必须为 Portlet 容器提供一种方法来确定哪个 portlet 正在与它通信以及它处于什么状态 - 例如 portlet 的窗口状态 - 它是最小化、最大化还是正常。当然,PortletUrl 的另一个重要功能就是携带请求参数。如果您正在查看 PortletURL,您肯定会看到许多奇异的名称以及您提供的请求参数。

尽管 PortletURL 所需的大部分信息在许多情况下都很常见,但 PortletURL 的结构是依赖于实现的,并且它是由 Portlet 容器以一种或另一种方式生成的。距离我上次的生命射线体验已经有一段时间了。我从未在我的应用程序中使用过 liferay 特定的 javascript。我使用自己的 javascript/ajax 与门户容器进行通信。所以我只是猜测您提供的 javascript 方式也是 liferay 特定的,并且不能在不同的门户框架之间移植。

编辑:在@PrakashK 的评论之后添加了 PortletURL 的类型及其差异和用法。

有两种类型的 PortletURL:

  1. 动作 URL,它们触发一个动作请求,然后是一个渲染请求。
  2. 渲染 URL,它们触发渲染请求。

所以ActionURL 的目的是触发某种动作——比如按下按钮。动作请求将被 portlet 容器截获并发送到适当的动作请求处理程序,后者处理动作请求并设置渲染阶段使用的必要渲染参数。在 portlet 的生命周期中,呈现请求始终遵循操作请求。另一方面,正如其名称所暗示的,RenderURl 主要用于呈现portlet。

由于 RenderURL 的“呈现”性质,在 JSR168(Portlet 1.0)中,您不能直接通过 portlet 提供动态生成的资源。唯一的解决方法是使用额外的 servlet 来提供资源。这种方法的最大问题是 Servlet 无法参与 portlet 的生命周期。指向同一 Portlet Web 应用程序中资源的直接链接不能保证通过门户服务器,并且不会有可用的 Portlet 上下文。为了克服这个问题,在 JSR286(Portlet 2.0)中,引入了一种称为资源服务的特性和一种称为 ResourceURL 的新型 URL,以使 Portlet 能够动态地提供资源。ResourceURL 不是 PortletURL,尽管它们扩展了相同的 BaseURL。ResourceURL 和 ActionURL 最大的区别在于 ResourceURL 不会触发渲染请求。这使得对资源的 Ajax 请求成为可能。

有关 Portlet 2.0 的更多信息,请参阅[JSR286]

希望以上信息对您有用。

于 2012-04-16T23:39:05.997 回答