我正在尝试在Primefaces数据表中添加一个新行,然后我想提交此表的内容并执行一些业务逻辑。数据表模型是在ViewScoped托管bean中维护的集合。
我正在使用带有Primefaces 3.3的JSF 2.1。
简短的例子:
<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>
Managed 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
}
实际发生的事情:
我还可以提交新值吗?我只是开始使用JSF而且我不确定我是否已经100%得到它。
感谢您的帮助。
可能重复:
编辑问题由于Jitesh而得到解决,可以在此处找到一个工作示例:JSF2, can I add JSF components dynamically?
答案 0 :(得分:1)
唯一的问题是你在inputText中使用不可变对象。要理解这个结帐BaluC's Answer
根据它“作为一个不可变对象,String没有setter方法。永远不能设置输入的值。”
尝试从commandButton中删除immediate属性,您会发现在插入每行时数据将被清除。
答案 1 :(得分:0)
如果我理解正确,表格中的其他地方会有一些失败的验证。当任何提交的表单值未通过验证时,除非使用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>