【问题标题】:Add a new row to a p:datatable then submit content向 p:datatable 添加新行,然后提交内容
【发布时间】:2013-04-22 21:11:02
【问题描述】:

我正在尝试在 Primefaces 数据表中添加新行,然后我想提交该表的内容并执行一些业务逻辑。数据表模型是在 ViewScoped 托管 bean 中维护的集合。

我正在使用 JSF 2.1 和 Primefaces 3.3。

简短示例:

    <h:form id="my-form">
        <p:dataTable value="#{testBean.list}" var="s" id="datatable">
            <p:column>
                <h:inputText value="#{s}"/>
            </p:column>
            <f:facet name="footer">
                <p:commandButton value="Add row" action="#{testBean.addRow()}" process="@form" update="@form" immediate="true" />
                <p:commandButton value="Do stuff" action="#{testBean.doSomeLogic()}" process="@form" update="@form"/>
            </f:facet>     
        </p:dataTable>
    </h:form>

托管 Bean:

@ManagedBean
@ViewScoped
public class TestBean implements Serializable {

private List<String> list;

public TestBean() {
}

@PostConstruct
public void init() {
    list = new ArrayList<String>();
    list.add("one");
    list.add("two");
}

public void addRow(){
    list.add(new String());
}

public void doSomeLogic(){
    for (String string : list) {
        System.out.println(string);
    }
}

// getters and setters

}

实际发生了什么:

  • 用户单击“添加行”按钮,添加了一个新行(我需要立即为真,因此不进行验证,这些字段是更大表单的一部分)。
  • 用户点击“do stuff”,集合大小合适(包含新行),但未考虑用户的输入(既未修改预先退出的行,也未在新添加的行中添加新值)。

我还能做些什么来提交新值?我才刚刚开始 JSF,我不确定我是否已经 100% 了解它。

感谢您的帮助。

可能的重复:

编辑:感谢 Jitesh 解决了问题,可以在此处找到一个工作示例:JSF2, can I add JSF components dynamically?

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    如果我理解正确,表格中的其他地方有一些验证失败。当任何提交的表单值验证失败时,除非使用immediate,否则不会将任何提交的值应用于托管bean。这就是为什么您似乎可以添加新行但不能使用 doStuff 方法的原因。您没有将immediate 添加到doStuff

    但要说明有几件事你可以做得更干净、更有效。

    首先,action 属性应该真正用于导航操作。 JSF 期望绑定到action 的方法具有表示导航结果的返回值。对于void 方法,最好使用actionListener。有关actionactionListener 之间区别的更多信息,请阅读此处:Differences between action and actionListener

    其次,为什么不将processupdate 设置为仅数据表组件,然后您不必担心其他表单验证?这是一个例子:

    <h:form id="my-form">
        <p:dataTable value="#{testBean.list}" var="s" id="datatable">
            <p:column>
                <h:inputText value="#{s}"/>
            </p:column>
            <f:facet name="footer">
                <p:commandButton value="Add row" actionListener="#{testBean.addRow}"
                   process=":my-form:datatable" update=":my-form:datatable" />
                <p:commandButton value="Do stuff" actionListener="#{testBean.doSomeLogic}"
                   process=":my-form:datatable" update=":my-form:datatable" />
            </f:facet>
        </p:dataTable>
    </h:form>
    

    【讨论】:

    • 在我的真实代码中有验证,但在我的示例中没有,我用它来尝试解决这个问题。所以在这个例子中process="@form" == process=":my-form"。基本上你的代码和我的完全一样(我测试过,同样的问题;点击“do stuff”并且没有提交新数据)。无论如何感谢您对 actionListener 和 action 的建议:)
    【解决方案2】:

    唯一的问题是您在 inputText 中使用了不可变对象。要了解这一点,请查看BaluC's Answer

    根据它“作为一个不可变对象,String没有setter方法。永远无法设置输入的值。”

    尝试从commandButton中删除immediate属性,你会发现在插入每一行时数据都会被清除。

    【讨论】:

    • 感谢您为我指明了正确的方向,我删除了 immediate 属性并使用 bean 而不是 String 并且成功了。
    • 顺便说一句,你的链接坏了,正确的here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多