在注销时记住Primefaces TabMenu活动选项卡

时间:2013-03-21 12:08:47

标签: java jsf primefaces

正如标题本身所解释的那样,我在选项卡菜单中管理当前活动的标签时遇到问题。我正在使用JSF 2.1 w / PF 3.4。以下是带有选项卡菜单的代码片段:

<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的整数也总是指向“home”但它没有。 任何帮助都会很棒。

编辑:

似乎即使没有注销,当两个用户(浏览器中的两个选项卡)导航时,如果用户1点击,例如,选项卡菜单项2,并且用户2刷新他的页面,则用户2将看到选项卡菜单项目2也被选中,反之亦然。

edit2:我在上一次编辑中犯了一个错误,请忘记上面的内容(我没注意到用户2侧的刷新实际上是用他的视图加载用户1)。

1 个答案:

答案 0 :(得分:0)

正如问题的评论中所讨论的那样,bean不被识别为请求作用域。它是在应用程序启动期间创建的,只要应用程序正在运行,它就会存在。

使用Spring时,使用Spring注释将解决此问题:

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

对于请求范围的bean,或:

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

使其成为会话范围。

相关问题