我有一个页面,其中包含来自另一个页面的动态内容(这是通过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无法正常工作。
非常感谢任何帮助。
答案 0 :(得分:9)
您无法通过<ui:param>
传递方法表达式。它们被解释为价值表达。
你基本上有3种选择:
将bean实例和方法名称拆分为2个参数:
<ui:param name="bean" value="#{managedBean}" />
<ui:param name="method" value="someAction" />
使用大括号[]
将它们连接到标记文件中,如下所示:
<p:commandButton action="#{bean[method]}" value="Submit" />
创建一个标记处理程序,将值表达式转换为方法表达式。 JSF实用程序库OmniFaces有<o:methodParam>
这样做。在标记文件中使用如下:
<o:methodParam name="action" value="#{method}" />
<p:commandButton action="#{action}" value="Submit" />
请改用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}" />