使用JSF在页面之间导航

时间:2013-05-10 08:45:43

标签: 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>

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的静态值呢?

1 个答案:

答案 0 :(得分: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文档。我并不完全知道你想要达到的目标,所以我现在不能就此问题多说些什么。

  6. 对于您当前的问题,请使用此方法(我没有测试代码):

    @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");
      }
    
    }
    

    希望这有帮助。