动态页面加载使用只初始化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豆类?
答
将范围从@SessionScoped
更改为更窄的范围,如@ViewScoped
或@RequestScoped
。对于这种情况,@ViewScoped
似乎符合您的目的。
BalusC在他的博客文章Communication in JSF 2: Managed Bean Scopes中解释了每个JSF托管bean范围的详细信息。
如果你想每次都实例化一个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