JSF 按钮操作触发了两次



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

自从我从 WildFly 8.1 升级到 8.2 以来,我在连接到 bean 的选项卡视图中的命令按钮出现问题。

下面是一个简单的 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>

和豆子:

@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 绑定可消除该问题。我正在使用PrimeFaces 4.0。

感谢您的任何想法

一月

这是一个 Mojarra "问题",由 2.2.7 中的性能优化修复引入。

这是一个Mojarra"问题",我在处理RF-13920时发现了它,它是由JAVASERVERFACES-3193引入的。在向服务器发出请求期间,不会重新创建使用绑定的组件,而是重新创建其子组件。在原始子项仍然存在的情况下,插入新子项会导致"重复 id"错误。

所以

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

JSF 规范指出绑定只应在请求范围内使用,因此我认为如果这在对话作用域中失败,则不应将其视为错误。

最后一句话很有趣。正如jboss网站上的下一篇文章所发布的那样:

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

如果页面的其余逻辑保留在(例如)对话范围的 Bean 中,则甚至如此。您只需要为绑定属性提供一个请求范围的 bean,然后可以在 EL 和其他 bean 中引用该 bean。

另请查看此帖子

你可以尝试用其他方式做。使用选项卡外的远程命令与命令按钮的相同操作。然后在 commandCommand 的 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>

最新更新