2011-01-07 10 views
2

私は、JSFページがあります。h:dataTableにネストされた入力(たとえばh:inputText)がBeanモデルを更新しないのはなぜですか?

.... 
<form jsfc="h:form" action=""> 
    <h:dataTable value="#{newMusician.strings}" var="preferredMusicGenre" id="musicGenresSelectTable"> 
    <h:column> 
     <h:inputText value="#{preferredMusicGenre}" immediate="true"/> 
    </h:column> 
    </h:dataTable> 
    <p> 
     <input type="submit" jsfc="h:commandButton" value="Add" action="#{newMusician.saveNewMusician}"/> 
    </p> 
</form> 
.... 

と文字列のArrayListのを持っている管理対象Bean:

@ManagedBean 
@ViewScoped 
public class NewMusician { 

    private ArrayList<String> strings = new ArrayList<String>(); 

    public NewMusician() { 
     strings.add("olo"); 
    } 
    public ArrayList<String> getStrings() { 
     return strings; 
    } 
    public void saveNewMusician() { 
    ..... 
    } 
.... 
} 

問題:私は私が見ることができるし、押しボタンの保存、saveNewMusicianで()メソッドでテキストを変更しますArrayListの "strings"には同じ古い値 "olo"が含まれていますが、入力フィールドに挿入されたものはありません。 h:selecOneMenuを使用する場合は同じ問題です。

文字列ではなく、文字列を集約して値を文字列に設定するオブジェクトの場合は、状況が変更されます。 は、だから私はいくつかのPOJOを使用してへのinputTextを変更します場合:

<h:inputText value="#{preferredMusicGenrePojo.string}" immediate="true"/> 

すべてがOKになります。

質問: なぜ1レベルのゲッタ<h:inputText value="#{preferredMusicGenre}"/>の使用は間違っていますが、2レベルのゲッターの使用は<h:inputText value="#{preferredMusicGenrePojo.text}"/>がOkですか?

答えて

2

Stringは不変です。値の設定がありません。あなたはこれをビーン(またはPOJOと呼んでいます)で囲む必要があります。

public class Musician { 
    private String preferredGenre; 

    // Add/generate constructor, getter, setter, etc. 
} 

次に、マネージドBeanを次のように変更します。

@ManagedBean 
@ViewScoped 
public class NewMusician { 

    private ArrayList<Musician> musicians = new ArrayList<Musician>(); 

    public NewMusician() { 
     musicians.add(new Musician("olo")); 
    } 

    public ArrayList<Musician> getMusicians() { 
     return musicians; 
    } 

    public void saveNewMusician() { 
     // ... 
    } 

    // ... 
} 

そして、あなたのDataTable:

<h:dataTable value="#{newMusician.musicians}" var="musician"> 
    <h:column> 
     <h:inputText value="#{musician.preferredGenre}" /> 
    </h:column> 
</h:dataTable> 
+0

は答えをいただき、ありがとうございます。今の状況は私には明らかですが、実際にはそれは簡素化されています。オリジナルのケースはPOJOオブジェクトでした。 JSFは: ""これはカスタムコンバータを使用したコンバーターです。この事件で私を助けることができますか? – MercurieVV

+0

これは意味をなさない。私の答えの例に従って修正してください。 – BalusC

+0

はい。しかし、私がJPAモデルを使っていて、そのエンティティをラップしたくないのであれば。 JSF Backing BeanでJPAモデルを結合するのは悪い習慣ですか? – MercurieVV

関連する問題