0

JSFテンプレートにメニューを表示したい。私のアプリケーションのすべてのユーザーには異なるメニューがあり、メニューはデータベースに保存されています。ここに私のコードがあります、

MenuBean.java

public List<Menuitem> getUserMenu() {
    List<Menuitem> menuitems = (List<Menuitem>) em.createQuery("_____________").setParameter("_______", _______).getResultList();
    return menuitems;
}

pageTemplate.xhtml

<div class="container">
    <div id="navigation">
        <ul>
            <ui:repeat var="_item" value="#{menuitemBean.userMenu}">
                <li><h:outputLink value="#{_item.url}">
                        <h:outputText value="#{_item.name}" />
                    </h:outputLink></li>
            </ui:repeat>
        </ul>
    </div>

    <div id="content">
        <h1>
            <ui:insert name="header" />
        </h1>
        <h2>
            <ui:insert name="subheader" />
        </h2>

        <ui:insert name="main" />
    </div>
</div>

問題は、同じテンプレート (pageTemplate.xhtml) を使用している新しいページ (.xhtml ファイル) に移動するたびに、メニューが再度読み込まれることです。

ユーザーごとに 1 回だけメニューをロードするにはどうすればよいですか。

4

2 に答える 2

4

メニューがユーザーに依存する場合は、sessionこのメニューのコンテンツを格納するスコープを持つ Bean を作成することをお勧めします。この方法では、メニューが最初に初期化されると、再初期化されません。コードは次のようになります。

public class MySessionBean ... {

    private List<Menuitem> menuItems = null;

    public List<Menuitem> getUserMenu() {
        if (menuItems == null) {
            // Initialize the menu items.
            menuItems = ...;
        }
        return menuitems;
    }

コンストラクターまたはメソッド (つまり、Bean がインスタンス化された直後に呼び出されるメソッド)menuItemsでオブジェクトを初期化することもできることに注意してください。post-construct

重要なことも: Bean にデータベース アクセス コードを入れないでください (あなたのem.createQuery(...))。それをサービス/DAOレイヤーに移動し、Beanにサービスを呼び出して、メニュー項目の構築に必要な情報を取得させます。

于 2013-01-29T11:27:39.537 に答える
2

データベースにアクセスするロジックを getter メソッドに配置しないでください。これらのロジックは同じ request で複数回呼び出されることが多いためです。

ユーザーごとに 1 回メニューをロードするには、プロパティを@SessionScopedバッキング Bean に配置し、@PostConstruct注釈付きメソッドで初期化します。

@SessionScoped
public SomeBean {
    private List<Menuitem> menuItems;

    @PostConstruct
    public void init() {
        menuItems = (List<Menuitem>) em.createQuery("_____________")
                           .setParameter("_______", _______).getResultList();
    }
    // getter and setter for menuItems
}

Bean はセッション スコープ内にあるため、アプリケーション内のユーザー セッションごとに 1 つのインスタンスとして存在します。

タグを付けたので、JSF 2 を使用していると仮定したことに注意してください。

于 2013-01-29T11:28:33.860 に答える