2013-03-28 36 views
0

我使用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

回答

1

將範圍從@SessionScoped更改爲更窄的範圍,如@ViewScoped@RequestScoped。對於這種情況,@ViewScoped似乎符合您的目的。

BalusC在他的博客文章Communication in JSF 2: Managed Bean Scopes中解釋了每個JSF託管bean範圍的詳細信息。