0

こんにちは!

これが可能かどうかさえわかりませんが、うまくいけばJavaで可能です。PHPで変数変数を使用し、変数に動的にアクセスすることでこれを実行したことは知っていますが、Javaでは別の質問でこれが不可能であると読みました。

JSFGUIのチェックボックスの状態を含む文字列の配列があります。すべてのチェックボックスが設定されている場合、配列はさまざまなチェックボックスの値を含む文字列で埋められます。

チェックボックスのラベルと値は、次のような配列をループすることによって作成されます。

private static final String[][] OVERVIEW_FIELDS = {{"ID", "requestid"},
    {"Date added", "dob"}, {"Title", "requestTitle"}, {"Process", "processId"},
..., ..., ...};

次に、配列を反復処理して、配列からJSFSelectItemsを作成します。

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    SelectItem item = new SelectItem(OVERVIEW_FIELDS[i][0], OVERVIEW_FIELDS[i][1]);
    getFields().add(item);
}

問題と現在の解決策(うまくいけば、誰かが私がそれをより良いものにリファクタリングするのを手伝ってくれるでしょう:

for (String item : getVisibleFields()) {
           if (item.equals("dob")) {
                setDob(true);
            }
            if (item.equals("requestTitle")) {
                setRequestTitle(true);
            }
            if (item.equals("processId")) {
                setProcessId(true);
            }
            if (...) {
            }
}

など、11ブール値の間継続します。このソリューションは好きではありません。システム内の他のBeanでも同様のパターンが見られます。

これに対するより良い解決策があるかどうか誰かが知っていますか?チェックボックス配列に含まれる内容に応じて、レンダリングされたフィールドをtrue/falseに設定したブール制御列。

JSF ELで、visibleFields変数とcontainsメソッドにアクセスできることを期待していたので、オブジェクトが配列に存在する場合はtrueまたはfalseを返します。ただし、これは機能していないようで、ELはcontainsメソッドへのアクセスを許可しません。

私は現在使用しています:

rendered="#{overviewFilterBean.dob}"

そして私はこのコードで試しました:

rendered="#{overviewFilterBean.visibleFields.contains['dob']}">

これで、最終的な配列を使用してブール値をに設定しようとしましたgetFields().contains(OVERVIEW_FIELDS[i][1])が、どうすればこれを可能にできますか?

一部の実数と一部の擬似コードは次のとおりです(私が今目指していた解決策):

for (int i = 0; i < OVERVIEW_FIELDS.length; i++) {
    if (item.equals(OVERVIEW_FIELDS[i][1])) {
           setOVERVIEW_FIELDS[i][1](true);
       }
    }

大きな質問:

からの値を使用しOVERVIEW_FIELDS[i][1]て正しいブール変数を設定する方法はありますか、それともこれをマップに変換し、JSF ELを使用してキーがマップに存在するかどうかを確認できますか?

お時間をいただきありがとうございます。小さなポイントに到達するためにこのような長い質問を書いて申し訳ありません:/

編集:

リフレクション方式では5つの例外が発生し、それらを処理するコードの大きなブロックが発生しました。また、人々はそれが高価な方式であると言いました。これは、私の古い解決策またはマップを使用することのいずれかがそれを行うための最良の方法であると私に信じさせます。マップソリューションを試してみます=)

4

3 に答える 3

3

リフレクションを使用すると、次のことができます。

for (String item : getVisibleFields()) {
    getClass().getMethod("get" + capitalize(item)).invoke(this, true);
}

例外処理とcapitalizeメソッドは、読者の練習問題として残されています(多くinvokeの例外をスローします)。

于 2009-06-26T20:23:57.280 に答える
1

むしろ、いつでも値をマップに保存できます。ただし、メソッド名に基づいて文字列としてメソッドを呼び出す場合は、リフレクションを使用します。http://java.sun.com/developer/technicalArticles/ALT/Reflection/を参照してください

于 2009-06-26T20:25:56.683 に答える
0

この例のように、JavaリフレクションAPIを使用して、フィールドを動的に検索して設定できます。この方法ではパフォーマンスが低下することに注意してください。

于 2009-06-26T20:23:25.927 に答える