2013-02-05 17 views
5

私は、ユーザーがAndroid、iPhone、BlackBerry、または未知のブラウザ経由でアクセスできるページを持っています。私は4 rich:panelを持っています、各プラットフォームに1つ、後者は一般的なものです。他のコンポーネントがレンダリングされない場合にのみコンポーネントをレンダリングする方法はありますか?

コード:

<rich:panel id="dlAndroid" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlIphone" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlBlackberry" rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'BlackBerry')}"> 
    ... 
</rich:panel> 

<rich:panel id="dlGeneric" rendered="#{ ---> WHAT TO WRITE HERE? <--- }"> 

どのように私は他の人のどれもがレンダリングされていない場合にのみ、最後のrich:panelをレンダリングすることができますか?

+1

醜い解決策を試しましたか? fn:containsIgnoreCase(request.getHeader( 'User-Agent')、 'iPhone')、またはfn:containsIgnoreCase(request.getHeader( 'User-Agent')、 'Android')またはfn: containsIgnoreCase(request.getHeader( 'User-Agent')、 'BlackBerry'))} '' '? –

+0

@LuiggiMendoza私はこのコード行を繰り返さないようにしようとしていたので、同様の方法で試しましたが、この方法ではありません。しかし、醜いにもかかわらず、あなたのソリューションは動作します。 –

答えて

3

のようなフラグメント、あなたの質問タイトルに記載されているようにすることができます

あなたには、いくつかのモデル変数に条件をテストしている場合しかし、UIのパネルのそれぞれをラップすることをお勧めしますこの特定のケースでは、それは<c:set>でそれらの長い息切れ式をエイリアスし、おそらくよりよいです、しかし

<rich:panel binding="#{panel1}" ...> 
    ... 
</rich:panel> 
<rich:panel binding="#{panel2}" ...> 
    ... 
</rich:panel> 
<rich:panel binding="#{panel3}" ...> 
    ... 
</rich:panel> 
<rich:panel ... rendered="#{not panel1.rendered and not panel2.rendered and not panel3.rendered}"> 
    ... 
</rich:panel> 

:として答えられる

暗黙の #{header}マップでリクエストヘッダを取得するための短い方法があることをは

注意。

+0

このような文を使用することで、MVCの概念に違反するビューとビジネスロジックが混在しています。どのようにこれを正当化するのですか? –

+0

@ Krsna:ビジネスロジックのどこでも使用されていますか?その後、そこに保管してください。それは排他的にビューで使用されていますか?その後、それを守るために害を与えることはありません。 – BalusC

0

ユーザーエージェントは、第四のオプションを収まる場合、それが確認されますので、あなたは、マネージドBeanメソッドにこの検証を書くことができます。 例:

public boolean userAgentUnknownBrowser() { 
// Verify if contains the user-agent String 
} 

そして、あなたのページで、あなただけの方法で使用します:

<rich:panel id="dlGeneric" rendered="#{myBean.userAgentUnknownBrowser()}"> 
+0

ビジネスロジックを処理するためにゲッターを使うべきではありません。 –

+0

ああ、申し訳ありません。このメソッドは、別の名前を持つこともできます。 –

0

あなたは

<c:choose> 
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
<rich:panel id="dlAndroid"> 
... 
</rich:panel> 
</c:when> 
<c:when test="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'iPhone')}"> 
<rich:panel id="dlIphone"> 
... 
</rich:panel> 
</c:when> 
<c:otherwise> 
<rich:panel id="dlGeneric"> 
    ... 
</rich:panel> 
</c:otherwise> 
<c:choose> 

を使用することができますが、私はあなたが決定するためのロジックを使用していると思います同じページのPOSTSの間では変更されないブラウザータイプなので、ここでJSTLタグを使用するのは安全です。 JSTLタグは、ページのCREATE VIEW中に一度だけ実行されます。具体的に指すように

<ui:fragment rendered="#{fn:containsIgnoreCase(request.getHeader('User-Agent'), 'Android')}"> 
    <rich:panel id="dlAndroid"> 
    ... 
    </rich:panel> 
<ui:fragment> 
関連する問題