如何将多个inputText映射到数组或集合属性?

问题描述 投票:0回答:2

我希望用户向 JSF 的 inputText 组件输入一个或多个名称。 所以我正在考虑这样的托管 bean:

public class MyBean {

    private String[] names;

    public String[] getNames() {
        return names;
    }

    public void setNames(String[] names) {
        this.names = names;
    }
}

但是,如何将 JSF 的 inputText 组件映射到此数组属性?

jsf
2个回答
14
投票

首先,您需要确保数组或集合在 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()
方法)。

另请参阅:


2
投票
这就是我如何使用上面的示例。

<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>
    
© www.soinside.com 2019 - 2024. All rights reserved.