保存来自jsf中循环创建的多个输入文本框的数据

时间:2014-09-09 18:14:05

标签: jsf primefaces

基本上,我有一个输入文本框,我想为数组中的每个项目提交。以下代码缩减为相关部分

<c:forEach items="${mybean.mats}" var="mat">
        <p:dataTable var="datarow" value="#{mybean.getDatarows(mat.itemId)}" rowIndexVar="row">
            <p:column>
                <p:inputText value="#{bean.amt}" />
            </p:column>
        </p:dataTable>
    </p:panel>

    <p:commandButton value="Confirm" action="#{mybean.runSubmit}" process="@this" />
</c:forEach>

据我所知,每个单独的项目都需要有自己的变量名称来保存每个输入文本框中的数据。我知道我目前使用的方法是错误的,那么还有另一种保存所有数据的方法吗?也许在一个阵列或什么?

1 个答案:

答案 0 :(得分:1)

首先,不建议将JSTL c:foreach与数据表混合使用。使用ui:代替重复。

其次,p:dataTable值必须引用在辅助bean的生命周期中存在的集合。在我看来,调用#{mybean.getDatarows(mat.itemId)}会动态生成项目列表。这将成为一个问题,因为当您的ajax调用getDatarows上的值重新应用于bean时,您的支持bean需要调用runSubmit来保存值。在这种情况下,您需要将动态创建的列表保存到辅助bean,以便相同的集合与用于生成html的集合完全匹配。

例如,假设您的支持bean包含属性List<List<Mat>> mats,其中Mat类包含单个属性&quot; dataId&#39;。那么,你的EL可能是:

<h:form id="input-form">
 <ui:repeat id="mats-repeat" value="#{mats}" var="mat">
  <p:dataTable id="mat-table" value="#{mat}" var="dataObj">
   <p:column>
    <p:inputText id="dataId" value="#{dataObj.dataId}" />
   </p:column>
  </p:dataTable>
 </ui:repeat>
</h:form>

由于form,repeat和dataTable组件是命名容器,因此它们确保任何子组件都是唯一命名的。在这种情况下,第一个输入mat元素将呈现为:

<input id="input-form:mats-repeat:0:mat-table:0:dataId" ...