我想在标签内的页面之间导航,这是我的代码:
<p:tabView id="tabView">
<p:tab id="tab1" title="Gestion des Utilisateur" titleStyle="titre">
<ui:include src="#{directionpage.page}" />
</p:tab>
<p:tab id="tab2" title="Gestion des Equipes">
<ui:include src="#{directionpage.page2}" />
</p:tab>
</p:tabView>
directionpage jsf托管bean有这个变量String Static page;
,我希望更改其他托管bean中的页面值以导航到其他页面。但我有这个错误:
“com.jsfmanagedbean.directionpage”类没有可读属性“page”。
这是我的jsf托管bean
package com.jsfmanagedbean;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
@SessionScoped
@ManagedBean
public class directionpage {
public static String page="/admin/gestiondesuser/usergestion.xhtml";
public static String page2="/admin/gestiondesequipe/gestiondesequipe.xhtml";
public static String getPage() {
return page;
}
public static void setPage(String page) {
directionpage.page = page;
}
public static String getPage2() {
return page2;
}
public static void setPage2(String page2) {
directionpage.page2 = page2;
}
public directionpage() {
}
}
我试图改变其他托管bean中的页面值,如下所示:
directionpage.page="/admin/gestiondesuser/createuser.xhtml";
那我怎么能从其他被管理的bean改变managedbean的静态值呢?
答案 0 :(得分:8)
您的代码存在一些严重问题:
不要使用静态变量来保存特定于用户的数据。因为当多个用户使用您的应用程序时,它们将共享相同的静态变量,因为所有静态变量都是类范围的,而不是实例范围的。现在你的代码不是线程安全的。
当您尝试从xhtml代码访问您的managedBean时,您实际上是引用类实例,而不是类本身。 JSF遵循JavaBean约定并使用实例变量的getter / setter来访问实例变量。因为你的'page'变量及其getter / setter方法是类范围的(静态的),所以JSF无法访问提到的变量。阅读JavaBean约定,再次使用静态变量。
尝试遵循提到的ojota84的Java命名约定。这是一个很好的博客:http://blog.sanaulla.info/2008/06/25/camelcase-notation-naming-convention-for-programming-languages/
如果您的托管bean没有实现Serializable接口,它会产生一些副作用。尝试使您的bean可序列化。
通过更改托管bean中的变量导航到其他页面并不是处理JSF导航的完美方式。我看到你正在使用PrimeFaces,所以我建议你先阅读JSF文档和PrimeFaces文档。我并不完全知道你想要达到的目标,所以我现在不能就此问题多说些什么。
对于您当前的问题,请使用此方法(我没有测试代码):
@SessionScoped
@ManagedBean
public class DirectionPage implements Serializable {
private String page="/admin/gestiondesuser/usergestion.xhtml";
private String page2="/admin/gestiondesequipe/gestiondesequipe.xhtml";
public String getPage() {
return page;
}
public void setPage(String page) {
this.page = page;
}
public String getPage2() {
return page2;
}
public void setPage2(String page2) {
this.page2 = page2;
}
public directionpage() {
}
}
您可以更改其他bean的值,如
@SessionScoped
@ManagedBean
public class AnotherBean implements Serializable {
@ManagedProperty("#{directionPage}")
private DirectionPage directionPage;
public void setDirectionPage(DirectionPage directionPage) {
this.directionPage = directionPage;
}
public DirectionPage getDirectionPage() {
return directionPage;
}
public void changePage() {
directionPage.setPage("whateverPage");
}
}
希望这有帮助。