向 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
。有关action
和actionListener
之间区别的更多信息,请阅读此处:Differences between action and actionListener
其次,为什么不将process
和update
设置为仅数据表组件,然后您不必担心其他表单验证?这是一个例子:
<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 添加新行,然后提交内容的主要内容,如果未能解决你的问题,请参考以下文章