向 p:datatable 添加新行,然后提交内容

Posted

技术标签:

【中文标题】向 p:datatable 添加新行,然后提交内容【英文标题】:Add a new row to a p:datatable then submit content 【发布时间】: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% 了解它。

感谢您的帮助。

可能的重复:

Add a row to h:dataTable via AJAX with request-scoped bean without losing the row data How to Dynamically add a row in a table in JSF? JSF datatable: adding and removing rows clear rows values

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

【问题讨论】:

【参考方案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

以上是关于向 p:datatable 添加新行,然后提交内容的主要内容,如果未能解决你的问题,请参考以下文章

向 CSV 文件添加新行

Odoo:如何在向表单“添加新行”后发送 message_post()

提示输入密码然后重定向

如何使用 ASP.NET OLEDB 向数据库中添加一行?

使用jquery向表中添加行,但未使用php提交新行

向 pyspark Dataframe 添加新行