Как поделиться некоторым f: событием f: метаданных между выбранным XHTML с интерфейсом управляемого компонента в качестве параметра

Отмечая, что из Демистификация метаданных представления JSF:

Поскольку этот тег относится к метаданным текущего представления, он не участвует в шаблонах XHTML (автор страницы должен убедиться, что элемент не отображается в шаблоне или включенной странице; он может быть в клиенте шаблона) и является прямым потомком <f:view> .

У меня есть несколько <f:viewParam> и <f:event>, которые повторяются на многих XHTML-страницах, которые, в свою очередь, являются клиентами template.xhtml. Каждый f:event зависит от данного управляемого компонента, причем управляемый компонент отличается для каждой XHTML-страницы (но учитывает общий интерфейс, т. е. одни и те же операции для слушателей существуют для каждого соответствующего управляемого компонента):

<f:view>
    <f:metadata>

        <!-- I want to share this across many XHTML parametrised by the bean -->
        <f:viewParam name="id" value="#{particularBean.id}"/>
        <f:event type="preRenderView" listener="#{particularBean.opCommon1}"/>
        <f:event type="preRenderView" listener="#{particularBean.opCommon2}"/>
        <!-- END SHARED PORTION -->

        <f:event type="preRenderView" listener="#{particularBean.onlyForMe}"/>

    </f:metadata>
</f:view>

<ui:composition template="/template.xhtml">

В: Как я могу инкапсулировать общие части <f:viewParam> и <f:event>, чтобы их можно было «включить» и рассматривать как общий фрагмент политики с определенными управляемыми компонентами (соответствующими общему интерфейсу), передаваемыми для каждой XHTML-страницы?


person Webel IT Australia - upvoter    schedule 18.03.2017    source источник


Ответы (1)


Я нашел ответ в одном из своих старых проектов (когда я писал, я смутно помнил, что исследовал это уже на каком-то этапе несколько лет назад). Это работает:

In /include/shared.xhtml:

<ui:composition 
 xmlns="http://www.w3.org/1999/xhtml"
 xmlns:f="http://xmlns.jcp.org/jsf/core"
 xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
 >
    <f:viewParam name="id" value="#{particularBean.id}"/>
    <f:event type="preRenderView" listener="#{compatibleBean.opCommon1}"/>
    <f:event type="preRenderView" listener="#{compatibleBean.opCommon2}"/>
</ui:composition>

И в любом клиенте:

<f:view>
 <f:metadata>

  <ui:include src="/included/shared.xhtml">
    <ui:param name="compatibleBean" value="#{particularBean}"/>
  </ui:include>

  <f:event type="preRenderView" listener="#{particularBean.onlyForMe}"/>

 </f:metadata>
</f:view>
person Webel IT Australia - upvoter    schedule 14.04.2017