1

postgresデータベースには、特にint[]フィールドを持つテーブルがあります。

私のモデルには、int[]フィールドを含むテーブルをマップする永続化されたBeanがあります。このクラスでは、必要なすべてのセッター/ゲッターを実装しました。

これで、コントローラーの役割も果たし、モデルBeanにリンクするマネージドBeanができました。だから、私のxhtmlで私はこれをやろうとしています:

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

baseSetListint[]配列です。

問題は、フォームを送信すると、この要素のみが更新されないことです。初期化は機能しており、ゲッターは呼び出されますが、保存は呼び出されないため、バインドする必要があります。簡単に言うと、int []配列を(書き込み可能な整数のように)intをラップできるカスタムクラスのArrayListに置き換えようとしましたが、機能していません。

たぶんそれはきちんとバインドされないリピートです、私は本当に知りません。これは、何年にもわたってPHPを使用した後の、Javaでの私の最初のプロジェクトです:)。

4

2 に答える 2

10

editableBaseSetListがint[]の場合、はbaseNumberintです。これで、入力テキストコンポーネントをこのintにバインドしています。

ただし、このバインディングは双方向ではありません。input要素は、バインドしている要素のみを表示し、元のコレクションは表示しません。したがって、このコレクションを更新する方法についての知識はありません。

したがって、更新可能なものにバインドする必要があります。たとえば、リストに内部整数のゲッターとセッター(getInt()やsetInt()など)を含むIntHolderが含まれていて、リストがArrayListになる場合は、次のように使用します。

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

ポストバックの後、JSFは、指定された値を使用して、リスト内の各IntHolderでsetInt()メソッドを呼び出します。

整数または他の不変の型をすでに保持しているコレクションの場合、それを上記のようなコレクションに変換するのは少し面倒な場合があります。ただし、別の解決策もあります。そこでは、のvar属性を使用せずui:repeat、そのインデックスを使用します。次に、h:inputTextこのインデックス変数によってインデックス付けされたコレクションへのバインディングを指定します。

例えば

次の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 "";

    }

}

次の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>

これにより、最初は画面に102030が表示されます。番号を変更して[保存]をクリックすると、たとえばブレークポイントを介して、リストインスタンス変数に更新された番号が含まれていることを確認できます。

于 2011-03-09T23:28:31.353 に答える
2

私があなたを正しく理解しているかどうかはわかりませんがbaseNumber、マネージドBeanのプロパティにバインドされていません。のスコープ内にのみ存在しますui:repeat

次のようなことをする必要があります。

<ui:repeat value="#{editableBaseSetList}" var="myVariable">
    <h:inputText value="#{managedBean.property}" />
</ui:repeat>
于 2011-03-09T22:11:48.083 に答える