我很难找到对此主题的支持,因为我知道如何将参数传递给模板。我想要做的是传递参数不要用作模板的参数,而是用作模板中的组件。
例如,在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并将该参数的值作为属性值放在模板中,因为可能存在许多这样的参数。
答案 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");
// ...
}