动态ui include和commandButton

sci*_*iFi 4 primefaces jsf-2 uiinclude commandbutton

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

firstPage.xhtml

<ui:include src="#{managedBean.pageView}">
    <ui:param name="method" value="#{managedBean.someAction}"/>
</ui:include>
Run Code Online (Sandbox Code Playgroud)

这会重定向到第二个页面,<ui:composition>其中包含commandButton.

secondPage.xhtml

<ui:composition>
..
..
<p:commandButton actionListener=#{method} value="Submit"/>
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

ManagedBean

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

public void someAction(){
*someAction*
}
Run Code Online (Sandbox Code Playgroud)

secondPage.xhtml中的commandButton不起作用.

任何帮助将不胜感激.

Bal*_*usC 10

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

你基本上有3种选择:

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

    <ui:param name="bean" value="#{managedBean}" />
    <ui:param name="method" value="someAction" />
    
    Run Code Online (Sandbox Code Playgroud)

    并使用括号表示法将它们耦合到标记文件中[],如下所示:

    <p:commandButton action="#{bean[method]}" value="Submit" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个标记处理程序,将值表达式转换为方法表达式.JSF实用程序库OmniFaces有一个<o:methodParam>这样做.在标记文件中使用如下:

    <o:methodParam name="action" value="#{method}" />
    <p:commandButton action="#{action}" value="Submit" />
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)

    使用如下:

    <my:button method="#{managedBean.someAction}" />
    
    Run Code Online (Sandbox Code Playgroud)

  • 只需通过`actionListener`更改`action`你真的需要吗?为什么你认为PrimeFaces和OmniFaces不能一起使用?OmniFaces是一个实用程序库,而不是像PrimeFaces/RichFaces这样的组件库.更重要的是,OmniFaces展示应用程序使用PrimeFaces进行UI.请注意,我提到了3个选项,其中2个不使用OmniFaces.另请注意,OmniFaces是Apache License下的开源软件. (3认同)