2

クエリ文字列の有無に基づいて、いくつかのコンポジション/テンプレートを動的にレンダリングしようとしています。例えば:

ローカルホスト:9080/myWonderfulApp/test.xhtml?foo=bar

これは機能し、A.xhtml が取り込まれます。

ローカルホスト:9080/myWonderfulApp/test.xhtml

これは機能しません。B.xhtml は取り込まれません。

クエリ文字列部分がないという問題があります。?foo=bar を渡すと A.xhtml をレンダリングできますが、クエリ文字列がない場合は B.xhtml をレンダリングできないようです。いくつかのバリエーションを試してみましたが、最初は #{param['foo'] != 'bar' が機能すると考えていましたが、foo クエリ パラメータがまったくないため、機能していないと思います。param == null かどうかを確認しようとしましたが、それもうまくいきませんでした。

NO クエリ文字列に基づいてレンダリングされた属性を設定することは可能ですか?

B.xhtml に別のクエリ文字列を設定することはできません。これは、2 つの異なるスキンを取得するレガシー アプリに取り組んでいるためです。そのため、リンクするすべての古いアプリを改造することはできません。新しいアプリはクエリ文字列を使用し、古いアプリはクエリ文字列なしでリンクする古いスキンを取得する必要があります。

<!--This works-->
<h:panelGrid rendered="#{param['foo'] == 'bar' ? true : false}">
    <ui:composition template="A.xhtml">...</ui:composition>
</h:panelGrid>

<!--This doesn't work-->
<h:panelGrid rendered="#{param == null ? true : false}">
    <ui:composition template="B.xhtml">...</ui:composition>
</h:panelGrid>

これもうまくいかないようです:

<h:panelGrid rendered="#{empty facesContext.externalContext.requestParameterMap.foo ? true : false}">
4

1 に答える 1

1

逆条件が必要なだけです: #{param.foo != 'bar'}. ブール値を返す条件演算子は不要です。方程式自体はすでにブール値を返します。は#{param}決してありませんnullパラメーターが含まれていない場合は、空の( ! ではない)Map<String, String>を返します。中括弧表記は、パラメータ名にピリオドが含まれている場合にのみ役立ちます。ピリオドが含まれていないとネストされたプロパティとして解釈されますが、リクエスト パラメータ名にはピリオドを含めないでください。null

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

<h:panelGrid rendered="#{param.foo == 'bar'}">
    <ui:composition template="A.xhtml">...</ui:composition>
</h:panelGrid>

<h:panelGrid rendered="#{param.foo != 'bar'}">
    <ui:composition template="B.xhtml">...</ui:composition>
</h:panelGrid>

別の方法として、条件演算子を正しい方法で使用したい場合は、次のこともできます。

<ui:composition template="#{param.foo == 'bar' ? 'A' : 'B'}.xhtml">...</ui:composition>
于 2012-03-23T01:45:32.673 に答える