如何使用ui重复+ h:inputText +托管bean在JSF中保存数组?

aci*_*anu 1 jsf facelets uirepeat

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

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

现在,我有一个托管bean,它也扮演控制器角色,并链接到模型bean.所以,在我的xhtml中我试图这样做:

<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
    <h:inputText value="#{baseNumber}"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

baseSetList 是int []数组.

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

也许这是重复不能正确绑定,我真的不知道.这是我经过多年的PHP :)后在java中的第一个项目.

Arj*_*jms 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>
Run Code Online (Sandbox Code Playgroud)

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

对于已经包含整数或其他不可变类型的集合,将它转换为上面提到的这种集合可能有点麻烦.然而,还有另一种解决方案.在那里你不使用var属性ui:repeat但使用它的索引.然后,您将h:inputText绑定到由此索引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 "";

    }

}
Run Code Online (Sandbox Code Playgroud)

用于以下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>
Run Code Online (Sandbox Code Playgroud)

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

  • 哎呀,谢谢,现在我开始更好地了解jsf是如何工作的. (2认同)
  • 好一个.请注意,`<ui:repeat>`上的`varStatus`在Facelets 1.x中不可用(对于JSF 1.x),OP没有明确提到他正在使用JSF 2.x. (2认同)