1

在 postgres 数据库中,我有一个表,其中包含一个 int[] 字段。

在我的模型中,我有一个映射表的持久 bean,包括 int[] 字段。在这个类中,我已经实现了所有需要的 setter/getter。

现在,我有一个托管 bean,它也扮演控制器角色,并链接到模型 bean。因此,在我的 xhtml 中,我正在尝试这样做:

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
    <h:inputText value="#{baseNumber}"/>
</ui:repeat>

baseSetList是 int[] 数组。

问题是当我提交表单时,只有这个元素没有更新。初始化工作,getter被调用,但不是save,所以它必须是一个绑定的东西。长话短说,我试图用自定义类的 ArrayList 替换 int[] 数组,该类可以包装 int(如可写整数),但它不起作用。

也许是没有正确绑定的重复,我真的不知道。这是我在多年 PHP 之后的第一个 Java 项目 :)。

4

2 回答 2

10

如果editableBaseSetList是一个 int[],那么baseNumber是一个 int。您现在将输入文本组件绑定到此 int。

然而,这种绑定不是双向的。输入元素只能看到您绑定到它的元素,而不是它所源自的集合。因此它不知道如何更新这个集合。

因此,您需要绑定到可以更新的东西。例如,如果您的列表包含一个 IntHolder,其中包含用于内部整数的 getter 和 setter(例如 getInt() 和 setInt()),并且列表将是 ArrayList,您将使用:

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
    <h:inputText value="#{baseNumber.int}"/>
</ui:repeat>

在回发之后,JSF 将使用提供的值对列表中的每个 IntHolder 调用 setInt() 方法。

对于已经包含整数或其他不可变类型的集合,将其转换为上述此类集合可能有点麻烦。然而,还有另一种解决方案。在那里你不使用var属性ui:repeat但使用它的索引。然后,您将h:inputTexta 绑定到由该索引 var 索引的集合。

例如

假设您有以下 bean:

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class RepeatBean {

    List<Integer> list;

    public List<Integer> getList() {
        return list;
    }

    @PostConstruct
    public void initList() {
        list = new ArrayList<Integer>();
        list.add(10);
        list.add(20);
        list.add(30);
    }

    public String save() {
        // list now contains the values provided by the user.
        return "";

    }

}

用于以下 Facelet:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"        
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    >

    <h:body>

        <h:form>
            <ui:repeat value="#{repeatBean.list}" varStatus="status">            
                <h:inputText value="#{repeatBean.list[status.index]}" />
            </ui:repeat>
            <h:commandButton value="Save" action="#{repeatBean.save}" />
        </h:form>

    </h:body>
</html>

这最初将在您的屏幕上显示 10 20 30。当您更改数字并单击保存时,您可以通过例如断点验证列表实例变量是否包含更新的数字。

于 2011-03-09T23:28:31.353 回答
2

不知道我是否正确,但未baseNumber绑定到任何托管 bean 中的任何属性。它只存在于ui:repeat.

您应该执行以下操作:

<ui:repeat value="#{editableBaseSetList}" var="myVariable">
    <h:inputText value="#{managedBean.property}" />
</ui:repeat>
于 2011-03-09T22:11:48.083 回答