我希望我对JSF的理解是正确的,这一切都是有道理的。我尝试通过使用(条件)包含在页面内进行某种简单的模板化。通过选择来更新面板。
<p:outputPanel id="panel">
<h:panelGroup rendered="#{not empty someBean.selectedObject}">
<ui:include src="WEB-INF/pages/#{someBean.selectedObject.pageName}.xhtml" />
</h:panelGroup>
</p:outputPanel>
Run Code Online (Sandbox Code Playgroud)
如果我是对的,那么ui:include将在某种形式的视图准备阶段处理该rendered属性,并在页面呈现之前处理该属性。结果,我得到一个FileNotFoundException,因为它试图加载WEB-INF / pages / .xhtml。这对我来说很有意义,但是如何解决此问题而又不会出现混乱的变通办法,例如创建一个空页面作为文件名(page.xhtml)的前缀,并为应该使用此字符串实际呈现的每个页面添加前缀(pageSamplePage.xhtml) )?
我强行使用一个非常旧版本的MyFaces 2.0.5我认为,动态包含EL导致这么多问题,所以我切换到静态包含ui:fragment
<ui:fragment rendered="#{filtersPopup.filterFileName == 'checkBoxFilters'}">
checkBoxFilters
<ui:include src="/analytics/checkBoxFilters.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>
<ui:fragment rendered="#{filtersPopup.filterFileName == 'DateRelativeFilter'}">
DateRelativeFilter
<ui:include src="/analytics/DateRelativeFilter.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>
<ui:fragment rendered="#{filtersPopup.filterFileName == 'listboxFilter'}">
listboxFilter
<ui:include src="/analytics/listboxFilter.xhtml" rendered="#{filtersPopup.filter != null}"/>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)
有了它,它仍然抱怨重复的id,因为我在这些源文件的夫妇上使用相同的id.所以它似乎rendered应该是false,它仍然使它成为组件树.但重复的ID很好.我可以轻松解决这个问题,所以现在当我提交表单时,我得到了这个例外
/analytics/checkBoxFilters.xhtml at line 24 and column 118 value="#{filtersPopup.filter.groups}": Property 'groups' not found on type ListBoxFilter
Run Code Online (Sandbox Code Playgroud)
所以从异常中可以看出,它ListBoxFilter是我想要的对象,所以只包含ListBoxFilter.xhtml,但正在访问checkBoxFilters.xhtml因此错误.知道如何解决这个问题吗?