为什么 当侦听器在包含的页面中使用时,会多次调用它 在另一页

问题描述 投票:1回答:1

我有一个奇怪的问题,将<p:ajax .../>放在一个页面中,该页面使用ui:include包含在另一个页面中。问题是在这种情况下,listener<p:ajax listener="someMethod"/>被召唤超过一次!

例如,我创建了一个复合组件来渲染list-of-value组件。它如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml"
      xmlns:p="http://primefaces.org/ui"
      xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface componentType="LovComponent">
    <composite:attribute name="actionListener" method-signature="void openModalDialog(java.lang.String)"/>
    <composite:attribute name="selectEventListener" method-signature="void selectAction(org.primefaces.event.SelectEvent)"/>
    <composite:attribute name="id"/>
    <composite:attribute name="update"/>
    <composite:attribute name="value"/>
    <composite:attribute name="style"/>
</composite:interface>
<composite:implementation>
        <p:inputText id="#{cc.attrs.id}" value="#{cc.attrs.value}" style="#{cc.attrs.style}"/>
        <p:commandButton immediate="true" process="@this"  icon="ui-icon-search" actionListener="#{cc.attrs.actionListener}">
            <p:ajax event="dialogReturn" listener="#{cc.selectEventListener}" update="#{cc.attrs.update}"/>
        </p:commandButton>
</composite:implementation>
</html>

它的工作没有任何错误,并呈现如下:

enter image description here

当用户点击按钮时,它将在模态对话框中显示值列表。之后,当用户选择其中一个值时(他/她应该点击那个愚蠢的刷新按钮!)

enter image description here

然后关闭对话框并在辅助bean中调用select侦听器以在正确的bean(数据持有者bean)中设置值。

<p:cellEditor>
      <f:facet name="output">
            <p:outputLabel id="casProfileAllowedCurrInfoGbiCurrencyCodeOut" value="#{casProfileAllowedCurrInfo.gbiCurrency.code}"/>
      </f:facet>
      <f:facet name="input">
            <g:Lov id="casProfileAllowedCurrInfoGbiCurrencyCodeIn" selectEventListener="#{accountProfileController.allowedCurrenciesPageFragmentCasProfileAllowedCurrInfoSelectAction}"
                                value="#{casProfileAllowedCurrInfo.gbiCurrency.code}"
                                update=":profileDetailform:allowedCurrenciesCasProfileAllowedCurrInfoDataTable"
                                actionListener="#{accountProfileController.openModalDialog('CurrencyLov')}"
                                style="width:98%"/>
      </f:facet>
</p:cellEditor>

对话框中的选择按钮(带有刷新图标的按钮!)的代码:

<p:column headerText="#{label.SELECT}">
     <p:commandButton icon="ui-icon-refresh" actionListener="#{currencyLovController.closeDialog(gbiCurrency)}" />
</p:column>

当此组合用于独立页面时,selectEventListener(LOV组合的自定义属性)的方法在完成用户选择后被调用一次。 (这是理想的行为)

现在我的问题是:

当我在使用ui:include的另一个页面中包含的页面中使用它时,监听器被调用两次!而坏消息是第二次选择的价值是null!我无法在包含的页面中找到使用它之间的关系,但是,我确定它有一个连接,因为当我将它包含在一个包含两级的页面时,它被调用三次,所选值为null in第二次和第三次。

任何帮助,将不胜感激。

[更新]

我将我的子系统打包为weblogic shared-library,我有一个MainWeb应用程序,它被部署为weblogic中的应用程序。

我使用Weblogic 12cJSF2.2 apache my-faces 2.2.7primefaces 5.1

jsf primefaces jsf-2.2 weblogic12c
1个回答
0
投票

最后我发现了问题!这不是因为在彼此内部包括composites。通过在Weblogic部署的方式正在提高问题。听起来有点奇怪,但当我停止使用Weblogic Shared-Library部署时问题就消失了。

我曾设法将每个子系统部署为共享库,并将用于一般用途的主项目(用户身份验证,安全性,菜单,页面模板,导航等)部署为依赖于共享的Web应用程序-libraries(打包的模块化部署)。

当出现上述问题时,我开始从共享库中删除config-files(faces-config.xml,web.xml),但没有什么能解决问题。

最后,我改变了部署方式,暂时停止了共享库部署。当我将整个应用程序打包为一个部署时,问题就消失了!

我无法找出导致问题的原因,但现在至少它正在发挥作用!

希望它对其他人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.