【问题标题】:Saving data from multiple inputtext boxes created by a loop in jsf从 jsf 中的循环创建的多个输入文本框中保存数据
【发布时间】:2014-09-09 18:14:04
【问题描述】:

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

<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>

据我所知,每个单独的项目都需要有自己的变量名才能将数据保存在每个输入文本框中。我知道我目前使用的方法是错误的,那么还有其他方法可以保存所有数据吗?也许在一个数组或什么的?

【问题讨论】:

  • 您需要的是一个二维数组 (Object[][] arr) 或嵌套列表 (List&lt;List&lt;Object&gt;&gt; nestedList)。无论你使用什么,只要有一个吸气剂就足够了。
  • 您能否详细说明如何实现这一目标? inputText 中的值是什么?
  • 抱歉,我不确定您将输入绑定到行是什么意思?

标签: jsf primefaces


【解决方案1】:

首先,不建议将 JSTL c:foreach 与数据表混合使用。改用 ui:repeat。

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

例如,假设您的支持 bean 包含属性 List&lt;List&lt;Mat&gt;&gt; mats,其中 Mat 类包含单个属性“dataId”。那么,你的 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" ...

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2012-09-18
    • 1970-01-01
    相关资源
    最近更新 更多