2012-05-05 22 views
1

JSPページをJSF(JSPコードは許可されていません)に変換しようとしていますが、問題が発生しました。 注:これは学術的なものなので、「汚い」解決策はありません。JSFの条件付き文字列連結/構築

私はさまざまな条件に応じてイメージのイメージソースと代替テキストを設定するjspコードを持っています。連結とスイッチ条件があります。これはループ内にあります。

今、私はこのように、すべての値を通過するループを再現することができます

<ui:repeat value="#{gameapi.game.fieldsList}" var="field">           
    <h:graphicImage id="field#{field.fieldNr}" styleClass="field#{field.fieldNr}" 
                  url="..." alt="" title=""/>           
    </ui:repeat> 

しかし、画像のURLと代替テキストのための20以上の組み合わせの合計があります。明らかに、条件付きでレンダリングされた、または選択されたgraphicImageタグをすべての可能性について書くことは、エレガントな解決策であるとは思えません。 ビュー、モデル、コントローラを分離するという考え方に違反するので、これらの文字列を基になるJavaコードにも作成できません。

これを行うにはどうすればよいソリューションですか?それはJSFの大きな弱点のようです。

+1

合計で20以上の組み合わせが表示されるのは間違いありません。あなたがこのロジックを_faceletに入れれば、私の考えではMVCに違反するでしょう。 –

答えて

1

MVVMパターンのバリエーションを使用することを検討してください。ビジネスロジックマネージドBeanとは別のビューロジック専用のマネージドBeanを持つことができます。

<ui:repeat value="#{bizBean.list}" var="_row"> 
    <h:graphicImage 
    url="#{viewModelBean.images[_row.outcome]}" 
    alt="#{viewModelBean.alts[_row.outcome]}" 
    title="#{viewModelBean.titles[_row.outcome]}" /> 
</ui:repeat> 

viewModelBeanマップ特性の束を持つアプリケーションスコープ型であってもよいです。これは比較的シンプルなケースを想定していますが、このパターンはより洗練された要件に適しています。

注:繰り返し制御はNamingContainerである必要があります。そのため、VDLにclient identifierを設定しようとすると冗長です。詳細については、hereを参照してください。