8

JSF、Managed Beans、および EL 2.2 では、次の形式の式を一般的に知っています。

#{bean.value}

次のように、マネージド Bean クラスの対応する関数セットにマップされます。

@ManagedBean
class Bean {
    private String value;
    public String getValue() { return value; }
    public void setValue( String s ) { value = s; }
}

マップのプロパティを取得および設定することもできます。

#{bean.value['key']}

次のようなものに支えられています:

@ManagedBean
class Bean {
    private Map<String, Boolean> kvMap;
    public boolean getValue( String key ) { return kvMap.get( key ); }
    public void setValue( String key, boolean value ) { kvMap.put( key, value ); }
}

ここまでは順調ですね。

JSF に多くの時間を費やすにつれて、再利用可能なコードのチャンクを作成しようとしていることがわかりました。<ui:composition>具体的には、.xhtmlを介して含めることができるブロック内の xhtml の小さなブロックです<ui:include>。さらに、私にとってより便利なものの多くは、入れ子になったチェックボックスのセットのようなもので (UI デザイナーはそれらに夢中です ;-)、<ui:repeat>非常に便利です。

<ui:repeat>常に、不敬な量のタイピングを使用せずに使用するために、の属性のようなものを介して、またはインラインで<ui:include>作成されたエイリアスを使用してきました。<ui:param>var<ui:repeat>

ネストされた UIComponents、特にマップ内のマップから値を取得するものをどんどん書いているため、フォームを送信するときに JSF が探す正しいセッター メソッドのシグネチャを推測するのがますます難しくなっていることがわかりました (一部の場合)。 getter を書く方が自然なように思われる理由)。

あなたの達人への私の質問は次のとおりです。

セッター署名がどのように見えるかをJSFに教えてもらう方法はありますか? JSF は通常、(読み取り専用プロパティであると考えて) getter のみに解決される式について不平を言うことはないので、私はフィードバックの欠如に苛立たしく感じます。最後にその魔法を正しく当ててください。

実行時に FacesContext... クエリを実行したり、深くネストされたプロパティの正しいセッター署名を示すクラスファイルのようなコンパイル済みの中間ファイルを調べたりするなど、何らかの手法があることを願っています。そのようなものがあれば、試行錯誤してセッターを構築する方法を見つけようとする時間を大幅に節約できると思います。

うまくいけば、私が求めていることを十分に明確に表現できていることを願っています。返信に感謝します。

4

1 に答える 1

8

あなたの質問は基本的に「セッターはMapどのように見えるべきですか?」に要約されると理解しています。.

答えは簡単です。何も必要ありません。ELはそれ自体でput()メソッドを使用しMapます。全体に getter を提供するだけで済みますMap。マップ値を取得すると、EL はそれ自体のget()メソッドを使用しMapます。これはすべて、ビルトインによって行われる舞台裏MapELResolverです。

したがって、これは次のようにする必要があります。

@ManagedBean
class Bean {
    private Map<String, Boolean> kvMap;
    public Map<String, Boolean> getValue() { return kvMap; }
}

これは、キーにピリオドが含まれていない場合#{bean.value['key']}に使用されます。#{bean.value.key}入力コンポーネントでも使用できます。

<h:selectBooleanCheckbox value="#{bean.value.key}" />

ツールに関して言えば、Eclipse 用の JBoss Tools プラグインは、通常の JavaBeans に対して優れた EL オートコンプリートをサポートしていますが、マップ キーをオートコンプリートすることはできません。さらに、Eclipse には、リストまたは既存のプロパティに基づいてゲッターとセッターと共に Bean プロパティを自動生成する独自の機能があります。

于 2012-05-15T13:07:17.143 に答える