将参数作为参数传递给JSF 2.0中的模板

时间:2012-02-17 09:32:30

标签: templates jsf-2 primefaces facelets

我很难找到对此主题的支持,因为我知道如何将参数传递给模板。我想要做的是传递参数不要用作模板的参数,而是用作模板中的组件。

例如,在primefaces中,您可以编写以下逻辑来创建按钮:

<p:commandButton action="#{printBean.print}">
  <f:attribute name="report" value="report.jrxml" />
</p:commandButton>

当我不需要传递参数时,这一切都很好。但是,我需要构建一个模板,允许我指定要动态传递给报表的参数。我的第一次尝试是做以下事情:

<p:commandButton actionListener="#{printBean.print}">
  <f:attribute name="report" value="report.jrxml" />
  <ui:insert name="reportParams" />
</p:commandButton>

这将允许我以下列方式使用模板:

<ui:decorate template="templates/report.xhtml" >
  <ui:define name="reportParams>
    <f:attribute name="reportParam1" value="paramVal1" />
    <f:attribute name="reportParam2" value="paramVal2" />
    <f:attribute name="reportParam3" value="paramVal3" />        
    ...
  </ui:define>
</ui:decorate>

然而,在printBean的动作监听器中没有收到以这种方式传递的参数,而参数&#34; report&#34>是。我认为以这种方式传递的属性被解释为它指的是ui:define标签,而不是像我希望的那样插入模板中。

是否有另一种方法可以达到同样的目的?请记住,我使用的是JSF 2.0和primefaces,但不是Seam或任何添加的库,理想情况下我不需要添加任何库来使其工作。

如果对这个问题的答案已经存在,我很抱歉,但是却很难找到这个问题的答案。

编辑:参数的数量是可变的,这意味着我不能简单地使用ui:param并将该参数的值作为属性值放在模板中,因为可能存在许多这样的参数。

1 个答案:

答案 0 :(得分:3)

使用composite component代替模板。

创建此文件/resources/mycomponents/printReport.xhtml

<ui:component
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:cc="http://java.sun.com/jsf/composite"
    xmlns:p="http://primefaces.org/ui"
>
    <cc:interface>
        <!-- No attributes. -->
    </cc:interface>
    <cc:implementation>
        ...
        <p:commandButton value="Print" action="#{printBean.print}" />
        ...
    </cc:implementation>
</ui:component>

按如下方式使用:

xmlns:my="http://java.sun.com/jsf/composite/mycomponents"
...
<my:printReport>
    <f:attribute name="reportParam1" value="paramVal1" />
    <f:attribute name="reportParam2" value="paramVal2" />
    <f:attribute name="reportParam3" value="paramVal3" />
</my:printReport>

重写print方法,如下所示:

public void print() {
    UIComponent composite = UIComponent.getCurrentCompositeComponent(FacesContext.getCurrentInstance());
    String reportParam1 = (String) composite.getAttributes().get("reportParam1");
    String reportParam2 = (String) composite.getAttributes().get("reportParam2");
    String reportParam3 = (String) composite.getAttributes().get("reportParam3");
    // ...
}