1

バッキングCDI-Beanにチェックボックスを渡したい。postTest.valuesは単なるLongのリストです。

<h:form>
    <h:dataTable value="#{postTest.values}" var="val">
        <h:column>
            <h:outputLabel value="#{val}"/>
        </h:column>
        <h:column>
            <h:selectBooleanCheckbox value="#{postTest.checked[val]}"/>
        </h:column>
    </h:dataTable>
    <h:commandButton action="#{postTest.process}"/>
</h:form>

アクションメソッドは、チェックされた値を出力する必要があります。しかし、それはただ空です。

@Named
@RequestScoped
public class PostTest {

    List<Long> values;
    Map<Long, Boolean> checked;

    ... 
    public String process() {
        logger.info(this.toString() + "Processing");
        for (Long l : checked.keySet()) {
            logger.info(this.toString() + "\t" + l + ". checked: " + checked.get(l));
        }

        return "index2";
    }
    ...
}

getChecked()メソッドにロギングを追加すると、列ごとに1回だけ取得され、その内容はまったく変更されていないことがわかります。

この問題は、フォームが値を渡すときにpostTest.valuesが初期化されないという点に関連しているようです。コンストラクター(または@PostConstruct)でpostTest.valuesを初期化すると、チェックされた項目が正しく渡されるためです。

POSTリクエストの実行後にpostTest.valuesを初期化する必要があるのはなぜですか?

それを防ぐ方法はありますか?

または、別のオプションがありますか?たとえば、postTest.valuesがコンストラクターや@PostConstructを使用せずに適切に初期化されていることを確認します。これにより、初期化の前に値を渡します(リスナーを試しましたが、解決されていないようです)。

ありがとう!

ティム

4

1 に答える 1

0

およびメソッドを使用@ViewAccessScopedしたくない場合は、MyfacesCODIアノテーションを使用することもできます。これは、 JSFマネージドBeanと同等のCDI拡張機能です。私はこのアノテーションの実装をチェックしませんでしたが、多くの開発者がアノテーションよりも優れていると言っているのを目にします。@ConversationScopedstart()end()@ViewScoped@ViewScoped

Myfaces CODIをダウンロードしてクラスパスにドロップし、アノテーションを使用するだけです。

于 2012-09-01T04:11:55.440 に答える