-1

タイトル自体が説明しているように、タブ メニューで現在アクティブなタブの管理に問題があります。私はPF 3.4でJSF 2.1を使用しています。タブ メニューを含むコード フラグメントを次に示します。

<h:form>
    <p:tabMenu activeIndex="#{navigationMB.activeIndex}"  >
        <p:menuitem value="Početna" action="#{navigationMB.navigateStudent('home')}" icon="ui-icon-home" />
        <p:menuitem value="Konsultacije" action="#{navigationMB.navigateStudent('konsultacije')}"  icon="ui-icon-search" />
        <p:menuitem value="Zakazivanje" action="#{navigationMB.navigateStudent('zakazivanje')}"  icon="ui-icon-document"/>
        <p:menuitem value="Profesori" action="#{navigationMB.navigateStudent('profesori')}"/>
        <p:menuitem value="Moj profil" action="#{navigationMB.navigateStudent('profil')}"  icon="ui-icon-person" />
    </p:tabMenu>
</h:form>

以下は、そのタブ メニューをナビゲートするためだけに機能するバッキング Bean のコードです。

@Named(value = "navigationMB")
@RequestScoped
public class NavigationMB {

private int activeIndex = 0;
public NavigationMB() {

}

public String navigateStudent(String page) {

    System.out.println("go to page " + page);

    if ("home".equals(page)) {
        activeIndex = 0;
        return "/student/home?faces-redirect=true";
    }
    if ("konsultacije".equals(page)) {
        activeIndex = 1;
        return "/student/allConsults?faces-redirect=true";
    }
    if ("zakazivanje".equals(page)) {
        activeIndex = 2;
        return "/student/newConsult?faces-redirect=true";
    }
    if ("profesori".equals(page)) {
        activeIndex = 3;
        return "/student/allProfessors?faces-redirect=true";
    }
    if ("profil".equals(page)) {
        activeIndex = 4;
        return "/student/profile?faces-redirect=true";
    }

    return "";
}

これはブラウジングだけでは問題なく実行されますが、ログアウト (セッションを無効化) して後で同じユーザーまたは別のユーザーで戻ると、activeIndex が記憶されます。私はここで何かを理解していませんか?ナビゲーション アクションがあるたびにリクエスト スコープ Bean が作成され、ユーザーがどこにも移動しなくても、0 に設定した整数は常に「ホーム」を指すと思いますが、そうではありません。どんな助けでも素晴らしいでしょう。

編集:

ログアウトしなくても、2 人のユーザー (ブラウザーの 2 つのタブ) が移動しているときに、ユーザー 1 がたとえばタブ メニュー項目 2 をクリックし、ユーザー 2 がページを更新すると、ユーザー 2 にはタブ メニュー項目 2 が選択されているように見えます。同様に、逆もまた同様です。

edit2: 前の編集で間違いを犯しました。上記のことは忘れてください (ユーザー 2 側で更新すると、実際にはユーザー 1 にビューが読み込まれることに気づきませんでした)。

4

1 に答える 1

0

質問のコメントで説明されているように、Bean はリクエスト スコープとして認識されません。アプリケーションの起動時に作成され、アプリケーションが実行されている限り存続します。

Spring が使用されているため、Spring アノテーションを使用すると、この問題が解決されます。

@Scope("request")
public class NavigationMB {
}

リクエスト スコープの Bean の場合、または:

@Scope("session")
public class NavigationMB {
}

セッションスコープにします。

于 2013-03-21T18:36:22.320 に答える