【问题标题】:Submit data-table in JSF / Primefaces?在 JSF/Primefaces 中提交数据表?
【发布时间】:2015-07-25 18:19:32
【问题描述】:

我正在使用 jsf/primefaces、netbeans 和 tomcat 开发一个 Web 应用程序。 我有一个数据表,其中包含从另一个表和一些可编辑字段加载的一些值。我的问题是,在用户编辑完此表后,我如何提交整个表以便将其存储在数据库中的新表中?

 <h:form id="form" prependId="false">

                    <h3>All of your Paddocks</h3>
                    <p:dataTable var="paddock" value="#{paddock.getfromPaddock()}" editable="true">
                        <p:ajax event="rowEdit" listener="#{paddock.onRowEdit}"  />
                        <p:ajax event="rowEditCancel" listener="#{paddock.onRowCancel}"  />
                        <p:column headerText="Id">
                            <h:outputText value="#{paddock.idPaddock}" />
                        </p:column>

                        <p:column headerText="Name">
                            <h:outputText value="#{paddock.name}" />
                        </p:column>

                        <p:column headerText="Area">

                                 <h:outputText value="#{paddock.area}" />


                        </p:column>

                        <p:column headerText="Enter Grass Weight">
                         <p:cellEditor>

                                <f:facet name="output"><h:outputText value="0" /></f:facet>
                                <f:facet name="input"><p:inputText id="modelInput" value="0" style="width:100%"/></f:facet>
                            </p:cellEditor>
                        </p:column>

                        <p:column style="width:32px">
                            <p:rowEditor />
                        </p:column>



                    </p:dataTable>
                    <h:commandButton value="Log" action="#{paddock.add}" />

                </h:form>

请注意,唯一可编辑的列是草列。

【问题讨论】:

    标签: database jsf primefaces datatable submit


    【解决方案1】:

    首先,有两个主要错误可能会产生不良副作用:

    1. &lt;h:form ... prependId="false"&gt;

      永远不要使用prependId。删除整个属性。

    2. &lt;p:dataTable var="paddock" value="#{paddock.getfromPaddock()}"&gt;

      您应该给var 一个不同于托管bean 的名称。例如。 paddockItem.


    至于具体问题,您的另一个错误在这里:

    <p:inputText id="modelInput" value="0" />
    

    您没有将输入值绑定到模型。所以 JSF 无论如何都无法使用提交的值更新模型。

    相应地修复它,例如:

    <p:inputText id="modelInput" value="#{paddockItem.grass}" />
    

    在提交方法中,它会立即出现在模型中。

    您只应绝对确保您没有在&lt;p:dataTable value&gt; 的getter 方法中与数据库交互,否则您将在每一轮迭代中覆盖模型,从而基本上丢弃提交的值直到最后一行在提交方法被击中之前。数据表值value="#{paddock.getfromPaddock()}" 后面的奇怪方法名称表明您正在这样做。如果它是不动产,一般初学者只会使用value="#{paddock.fromPaddock}" 左右。

    另见:

    【讨论】:

    • @BalusC,为什么不使用prependId属性?
    • @BalusC,您好,再次感谢您提供的有用提示,但我仍然认为我的问题并不清楚,所以我添加了一张图片来进一步解释。我知道将字段映射到支持 bean 是如何工作的,但是在这种情况下(即图像),值是从支持 bean 围场显示的,除了可编辑的草地字段。所以我的问题是如何遍历上面的 jsf 表+草值并将其提交给新的 bean,因为我不能使用 #{paddock.idpaddock} 因为它已经被映射用于在输出文本中显示该字段?
    • 然后只需创建一个新属性,或者将其包装在具有该属性的新 bean 中,或者创建旧 bean 和新属性之间的映射。归根结底,您应该将视图中的输入值绑定到模型中的属性,而不管方式如何(并且您的 getter 方法没有业务逻辑)。然后 JSF 将透明地处理其余部分。
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 2014-05-22
    • 2012-11-22
    • 2013-07-23
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多