这个问题似乎很简单,但我没有发现错误。
好的,我们走了:我有一张带有IP列表的表格(无论如何),
IP n :[INPUT-FIELD] [按钮“添加”]
IP n + 1 :[INPUT-FIELD] [按钮“添加”]
这些IP从一开始就存在。
它们在Managed Bean的构造函数中初始化。
当我点击“添加”按钮时,将验证当前的IP。之后 我在我的java.util.List和另一行中添加了另一个条目 JSF表单出现:
IP n + 2 :[INPUT-Field] [按钮“添加”]
等等。
添加一行(使用新IP)并验证当前IP 完美适用于现有值 IP n 和 IP n + 1 , 但验证和添加不适用于动态 添加 IP n + 2 。既不验证动态生成的输入字段 使用新创建的“添加”按钮,也可以添加另一行。
我做错了什么?
<h:form id="frmSpecial" prependId="false">
<h:panelGroup id="tblDestFw">
<c:forEach items="#{bean.fwdest}" var="fwdest">
IP: <h:inputText value="#{fwdest.ip}" validator="#{bean.validateIP}"/>
<h:commandButton action="#{bean.addFwDest()}"
value=">>" title="Add another line">
<f:ajax execute="@this" render="tblDestFw"/>
</h:commandButton>
<br/>
</c:forEach>
</h:panelGroup>
</h:form>
@ManagedBean(name = "bean")
@ViewScoped
public class EnterNewSystemFW implements Serializable {
List<FirewallDest> fwdest;
public EnterNewSystemFW() {
fwdest.add(new FirewallDest("N"));
fwdest.add(new FirewallDest("N+1"));
}
public void addFwDest() {
fwdest.add(new FirewallDest());
}
}
感谢。
贝恩德
答案 0 :(得分:0)
对于添加新行,您的<c:forEach>
引用了一个视图范围的bean属性。由于JSF issue 1492,此bean在每个请求上重建。
将其替换为普通的JSF组件,例如<ui:repeat>
或<h:dataTable>
,它将按预期工作。
<ui:repeat value="#{bean.fwdest}" var="fwdest">
...
</ui:repeat>
对于执行验证,您的<f:ajax execute="@this">
仅处理当前组件(命令按钮),而不处理输入。请改用<f:ajax execute="@form">
来处理整个表单。