-2

我想在选项卡内的页面之间导航这是我的代码:

<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更改托管bean的静态值?

4

1 回答 1

8

您的代码有一些严重的问题:

  1. 不要使用静态变量来保存用户特定的数据。因为当多个用户使用您的应用程序时,他们将共享同一个静态变量,因为所有静态变量都是类范围的,而不是实例范围的。现在你的代码不是线程安全的。

  2. 当您尝试从 xhtml 代码访问 managedBean 时,您实际上指的是类实例,而不是类本身。JSF 遵循 JavaBean 约定并使用实例变量的 getter/setter 来访问实例变量。因为您的“页面”变量及其 getter/setter 方法是类范围的(静态),所以 JSF 无法访问提到的变量。再次阅读 JavaBean 约定,不要使用静态变量。

  3. 尝试遵循 ojota84 提到的 Java 命名约定。这是一个很好的博客:http: //blog.sanaulla.info/2008/06/25/camelcase-notation-naming-convention-for-programming-languages/

  4. 如果您的托管 bean 没有实现 Serializable 接口,它会产生一些副作用。尝试使您的 bean 可序列化。

  5. 通过更改托管 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");
  }

}

希望这可以帮助。

于 2013-05-10T10:06:12.717 回答