Jsf ui:重复“添加新项目”在第一个元素中不起作用

Jsf ui:重复“添加新项目”在第一个元素中不起作用,jsf,primefaces,jsf-2.2,mojarra,Jsf,Primefaces,Jsf 2.2,Mojarra,我目前正试图通过添加/删除primefacesp:commandButton来创建一个简单的输入列表 我在Glassfish 4.1.1上使用了PrimeFaces 6.2,与Mojarra 2.2.12一起使用 ExampleBean.java 使用rendered=“#{status.first}”,单击按钮不调用actionListener,而是触发更新 我不知道在第一个项目而不是在其他项目或最后一个项目中显示它之间会发生什么变化。我认为这与标志和命令按钮唯一ID的生成有关。这种观点可能会

我目前正试图通过添加/删除primefaces
p:commandButton
来创建一个简单的输入列表

我在Glassfish 4.1.1上使用了PrimeFaces 6.2,与Mojarra 2.2.12一起使用

ExampleBean.java

使用
rendered=“#{status.first}”
,单击按钮不调用
actionListener
,而是触发
更新


我不知道在第一个项目而不是在其他项目或最后一个项目中显示它之间会发生什么变化。

我认为这与
标志和命令按钮唯一ID的生成有关。这种观点可能会被混淆。添加其他按钮时,生成的ID将发生更改。另外,引入渲染属性也会改变组件的处理方式

为了解决这个问题,我认为您需要重新处理
ui:repeat
组件和命令按钮,以获得有效的操作URL。解决方案很简单-删除
process=“@this”

我用一个有效的解决方案调整了您的示例(示例使用Lombok)

@Data@Named@ViewScoped
公共类ExampleBean实现了可序列化{
私人名单;
@施工后
私有void init(){
列表=新的ArrayList();
addNewItem();
}
public void addNewItem(){
增加(新的IntegerPair(1300));
}
@资料
@AllArgsConstructor
公共类整数{
私钥,值;
}
}

例子
测试!
注意
IntegerPair
类?我之所以要介绍这一点,是因为JavaFX中定义的
Pair
类没有可写的键属性——JSF在处理输入组件的支持bean值时需要可写属性


坦率地说,由于您面临的问题源于
组件/标记,因此在命令按钮上执行
process=“example form:example container”
也应该可以正常工作-只需确保
包含在处理阶段。

因此,如果不使用“rendered”属性,所有按钮都可以工作吗?即使您从列表中的10条记录开始?由于您从中“违反”了第1和第8条,并且您可能会违反第6条,具体取决于会话范围的对错。@Kukeltje我想让示例简单一点,但我忘了添加
标记,
代码应该是一个。。。尝试不使用模板/合成,并在此文件中发布
h:head
。使用creatinga:Help可以帮助您缩小问题范围(甚至解决问题),并为我们提供代码,使我们有一个明确的帮助基础。另见@Kukeltje抱歉,我从头开始复制了我的错误,并更新了文件代码。我还添加了JSF的版本和实现。谢谢你让它成为现实。非常有用谢谢你亚当!连续两个答案,你救了我!顺便说一句,我不知道龙目岛,它在JEE开发中是否众所周知/使用过?用它来构建类看起来非常简单和清晰。很高兴能帮助@robinvrd!是的,Lombok很受欢迎,不仅在JEE开发中,而且在许多Java项目中都很受欢迎,因为它减少了样板代码,添加了一些很棒的功能,并且很好地清理了类。就我个人而言,我总是在新的Java项目中使用它。
package /* myPackage */;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javafx.util.Pair;
import javax.annotation.PostConstruct;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named(value = "exampleBean")
@SessionScoped
public class ExampleBean implements Serializable {

    private List<Pair<Integer, Integer>> list;

    @PostConstruct
    public void init() {
        list = new ArrayList<>();
        addNewItem();
    }

    public void addNewItem() {
        list.add(new Pair<>(1, 300));
    }

    public List<Pair<Integer, Integer>> getList() {
        return list;
    }

    public void setList(List<Pair<Integer, Integer>> list) {
        this.list = list;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui" 
      xmlns:jsf="http://xmlns.jcp.org/jsf">

    <h:head>
        <title>Example</title>
        <meta charset="utf-8" />
    </h:head>

    <h:body>
        <h:form id="example-form">
            <div jsf:id="example-container">
                <ui:repeat value="#{exampleBean.list}" var="item" varStatus="status">
                    <div>
                        <p:inputText value="#{item.key}" />
                        <p:inputText value="#{item.value}" />

                        <p:commandButton 
                            value="Delete" 
                            actionListener="#{exampleBean.list.remove(item)}" 
                            process="@this" 
                            update="example-form:example-container" 
                            rendered="#{!status.first}" />

                        <p:commandButton 
                            value="Add" 
                            actionListener="#{exampleBean.addNewItem()}" 
                            process="@this" 
                            update="example-form:example-container" 
                            rendered="#{status.first}" />
                    </div>

                </ui:repeat>
            </div>
        </h:form>
    </h:body>
</html>
<p:commandButton ... rendered="#{status.last}" /> <!-- actionListener called -->

<p:commandButton ... rendered="#{true}" /> <!-- actionListener called -->

<p:commandButton ... rendered="#{status.first}" /> <!-- actionListener NOT called -->
@Data @Named @ViewScoped
public class ExampleBean implements Serializable {

    private List<IntegerPair> list;

    @PostConstruct
    private void init() {
        list = new ArrayList<>();
        addNewItem();
    }

    public void addNewItem() {
        list.add(new IntegerPair(1, 300));
    }

    @Data
    @AllArgsConstructor
    public class IntegerPair {
        private int key, value;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:ui="http://java.sun.com/jsf/facelets"  xmlns:p="http://primefaces.org/ui" 
      xmlns:jsf="http://xmlns.jcp.org/jsf">

    <h:head>
        <title>Example</title>
        <meta charset="utf-8" />
    </h:head>

    <h:body>
        Test!
        <h:form id="example-form">
            <div jsf:id="example-container">
                <ui:repeat value="#{exampleBean.list}" var="item" varStatus="status">
                    <div>
                        <p:inputText value="#{item.key}" />
                        <p:inputText value="#{item.value}" />

                        <p:commandButton 
                            value="Delete" 
                            actionListener="#{exampleBean.list.remove(item)}" 
                            update="example-form:example-container" 
                            rendered="#{!status.first}" />

                        <p:commandButton 
                            value="Add" 
                            actionListener="#{exampleBean.addNewItem}" 
                            update="example-form:example-container" 
                            rendered="#{status.first}" />
                    </div>

                </ui:repeat>
            </div>
        </h:form>
    </h:body>
</html>