JSF按钮动作触发两次

时间:2015-02-02 07:49:10

标签: jsf primefaces wildfly

我已经在WildFly论坛上提出了这个问题,但到目前为止还没有得到任何答案。所以我在这里尝试。

自从我从WildFly 8.1升级到8.2后,我在连接到bean的tabView中遇到了commandButton问题。

这是一个简单的JSF页面:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui">
    <h:head></h:head>
    <h:body>
        <h:form>
            <p:tabView binding="#{testBean.tabView}">
                <p:tab title="Tab">
                    <p:commandButton value="Inside" action="#{testBean.testInside}"/>
                </p:tab>
            </p:tabView>
            <p:commandButton value="Outside" action="#{testBean.testOutside}"/>
        </h:form>
    </h:body>
</html>

和bean:

@Named
@SessionScoped
public class TestBean implements Serializable {
    private TabView tabView = new TabView();

    public TabView getTabView() {
        return tabView;
    }

    public void setTabView(TabView tabView) {
        this.tabView = tabView;
    }

    public void testInside() {
        System.out.println("inside");
    }

    public void testOutside() {
        System.out.println("outside");
    }
}

点击“内部”按钮会触发testInside() 两次次。 “外部”按钮(tabView外部)表现正常,只触发一次方法。删除tabView绑定可以消除此问题。我正在使用PrimeFaces 4.0。

感谢您的任何想法

2 个答案:

答案 0 :(得分:7)

这是Mojarra 'issue',由2.2.7中的性能优化修复程序引入。

  

这是一个Mojarra“问题”,我在使用RF-13920时发现它,它是由JAVASERVERFACES-3193引入的。在对服务器的请求期间不会重新创建使用绑定的组件,但是它们的子节点是。原始子项仍在原位插入新子项会导致“重复ID”错误。

所以看起来你的按钮被添加了两次,但由于你没有分配一个明确的id,你没有得到重复的id错误...可能会尝试一下(添加一个显式的id)< / p>

  

JSF规范规定绑定只应在Request范围内使用,因此如果在Conversation范围内失败,我认为不应将其视为错误。

最后一句话是有趣的。正如jboss网站上的下一篇文章所述:

  

但是现在我认为我对这个问题有一个令人满意的解决方案我可以确认,对于组件绑定的请求范围的后台bean,异常和重复id问题不再发生,即使使用Wildfly的Mojarra 2.2.8也是如此-8.2.0.Final!

     

如果页面的其余逻辑仍然存在于(例如)会话范围内的bean中,则情况甚至如此。您只需要为绑定属性设置一个请求范围的bean,然后可以在EL和其他bean中引用它。

同时检查this post

答案 1 :(得分:-3)

您可以尝试其他方式。使用与命令键相同的操作,使用选项卡中的remoteCommand。
然后在commandButton的onclick事件中使用remoteCommand创建的JavaScript函数。
以下是使用您的代码的示例。
它功能齐全。

<h:form>
    <p:remoteCommand id="myfun" name="myfun" action="#{testBean.testInside}" />
    <p:tabView binding="#{testBean.tabView}">
        <p:tab title="Tab">
            <p:commandButton value="Inside" onclick="myfun();"/>
        </p:tab>
    </p:tabView>
</h:form>