0

ダッシュボードでは、各ユーザーがいくつかの基本的な統計を見ることができます。たとえば、「最終ログイン」の日付を考えてみましょう。(ただし、表示する統計/値/設定は他にもたくさんあります)

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>

しかし、これもあまり快適に見えません。このようなことをさらに行うと、ほぼ「すべての」バックエンド スタッフがレンダリング レスポンス フェーズに移動しますが、これは間違っていると感じています。

「回避策のように」感じられない方法でこれを解決する方法のアイデア/ヒントはありますか?

4

2 に答える 2

2

それらのモデルをラップする新しいモデルを作成します。

public class UserStatistics {

    private User user;
    private Statistics statistics;

    // ...
}

たとえば、使用できるように

public class UserStatisticsBacking {

    private List<UserStatistics> list;

    @EJB
    private UserService userService;

    @EJB
    private StatisticsService statisticsService;

    @PostConstruct
    public void init() {
        list = new ArrayList<UserStatistics>();

        for (User user : userService.list()) {
            list.add(new UserStatistics(user, statisticsService.get(user)));
        }
    }

    // ...
}

(ただし、新しいもので実行する方がよいでしょうUserStatisticsService

<ui:repeat value="#{userStatisticsBacking.list}" var="userStatistics">
    <h:outputText value="#{userStatistics.user.name}" />
    <h:outputText value="#{userStatistics.statistics.lastLoginDate}" />
    ...
</ui:repeat>
于 2013-04-10T12:22:04.033 に答える
0

BalusC によって提案されたラップされたモデルを使用する代わりに、モデル データを含む 2 つの個別のリストを保存することができます。このアプローチでは、変更を導入する必要はありません。

このルートに従って、1 つのリストを反復処理し<ui:repeat>、両方のリストのサイズが等しいことを確認して、2 番目のリスト要素をインデックスで取得します。これvarStatusは、反復ステータス変数をエクスポートする属性を介して利用できます。

<ui:param name="stats" value="#{bean.stats}/>
<ui:repeat value="#{bean.users}" var="user" varStatus="status">
    <h:outputText value="#{user}/>
    <h:outputText value="#{stats[status.index]}/>
</ui:include>

リストの作成は、PostConstructメソッドで事前に行うことができます。

private List<User> users;
private List<Statistic> stats;

@PostConstruct
public void init() {
    users = userService.list();
    stats = statService.list();
}
于 2013-04-10T17:03:52.603 に答える