2

重複する値を検証するために、Bean のアクション メソッド中にUIInputコンポーネント内のコンポーネントの値を収集しようとしています。UIDataコンポーネントを Bean プロパティにバインドしUIInputてその値を取得しようとしましたが、出力されnullます。データテーブルの外側に配置すると、期待値が出力されます。データテーブルに何か問題がありますか?

<rich:dataTable binding="#{bean.table}" value="#{bean.data}" var="item">
    <h:column>
        <f:facet name="header">
            <h:outputText value="Field1" />
        </f:facet>
        <h:inputText binding="#{bean.input}" value="#{item.field1}" />
    </h:column>
</rich:dataTable>

バッキング Bean コードは次のとおりです。

private UIData table;
private UIInput input;

public void save() {
    System.out.println(input.getId() + " - " + input.getValue());
}
4

1 に答える 1

1

データテーブルに問題はありません。JSF コンポーネント ツリーには、親コンポーネントがモデルのすべての項目を反復処理するたびに状態が変更されるコンポーネントが1 つだけ あります。したがって、状態は反復中にのみ使用でき、前後では使用できません。親コンポーネントが反復処理を行っていないときに、Bean のアクション メソッドで単一のコンポーネントの値にアクセスしようとしているため、値は常に を返します。UIInputUIDataUIDataUIDatanull

でコンポーネント ツリーにアクセスし、実装に必要なUIComponent#visitTree()情報UIDataを収集する必要がありVisitCallbackます。

table.visitTree(VisitContext.createVisitContext(FacesContext.getCurrentInstance()), new VisitCallback() {
    @Override
    public VisitResult visit(VisitContext context, UIComponent target) {
        if (target instanceof UIInput) {
            UIInput input = (UIInput) target;
            System.out.println("id: " + input.getId());
            System.out.println("value: " + input.getValue());
        }

        return VisitResult.ACCEPT;
    }
});

ちなみに、通常ValidatorUIInputコンポーネントの法線を使用して検証を実行しますが、この特定のケースではValueChangeListener. これにより、無効化とメッセージ処理が容易になります。

于 2012-05-19T15:00:27.700 に答える