2011-03-09 33 views
1

在postgres数据库中,我有一个表格,其中还有一个int []字段。如何使用ui:repeat + h:inputText +托管bean在JSF中保存数组?

在我的模型中,我有一个持久化bean映射表,包括int []字段。在这门课上,我已经实施了所有需要的制定者/获得者。

现在,我有一个管理bean,也扮演控制器角色,并链接到模型bean。 所以,在我的XHTML我试图做到这一点:

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

baseSetList是INT []数组。

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

也许这是重复,不正确绑定,我不知道。这是我在PHP中经过多年和数年的第一个项目:)。

回答

2

不知道我是否帮到你,但baseNumber未绑定到任何托管bean中的任何属性。它只存在于ui:repeat的范围内。

你应该这样做:

<ui:repeat value="#{editableBaseSetList}" var="myVariable"> 
    <h:inputText value="#{managedBean.property}" /> 
</ui:repeat> 
+0

事实上,我刚刚发现我自己。所以实际上,我现在使用baseNumber.storedInteger和setter是正确的调用。现在我必须从对象数组构建我的原始int数组。 – aciobanu

+0

我的问题是事实上,我的托管bean proprety它是一个数组,并且我想为数组中的每个成员输入文本并将它们保存到数据库中。这是我还没有实现的。 – aciobanu

+1

你有没有尝试过几个'inputText'指向'value'到同一个'#{managedBean.property}'?你知道你可以使用“选择多个列表框”吗?如果它解决了你的问题,当然... – bluefoot

10

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

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

因此您需要绑定到可更新的内容。如果您的列表例如包含有getter和setter为内部整数的的IntHolder(说getInt()和SETINT()),并且该列表将ArrayList中,你可以使用:

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

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

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

E.g.

假设你有以下豆:

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。当您更改号码并点击保存时,您可以通过例如列表实例变量包含更新的数字的断点。

+2

啧啧,谢谢,现在我开始对jsf的工作方式有更好的了解。 – aciobanu

+2

不错的一个。请注意,''上的'varStatus'在Facelets 1.x中不可用(对于JSF 1.x),OP没有明确提及他在使用JSF 2.x. – BalusC