你好,
我将ui:include
置于h:panelGroup
内并在需要时动态呈现它。
通常的假设和理论是,当未呈现ui:include
时,与包含页面关联的ManagedBean不应被初始化。
当我在包含的页面中使用ui:repeat
时,不会发生这种情况。
以下是重复问题的示例:
page.1.xhtml
<h:body>
<h:form>
<p:outputLabel value="#{mBeanOne.beanOnetxt}"/><br/>
</h:form>
<h:panelGroup rendered="false" layout="block">
<ui:include src="page2.xhtml"/>
</h:panelGroup>
</h:body>
MBeanOne.java
@ManagedBean
@ViewScoped
public class MBeanOne implements Serializable{
private String beanOnetxt;
public MBeanOne() {
System.out.println("MBeanOne - Constructor");
}
@PostConstruct
public void init(){
beanOnetxt = "This is Managed Bean 1";
System.out.println("MBeanOne - Postconstruct");
}
//SETTERS and GETTERS
}
page2.xhtml
<h:body>
<h:outputText value="#{mBeanTwo.beanTwotxt}"/><br/>
<ui:repeat var="var" value="#{mBeanTwo.versionList}">
<h:outputText value="#{var}"/><br/>
</ui:repeat>
</h:body>
MBeanTwo.java
@ManagedBean
@ViewScoped
public class MBeanTwo implements Serializable{
private String beanTwotxt;
private List<String> versionList;
public MBeanTwo() {
System.out.println("MBeanTwo - Constructor");
}
@PostConstruct
public void init(){
beanTwotxt = "This is Managed Bean 2";
versionList = new ArrayList<String>();
versionList.add("Playground");
versionList.add("Kestrel");
versionList.add("Merlin");
versionList.add("Tiger");
System.out.println("MBeanTwo - Postconstruct");
}
//SETTER and GETTER
}
正如您在page1.xhtml
中看到的那样,rendered="false"
使用了h:paneGroup
来封装ui:include
,但是MBeanTwo
在我加载时page1.xhtml
正在初始化{{} 1}}。
如果我从ui:repeat
移除page2.xhtml
,则MBeanTwo
未初始化。
这是JSF中的错误,如果有的话可以使用任何解决方法吗?
使用和测试的版本:
Primefaces 3.5
JSF 2.1.13和2.2.0-m05
答案 0 :(得分:1)
<ui:include />
篇与您的问题无关,可能是在同一视图中以相同行为完成的所有内容。
无论如何,在进行bean初始化之前,似乎<ui:repeat />
标签没有检查其父项rendered
属性。但是,永远不会评估mBeanTwo#getVersionList
方法,只创建托管bean。如果在构造bean时执行数据访问,这可能会使您减速,但永远不应该破坏您的视图。我能够在Mojarra 2.1.x版本中重现这个问题,但他们已经修复了2.2.x最新的未成年人。
似乎是一个Mojarra实现错误,而不是预期的行为。
另见: