如何在选定的XHTML与托管bean接口之间共享f:event of f:metadata作为参数

时间:2017-03-18 10:15:35

标签: jsf managed-bean jsf-2.3

JSF view metadata demystified注意到

  

由于此标记与当前视图元数据有关,因此它不参与   在XHTML模板中(页面作者必须确保   元素不会出现在模板或包含的页面上;它可以在一个   模板客户端),它是<f:view>的直接子项。

我有多个<f:viewParam><f:event>在许多XHTML页面中重复,而这些页面又是template.xhtml的客户端。每个f:event依赖于给定的托管bean,其中托管bean对于每个XHTML页面是不同的(但是尊重公共接口,即,对于每个相关的托管bean存在与侦听器相同的操作):

<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>部分,以便它可以“包含”并作为公共策略片段处理,特定的托管bean(满足公共接口)通过在每个XHTML页面?

1 个答案:

答案 0 :(得分:1)

我在我自己的一个旧项目中找到了答案(正如我发布的那样,我在几年前的某个阶段已经模糊地回忆起了这个问题)。这有效:

def delays[T <: Data](x: enter code hereT, n: Int): List[T] ={ assert(n>0, "Register delays require n > 0") val dx = RegInit((ZERO).asInstanceOf[T]) dx := x if (n <= 1) List(dx) else dx :: delays(dx, n-1) }

/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>