使用JSF在页面之间导航

oss*_*sse -2 java jsf

我想在标签内的页面之间导航,这是我的代码:

<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>
Run Code Online (Sandbox Code Playgroud)

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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图改变其他托管bean中的页面值,如下所示:

directionpage.page="/admin/gestiondesuser/createuser.xhtml";
Run Code Online (Sandbox Code Playgroud)

那么我如何才能从其他被管理的bean中更改managedbean的静态值?

Oza*_*bak 8

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

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

  2. 当您尝试从xhtml代码访问managedBean时,实际上是引用类实例,而不是类本身.JSF遵循JavaBean约定并使用实例变量的getter/setter来访问实例变量.因为你的'page'变量及其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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以改变另一个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");
  }

}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.