Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Liferay MVCPortlet上非独立的并行portlet实例_Ajax_Jsp_Liferay_Portlet - Fatal编程技术网

Ajax Liferay MVCPortlet上非独立的并行portlet实例

Ajax Liferay MVCPortlet上非独立的并行portlet实例,ajax,jsp,liferay,portlet,Ajax,Jsp,Liferay,Portlet,我试图在Liferay 6.1.1上使用基于MVCPortlet的portlet,但它的行为与我预期的不同。我的portlet应该是独立的,但不是 我的需要: 我有一个带有表单的第一个portlet 我有几个基于MVCPortlet的portlet B实例 提交表单时,portlet A启动一个事件,所有portlet B都接收该事件。当portlet B接收到事件时,它必须构建一个URL,连接到该URL并从中读取数据,然后显示结果 My B portlet基于MVCPortlet,是可实例

我试图在Liferay 6.1.1上使用基于MVCPortlet的portlet,但它的行为与我预期的不同。我的portlet应该是独立的,但不是

我的需要:

  • 我有一个带有表单的第一个portlet
  • 我有几个基于MVCPortlet的portlet B实例
提交表单时,portlet A启动一个事件,所有portlet B都接收该事件。当portlet B接收到事件时,它必须构建一个URL,连接到该URL并从中读取数据,然后显示结果

My B portlet基于MVCPortlet,是可实例化的、ajaxable的,呈现权重为0,用于并行处理和显示portlet B的所有实例

但它并不奏效:

1) 我无法在事件处理中处理URL,因为所有事件接收(portlet B的每个实例一个)都在同一个线程中处理。因此,在这个事件中,我只设置了一个renderRequest参数,因此jsp页面会自动使用ActionURL调用portlet中的操作处理

此操作构建URL,使用它,处理数据,并重定向到结果显示页面(response.setRenderParameter(“jspPage”,“html/display/results.jsp”))

2) 我原本希望每个portlet彼此独立,但事实并非如此。只有一个由所有portlet共享的MVCPortlet实例让我大吃一惊。portlet会话也由我的所有portlet实例共享。action方法由不同的线程执行,这很好,但是Portlet的呈现可能会被其他Portlet的actions处理阻塞。一个portlet可以引发整个页面的刷新。所有我想通过使用instanceable、ajaxable和渲染权重0避免的事情

我想知道是否有什么问题,是否只有一个类实例扩展MVCPortlet是正常的,等等,或者是否有一种实现所需行为的最佳方法。

1)我不完全确定您在这里做什么:事件处理在并行性方面很难定义,因此,在同一线程中顺序处理所有事件是正常的行为。然而,我不明白你描述的ActionURL部分是什么意思。您可以在eventhandler中更改portlet的状态,但不能在呈现阶段更改。通常,每个请求只处理一个操作、多个(根据需要)事件,然后呈现所有portlet。您是否暗示这之后每个B-portlet都会执行一个操作?这是出乎意料的,我建议您要么在事件处理程序中进行处理,要么触发它在后面异步运行,同时继续进行事件处理(特别是在需要时间的情况下)

2) portlet彼此独立,但是,并非每个portlet都映射到单个Java对象。事实上,该实现与servlet世界中的实现类似:只有一个对象不应该具有任何状态。portlet(或servlet)中几乎所有成员变量的实例都是误解API的迹象:portlet的整个状态都是通过各种PortletRequest和PortletResponse对象进入的,portlet成员变量中不应保留任何内容


基于您异步呈现所有B Portlet的意图,我假设呈现可能需要一段时间——事件处理应该尽快继续。否则,如果整个结果已经存在,则异步渲染没有意义。

1)由于处理可能很长,而且我希望异步完成,因此我无法在事件处理中执行。因此,我尝试为每个portlet执行一个操作。这就是为什么每个portlet显示一个启动操作的jsp页面(基于ActionURL的表单验证)。有没有其他方法可以异步处理?我不太熟悉portlet和MVCPortlet框架(2),但每个portlet都应该有自己的会话。在这种情况下,它们都共享同一个PortletSession,这让我感到惊讶。无论如何,这对我来说不是问题,我也不把数据放在MVCPortlet中。更重要的是,portlet呈现似乎会重新加载整个页面,而instanceable/ajaxable/render weight=0应该可以避免这一点。。。大部分处理都是在动作处理中完成的,这是很长的一部分。我将数据放在会话中,然后在jsp中获取数据并显示它。您可以在eventhandler中触发异步处理—只需将其定位在业务层,而不是UI层(portlet)。请记住,Portlet是UI技术,它下面应该有一个适当的业务层。然后只需保留一个指向异步进程的指针(例如作为渲染参数),并在渲染阶段拾取结果。它的渲染可以是异步的。为了使操作处理是异步的,您需要生成适当的HTML代码并自己实际执行一些操作——否则您将处于默认的操作全页面重新加载状态。在我看来,jsp应该处理表示层,而“servlet”,这里是MVCPortlet,用来处理业务部分。若我在eventhandler中启动异步处理,如何在数据准备就绪时刷新显示?当portlet被刷新时,我可能仍然有刷新整个页面的问题。。。当我尝试使用JSF portlet时,从这个角度来看,它工作得非常好,每个实例都是独立的。您可以这样说,但您也可以将整个portlet层看作是应用程序的视图层。毕竟,Portlet通常集成了很多不同的后端技术。仅仅因为您使用portlet,您就不希望业务代码中到处都是“import javax.portlet.*”,对吗?