我使用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豆類?
如果你想每次都實例化一個bean的頁面加載,然後這個bean應該是一個要求scoped.'Viewscope'就像是那個特定view.So一個'sessionscoped'豆,如果你想新的實例每次頁面加載我猜測請求範圍是唯一的選擇。 – SRy 2013-03-28 06:00:44
@SrinivasR @ @ RequestScoped'將在同一頁面上的每個請求上創建(包括ajax請求)。看起來'@ ViewScoped'將適用於此,因爲每次訪問頁面時都會創建bean:第一次訪問,第二次訪問,從不同選項卡訪問,刷新頁面等。 – 2013-03-28 13:01:55
我不明白最後一個你的問題的一部分:*如果將來我會得到一些@SESSIONSCOPE bean *。您可以在'@ RequestScoped'內注入'@ SessionScoped'管理的bean,如代碼所示,所以根本沒有問題。另外,請嘗試一個更詳盡的示例,而不僅僅是從一個頁面導航到另一個頁面,以真正看到'@ RequestScoped'和'@ ViewScoped'之間的區別。 – 2013-03-28 13:03:04