4

我正在尝试在 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>

托管豆:

@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,我可以动态添加 JSF 组件吗?

4

2 回答 2

2

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

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

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

于 2013-04-30T19:02:56.377 回答
0

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

但要说明有一些事情你可以做得更干净、更有效。

首先,该action属性应该真正用于导航操作。JSF 期望绑定到 的方法action具有表示导航结果的返回值。对于void方法,最好使用actionListener. 有关和之间的区别的更多信息,actionactionListener阅读此处:action 和 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>
于 2013-04-29T11:35:12.070 回答