Gatein 3.4.0最终Jboss 5.1.0 portlet状态和JSR186交互,从一个portlet转到另一个portlet时无法显示多个portlet

时间:2017-04-05 09:12:34

标签: jboss richfaces ipc gatein

我对我们现在遇到的问题有疑问。只要我在互联网上搜索,我就没有找到任何有用的信息。

所以这就是问题。

在我们的系统中,我们正在大量使用portlet,其中有100个是100个。在某些情况下,我们希望将不同的portlet显示在一起,因为某些portlet需要IPC(内部portlet通信将参数传递给其他portlet),以便用户可以轻松转到下一个portlet而无需重新编写所需的参数,并以原则方式调用webservices以获取信息/做其工作等......

在使用Jboss 5.1.0迁移到gatein-3.4 final时,这种旧样式被破坏了。目前gatein(eXo gatein)确实允许我们有一个页面,其中包含所有可见的portlet,但我想要的是让它们不可见(也称为最小化或最大化状态)最大化状态意味着可见,否则不可见。在JSR186中,我们有窗口状态,窗口对象和portlet上下文,它们允许我们拥有每个portlet NODE,而所有其他节点(节点是一个portlet,来自portal-api-lib jar中的PortletNode.class(我们没有这个)现在))

所以我们不再拥有这种结构,我们一次只能显示一个portlet。

我想知道你们是否知道更好的解决方案,想法或建议,你可以让我通过这个问题。

感谢。

编辑:

到目前为止,我发现使用javascript:GateIn扩展的AjaxGet和Richfaces会破坏功能。当我使用ajax调用时,例如以下链接:

 javascript:ajaxGet('/ProvPortal/classic/UserPortlet?portal:componentId=99b3433a-585c-471e-928b-d8e4b17fcf02&objectId=minimized&portal:action=ChangeWindowState&ajaxRequest=true')

允许我使用其他portlet。又名其他portlet再次成功。同样在Richfaces.panelTabs对象中,填充剩余的portlet信息,以便我们可以访问portlet。我不知道ajaxget和Richfaces会出现问题吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

对于那些使用Jboss版本5.1.0和GateIn版本3.4 GA的人。

让我解释一下portlet开发的一些亮点。首先,portlet是一个独立的应用程序,或者我们可以说它是wiki中提到的Web组件。可以使用jsp / jsf构建,可以打包为战争。

但是,GateIn允许我们一次在页面上显示一个portlet,但不是两个或更多,或者我们不知道该怎么做?

为了实现这一目标,我们必须在GateIn自己的代码中做一些变通办法和一些改进。您可以检查xml文件中是否需要()部分及其用途。当您从导航部分或菜单打开该portlet时,此标记允许加载“portlet”。

但是,如上所述,这个标签不允许加载另一个portlet。它只是删除旧的并放入新的。因此,如果我想在那时看到两个以上的portlet,或者我想将一个参数传递给该portlet并看到更改,甚至没有关闭前一个不可能的那个。

有两种解决方案,

1-在GateIn的代码中,您可以创建多个页面(或者可以在xmls中配置它),这个页面可以有多个标签,但是您需要知道只有一个页面正文将起作用,如果页面包含另一个页面正文标记,我们必须禁用其他页面正文标记。

页面正文标记可以从GateIn的代码中作为列表访问,因此在此列表中,如果要打开父portlet下的另一个portlet,则意味着必须启用该父portlet页面正文标记。每当您导航到另一个被视为父portlet的portlet时,先前的portlet将从上下文中删除,这个新的父portlet将被加载到具有默认页面body标记的上下文中。

示例:假设我们有2个父portlet    -用户    -Domain

并且假设我们有另外两个portlet需要在页面中作为第二个portlet打开而不关闭User或Domain portlet。

-a page contains page body{
    user portlet with disabled page body tag{

       open sub-portlet-a with data X, (a button or a link)
       open sub-portlet-b with data Y  (a button or a link)

    }
}

每当您在用户portlet中执行操作以打开带有“PASSED DATA”的子portlet到第二个子portlet时,我们就会在第二个portlet的gatein代码中启用用户portlet page-body标记,并使用“ PASSED-DATA“,将被打开。

Switch to Domain portlet-> user portlet will be gone,同样的步骤也将应用于Domain portlet。请注意,只有在xml文件中设置了具有相同子portlet的域和用户portlet时,这才适用。

<!--portlet definitions-->
    <user>
     <!--some user specific information goes here-->
     <a></a> (optional)
     <b></b> (optional)
    </user>


<domain>
 <!--some Domain specific information goes here-->
 <a></a> (optional)
 <b></b> (optional)
</domain>

正如我们已经提到的,有两种方法可以在页面中打开第二个portlet。

这是第二个。

2-此问题的第二个解决方案与gatein的代码无关,或者您不必触摸该区域。

使用GateIn portlet定义附带的groovy模板。 .gtmpl个模板文件。此文件可以访问其原始发件人。我的意思是,某些容器已经可以使用这些.gtmpl模板文件访问。

例如,您可以使用此模板文件中的UITableColumnContainer.gtmpl文件和UIContainer对象。该对象将为您提供基于portlet的上下文。这意味着您可以在此文件中获取其他portlet。

所以从现在开始,我认为我们可以抓住groovy模板文件中的其他portlet。

在这种情况下,如果我想在我点击一个按钮后打开一个portlet,或者在我的Portal结构中打开第二个portlet,我可以渲染它。

其他portlet呈现为默认值(设置为false)从现在开始,w可以从任何URL或其他类型的您自己的实现获取有关我们要打开的portlet的信息,然后<我们可以将该Portlet设置为True

这是我们迄今为止找到的解决方案。

并且就我们实施而言,它们都工作得很好。

如果这会以某种方式帮助你或者说有用,那意味着我们取得了一些进展。

由于

相关问题