这个线程不是问题,当我通过Liferay论坛讨论使用PortletURL时,这是一个疑问。

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

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


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

要获取currentURL:



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


从renderResponse创建PortletURL:


对于RenderURL:

PortletURL renderURL = renderResponse.createRenderURL();

对于actionURL:

PortletURL actionURL = renderResponse.createActionURL();



有人可以告诉我在哪种情况下PortletURL有用吗?

最佳答案

Portlet应用程序不同于普通的Web应用程序。 Portlet是父页面(称为门户)中的微型页面,多个门户成为一本书(Weblogic术语)。普通网址在这种情况下将不起作用。除了上面给出的原因外,Portlet的生命周期也不同。您必须为Portlet容器提供一种确定与之通信的Portlet以及它处于何种状态(例如Portlet的窗口状态)的方法,以使其最小化,最大化或正常。当然,PortletUrl的另一个重要功能是携带请求参数。如果您正在查看PortletURL,那么您一定会看到很多外来名称以及您为其提供的请求参数。

尽管PortletURL所需的大多数信息在许多情况下是常见的,但PortletURL的结构是与实现相关的,并且由Portlet容器以一种或另一种方式生成。自从我上次Liferay经历以来,已经有一段时间了。我从未在应用程序中使用过liferay专用的javascript。我使用了自己的javascript / ajax与门户容器进行通信。因此,我只是猜测您介绍的javascript方式也是liferay特有的,并且不能在不同的门户框架之间移植。

编辑:根据@PrakashK的评论,添加了PortletURL的类型及其区别和用法。

有两种类型的PortletURL:


动作网址,它们会触发一个动作请求,然后触发一个渲染请求。
渲染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能够动态地为资源提供服务。尽管资源URL扩展了相同的基本URL,但它不是PortletURL。 ResourceURL和ActionURL之间的最大区别是ResourceURL不会触发呈现请求。这使得对资源的Ajax请求成为可能。

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

希望以上信息对您有用。

10-07 23:47