2017-02-07 4 views
1

< ui:repeat >というタグで反復処理されているオブジェクトのリストがあり、ユーザーにはすべてのオブジェクトのアクションリストがありますが、その権限に応じてユーザーに許可がないため、これらの操作は無効になります。JSFページで変数を定義する

<ui:repeat var="item" value="#{myBean.selectedItems}"> 

    <h1>#{item.name}</h1>   

    <h:commandButton value="Edit" disabled="#{myBean.getPermissions(item, user).has('EDIT') .../> 
    <h:commandButton value="Move" disabled="#{myBean.getPermissions(item, user).has('MOVE') .../> 
    <h:commandButton value="Copy" disabled="#{myBean.getPermissions(item, user).has('COPY') .../> 
    <h:commandButton value="Delete" disabled="#{myBean.getPermissions(item, user).has('DELETE') .../> 
    <h:commandButton value="Rotate" disabled="#{myBean.getPermissions(item, user).has('ROTATE') .../> 


</ui:repeat> 

ので[)myBean.getPermissions(]アクセス許可を取得するために、操作を言うことができますが、非常に高価であり、私はそれは一つのアイテムに対して複数回実行する必要はありません。

JSF/ELでこれを実現するにはどうすればよいですか?

私は< UIを使用としましょう:このようなPARAM >:

<ui:repeat var="item" value="#{myBean.selectedItems}"> 

    <h1>#{item.name}</h1>   

    <ui:param name="itemPermissions" value="#{myBean.getPermissions(item, user)"/> 

    <h:commandButton value="Edit" disabled="#{itemPermissions.has('EDIT') .../> 
    <h:commandButton value="Move" disabled="#{itemPermissions.has('MOVE') .../> 
    <h:commandButton value="Copy" disabled="#{itemPermissions.has('COPY') .../> 
    <h:commandButton value="Delete" disabled="#{itemPermissions.has('DELETE') .../> 
    <h:commandButton value="Rotate" disabled="#{itemPermissions.has('ROTATE') .../> 


</ui:repeat> 

しかし、これまで私が理解として、< UI-PARAM >は単なるショートカットで、それが関連付けられている実際の値をキャッシュしません値式は使用するたびに再評価されますか?これは正しいです?

他に何ができますか? < c:>は、ビュービルド時にのみ設定されるため、オプションではありません。

唯一のオプションは、Bean変数内で手動でアクセス許可をキャッシュし、そのBeanを使用して再びアクセスすることです。 JSF/ELには、(通常のJavaメソッドのような)変数を定義して、値を設定して後で値を読み取ることができるメカニズムはありませんか?

レンダリングされた= ".."またはdisabled = ".."は時々複数回呼び出されるので、式はタグごとに1回評価されるだけでなく、場合によっては2~3回評価されることに気付きました。これは正しい観察ですか、これはなぜですか?

ご回答いただきありがとうございます。

編集: BalusCは、質問の重複としてそれをマークしたが、私は< cと、その答えを見つけられませんでした。私の場合はそこに動作しないお勧めします>を設定します。または、それは不可能であり、私がキャッシュしたい場合、例えば、私は自分のために豆でそれをしなければならないのですか?

+0

私は尋ねる前に私の研究でその質問を見つけましたが、質問で答えることはありません。< c:set >が推奨されていました。 ui-repeat内では、ui-paramは値をキャッシュしません(ただし、より複雑な式へのショートカットに過ぎません)。したがって、Beanに手動で値をキャッシュするか、Beanメソッドを使用する以外に、EL/JSFにはそれを実現するための一般的なメカニズムはありません。要求スコープ内に変数として入れる? – deconstruct

+0

「ユーザー」はどこから来たのですか?単一のユーザしかいないでしょうか(おそらくログインしているでしょうか?) – Gimby

+0

ユーザオブジェクトは現在ログインしているユーザです(セッションスコープBeanからフェッチされます)。getPermissions()メソッドは、指定された項目のデータベースからユーザーの権限を取得します。この権限は基本的にJava Mapオブジェクトです。私はこのマップを何らかの変数に格納したいので、ui-repeatの中で再度フェッチする必要はありません。もちろん私のBeanにマップを手動でキャッシュすることもできますが、より一般的なソリューションがない場合は疑問に思っています。これは非常に一般的な問題だと思うので、JSF/ELに組み込みのソリューションがあると思います。 – deconstruct

答えて

0

通常、ユーザ/ロールの権限はログイン時にユーザセッション情報と共に保存されるため、DBをもう呼び出す必要はありません。

セッションを使用している場合、これは...ほんの数認証/承認の枠組みに名前を付けるためには、Apache史朗と春のセキュリティがどのように動作するか

では、ユーザーを保存するためにBeanをスコープ、あなただけ保存するためにそれを使用することができますその許可も同様に...

+0

権限はいつでも変更できるので、ログイン中にセッションに保存することはできません。しかしそれはほんの一例です、私が述べた問題はそれとは関係ありません。 – deconstruct