动态页面加载使用只初始化bean一次

问题描述:

我使用ajax和primefaces Layout动态加载页面。这是我的网页。动态页面加载使用<ui:include>只初始化bean一次

的index.xhtml

<p:layout fullPage="true"> 
      <p:layoutUnit position="north"> 
       <h1>Header</h1> 
      </p:layoutUnit> 

      <p:layoutUnit position="south"> 
       <h1>Footer</h1> 
      </p:layoutUnit> 

      <p:layoutUnit position="west"> 
       <h:form> 

        <p:menu> 
         <p:menuitem value="Page1" action="#{navigationBean.method('page1')}" 
            ajax="true" update=":main-content"/> 
         <p:menuitem value="Page2" action="#{navigationBean.method('page2')}" 
            ajax="true" update=":main-content"/> 
        </p:menu> 
       </h:form> 
      </p:layoutUnit> 

      <p:layoutUnit position="center" > 

       <h:panelGroup id="main-content"> 
        <ui:include src="#{navigationBean.page}.xhtml" /> 
       </h:panelGroup> 

      </p:layoutUnit> 
     </p:layout> 

NavigationBean.java

@ManagedBean 
@SessionScoped 
public class NavigationBean { 

    @ManagedProperty(value="page1") 
    private String page; 

public String getPage() { 
     return page; 
    } 

    public void setPage(String page) { 
     this.page = page; 
    } 

    public void method(String page){ 
     this.page = page; 
    } 
} 

page1.xhtml

<h:outputText value="#{page1Bean.text}"/> 

page2.xhtml

<h:outputText value="#{page2Bean.text}"/> 

Page1Bean.java

@ManagedBean 
@SessionScoped 
public class Page1Bean { 

    private String text; 

    @PostConstruct 
    public void init() 
    { 
     System.out.println("\nPage1Bean @PostConstruct");; 
    } 

    public Page1Bean() { 
     text = "Page 1 BEan Text Variable"; 
     System.out.println("Page1Bean Constructor"); 
    } 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

} 

Page2Bean.java类似于Page1Bean.java。 代码工作正常,动态加载页面并使用ajax。 但问题是@PostConstruct和Page1Bean和Page2Bean的构造函数只被调用一次。 我的意思是这些方法在页面第一次加载时被调用。 但是当第二次加载页面时不会再次调用它们。 所以如果有人以前做过或以前见过请请帮助我如何处理这种情况。

编辑:我已经在Page1Bean和Page2Bean基础上尝试过@Viewscope基于Luiggi门多萨的想法,但仍然没有运气。 它的工作原理GOOD for @REQUESTSCOPE(感谢Luiggi Mendoza),但如果将来我得到一些@SESSIONSCOPE豆类?

+0

如果你想每次都实例化一个bean的页面加载,然后这个bean应该是一个要求scoped.'Viewscope'就像是那个特定view.So一个'sessionscoped'豆,如果你想新的实例每次页面加载我猜测请求范围是唯一的选择。 – SRy 2013-03-28 06:00:44

+1

@SrinivasR @ @ RequestScoped'将在同一页面上的每个请求上创建(包括ajax请求)。看起来'@ ViewScoped'将适用于此,因为每次访问页面时都会创建bean:第一次访问,第二次访问,从不同选项卡访问,刷新页面等。 – 2013-03-28 13:01:55

+0

我不明白最后一个你的问题的一部分:*如果将来我会得到一些@SESSIONSCOPE bean *。您可以在'@ RequestScoped'内注入'@ SessionScoped'管理的bean,如代码所示,所以根本没有问题。另外,请尝试一个更详尽的示例,而不仅仅是从一个页面导航到另一个页面,以真正看到'@ RequestScoped'和'@ ViewScoped'之间的区别。 – 2013-03-28 13:03:04

将范围从@SessionScoped更改为更窄的范围,如@ViewScoped@RequestScoped。对于这种情况,@ViewScoped似乎符合您的目的。

BalusC在他的博客文章Communication in JSF 2: Managed Bean Scopes中解释了每个JSF托管bean范围的详细信息。