-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 的整数总是指向“家”,但事实并非如此。任何帮助都是极好的。

编辑:

似乎即使没有注销,当两个用户(浏览器中的两个选项卡)四处导航时,如果用户 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 回答