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

How map multiple inputText to an array or collection property?

提问人:user851110 提问时间:7/19/2011 最后编辑:BalusCuser851110 更新时间:10/20/2023 访问量:11442

问:

我希望用户在 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公司

评论


答:

14赞 BalusC 7/19/2011 #1

首先,您需要确保数组或集合在 Bean 中预先初始化,即它永远不会初始化,原因很简单,因为 JSF 不会为您执行此操作,因为它事先不知道您想要多少个项目。null

例如,在 .@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>

当您提交表单时,它将不起作用,因为不可变类实际上没有值的 setter(getter 基本上是 EL 隐含的方法)。StringtoString()

另请参阅:

2赞 Elidio Marquina 4/25/2012 #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>