在postgres数据库中,我有一个表,其中包含一个int []字段。
在我的模型中,我有一个映射表的持久bean,包括int []字段。在本课程中,我已经实现了所有需要的setter / getters。
现在,我有一个托管bean,它也扮演控制器角色,并链接到模型bean。 所以,在我的xhtml中,我试图这样做:
<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
<h:inputText value="#{baseNumber}"/>
</ui:repeat>
baseSetList
是int []数组。
问题是,当我提交表单时,只会更新此元素。初始化正在运行,getter被调用,但不是save,所以它必须是绑定的东西。 长话短说,我试图用一个自定义类的ArrayList替换int []数组,该类可以包装int(就像一个可写的Integer),但是它没有用。
也许这是重复不能正确绑定,我真的不知道。这是我经过多年和PHP多年的java中的第一个项目:)。
答案 0 :(得分:10)
如果editableBaseSetList
是int [],则baseNumber
是int。您现在将输入文本组件绑定到此int。
然而,这种绑定不是双向的。 input元素只能看到你绑定它的元素,而不是它所源自的集合。因此,它不知道如何更新此集合。
因此,您需要绑定到可以更新的内容。如果您的列表实例包含一个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
的{{1}}属性,而是使用其索引。然后,您将ui:repeat
绑定到由此索引var。
E.g。
假设您有以下bean:
h:inputText
用于以下Facelet:
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 "";
}
}
这将最初在您的屏幕上显示10 20 30。更改数字并单击“保存”后,您可以通过例如列表实例变量包含更新数字的断点。
答案 1 :(得分:2)
不知道我是否正确,但baseNumber
未绑定到任何托管bean中的任何属性。它仅存在于ui:repeat
。
您应该执行以下操作:
<ui:repeat value="#{editableBaseSetList}" var="myVariable">
<h:inputText value="#{managedBean.property}" />
</ui:repeat>