正如标题本身所解释的那样,我在选项卡菜单中管理当前活动的标签时遇到问题。我正在使用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)。
答案 0 :(得分:0)
正如问题的评论中所讨论的那样,bean不被识别为请求作用域。它是在应用程序启动期间创建的,只要应用程序正在运行,它就会存在。
使用Spring时,使用Spring注释将解决此问题:
@Scope("request")
public class NavigationMB {
}
对于请求范围的bean,或:
@Scope("session")
public class NavigationMB {
}
使其成为会话范围。