【发布时间】:2025-12-27 14:10:06
【问题描述】:
我需要通过如下循环生成文本框。
<p:panel id="dataPanel" closable="true" toggleOrientation="horizontal" toggleable="true" header="Data">
<h:panelGrid id="dataPanelGrid" columns="3" cellpadding="5">
<c:forEach var="row" items="#{zoneChargeManagedBean.list}">
<p:outputLabel for="txtCharge" value="#{row[1]}"/>
<p:inputText id="txtCharge" value="#{row[2]}" converter="#{bigDecimalConverter}" onkeydown="return isNumberKey(event, this.value);" label="#{row[1]}" required="false" maxlength="45">
<f:validator validatorId="negativeNumberValidator"/>
<f:attribute name="isZeroAllowed" value="false"/>
<f:validator validatorId="bigDecimalRangeValidator"/>
<f:attribute name="minPrecision" value="1"/>
<f:attribute name="maxPrecision" value="33"/>
<f:attribute name="scale" value="2"/>
</p:inputText>
<p:message for="txtCharge" showSummary="false"/>
</c:forEach>
<p:commandButton id="btnSubmit" update="dataPanel messages" actionListener="#{zoneChargeManagedBean.insert}" icon="ui-icon-check" value="Save"/>
<p:commandButton value="Reset" update="dataPanel" process="@this">
<p:resetInput target="dataPanel" />
</p:commandButton>
</h:panelGrid>
</p:panel>
给定文本框的值是来自数据库的BigDecimal 类型。
当按下给定的命令按钮时,应该从相应的 JSF 托管 bean 中检索这些文本框保存的值,以便可以在数据库中插入或更新它们。
如果可以在按下给定按钮时在某种集合(如java.util.List)中一次检索所有这些文本字段的值,那就更好了。
【问题讨论】:
-
您可以使用 PrimeFaces 数据表 - 行编辑功能。 primefaces.org/showcase/ui/datatableRowEditing.jsf
-
我不清楚这个问题。 ZoneChargeManagedBean 是您的代码,您应该最了解如何访问其数据。顺便说一句,使用索引来访问行数据似乎很尴尬,但如果没有 bean 的代码就很难说。
-
您的具体问题是什么?您已经有一个
#{zoneChargeManagedBean.list}来保存这些值。在action方法中检查时是否为空? -
新值不会在
zoneChargeManagedBean.list中累积,当然,当与<c:foreEach>一起使用时,<ui:repeate>不会发生这种情况,其中填充了新值(列表已经在从数据库中检索时填充,如果数据库表中有相应的行。更新只需要在列表持有的对象数组row[2]的最后一个元素中进行。最后一个元素的值显示在<p:inputText>)。 -
哦,对了,你还在用 Spring 来管理 bean。显然,它的视图范围与
c:forEach不兼容,这会导致在每次迭代时重新创建 bean。在旧的 Mojarra 版本中,JSF 自己的视图范围中存在类似的错误。在以后的问题中,请描述实际问题! (并消除代码噪音,我看不出使用BigDecimal而不是String并让那些验证器/转换器、<p:panel>等...与具体问题相关。
标签: jsf jsf-2 primefaces