我希望用户向 JSF 的 inputText 组件输入一个或多个名称。 所以我正在考虑这样的托管 bean:
public class MyBean {
private String[] names;
public String[] getNames() {
return names;
}
public void setNames(String[] names) {
this.names = names;
}
}
但是,如何将 JSF 的 inputText 组件映射到此数组属性?
首先,您需要确保数组或集合在 bean 中预先初始化,即它是 never
null
,原因很简单,因为 JSF 不会为您这样做,因为它事先不知道如何初始化很多你想要的物品。
例如在
@PostConstruct
。
@PostConstruct
public void init() {
names = new String[3];
}
然后,您可以任意通过硬编码索引访问它们
<h:inputText value="#{myBean.names[0]}" />
<h:inputText value="#{myBean.names[1]}" />
<h:inputText value="#{myBean.names[2]}" />
或使用
<ui:repeat>
和varStatus
通过动态索引访问它们
<ui:repeat value="#{myBean.names}" varStatus="loop">
<h:inputText value="#{myBean.names[loop.index]}" />
</ui:repeat>
不要使用var
属性,如
<ui:repeat value="#{myBean.names}" var="name">
<h:inputText value="#{name}" />
</ui:repeat>
当你提交表单时它不起作用,因为不可变的String
类实际上没有值的setter(getter基本上是EL隐含的
toString()
方法)。另请参阅:
<c:forEach items="#{cotBean.form.conductor}" varStatus="numReg">
<ice:panelGroup>
<ice:selectOneMenu value="#{cotBean.form.conductor[numReg.index].gender}">
</ice:selectOneMenu>
</ice:panelGroup>
<ice:panelGroup>
<ice:selectOneMenu value="#{cotBean.form.conductor[numReg.index].dob.day}">
</ice:selectOneMenu>
<ice:selectOneMenu value="#{cotBean.form.conductor[numReg.index].dob.month}">
</ice:selectOneMenu>
<ice:selectOneMenu value="#{cotBean.form.conductor[numReg.index].dob.year}">
</ice:selectOneMenu>
</ice:panelGroup>
</c:forEach>