动态ui include和commandButton

时间:2013-02-21 12:27:16

标签: jsf-2 primefaces commandbutton uiinclude

我有一个页面,其中包含来自另一个页面的动态内容(这是通过bean中的方法完成的)

firstPage.xhtml

<ui:include src="#{managedBean.pageView}">
    <ui:param name="method" value="#{managedBean.someAction}"/>
</ui:include>

这会重定向到第二个页面,该页面位于<ui:composition>内,其中包含commandButton。

secondPage.xhtml

<ui:composition>
..
..
<p:commandButton actionListener=#{method} value="Submit"/>
</ui:composition>

ManagedBean

public String pageView(){
return "secondPage.xhtml";
}

public void someAction(){
*someAction*
}

secondPage.xhtml中的commandButton无法正常工作。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:9)

您无法通过<ui:param>传递方法表达式。它们被解释为价值表达。

你基本上有3种选择:

  1. 将bean实例和方法名称拆分为2个参数:

    <ui:param name="bean" value="#{managedBean}" />
    <ui:param name="method" value="someAction" />
    

    使用大括号[]将它们连接到标记文件中,如下所示:

    <p:commandButton action="#{bean[method]}" value="Submit" />
    

  2. 创建一个标记处理程序,将值表达式转换为方法表达式。 JSF实用程序库OmniFaces<o:methodParam>这样做。在标记文件中使用如下:

    <o:methodParam name="action" value="#{method}" />
    <p:commandButton action="#{action}" value="Submit" />
    

  3. 请改用composite component。您可以使用<cc:attribute method-signature>将操作方法​​定义为属性。

    <cc:interface>
        <cc:attribute name="method" method-signature="void method()"/>
    </cc:interface>
    <cc:implementation>
        <p:commandButton action="#{cc.attrs.method}" value="Submit"/>
    </cc:implementation>
    

    使用如下:

    <my:button method="#{managedBean.someAction}" />