4

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

第一页.xhtml

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

这将重定向到第二个页面,<ui:composition>其中包含命令按钮。

第二页.xhtml

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

托管豆

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

public void someAction(){
*someAction*
}

secondPage.xhtml 中的 commandButton 不起作用。

任何帮助将不胜感激。

4

1 回答 1

10

您不能通过<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. 请改用复合组件。您可以使用<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}" />
    
于 2013-02-21T12:47:25.133 回答