ダッシュボードでは、各ユーザーがいくつかの基本的な統計を見ることができます。たとえば、「最終ログイン」の日付を考えてみましょう。(ただし、表示する統計/値/設定は他にもたくさんあります)
XHTML ファイルは、次のように簡略化されています。
<h:outputText value="statisticController.lastLoginDate()" />
Bean 自体が@Inject
セッションを取得するために使用し、したがって現在のユーザーを取得します。
@Named
@RequestScoped
public StatisticController{
@Inject
private mySessionBean mySession;
@PostConstruct
private void init(){
//load stats for mySession.currentUser;
}
}
ここで、たとえば特定のロールがすべてのユーザーの値を表示できるリストを生成したいと考えています。したがって、複数のユーザーに対して StatisticController を生成する必要があるため、Session Inject を使用できなくなりました。
通常のクラスがあれば、これは大きな問題にはなりません。userEntity をコンストラクターに追加します。JSFでこれを解決するための「ベストプラクティス」は何ですか?
StatisticController を次のように変更すると:
@Named
@RequestScoped
public StatisticController{
public void init(User user){
//load stats for user;
}
}
init(user)
もちろん、手動で呼び出す必要があります。これは、XHTML ファイルのイテレーション内からどのように達成できますか?
valueLoading が実際の getter メソッドで発生するようにリファクタリングし、次のように繰り返すことができます。
<ui:repeat var="user" value="#{userDataService.getAllUsers()}">
<h:outputText value="statisticController.lastLoginDate(user)" />
...
</ui:repeat>
しかし、その後、「すべての」値を個別にロードする必要があり、これは悪いことです。
したがって、このような方法は「より良い」でしょう:
<ui:repeat var="user" value="#{userDataService.getAllUsers()}">
statisticController.init(user);
<h:outputText value="statisticController.lastLoginDate()" />
...
</ui:repeat>
しかし、これもあまり快適に見えません。このようなことをさらに行うと、ほぼ「すべての」バックエンド スタッフがレンダリング レスポンス フェーズに移動しますが、これは間違っていると感じています。
「回避策のように」感じられない方法でこれを解決する方法のアイデア/ヒントはありますか?