2011-03-09 69 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