Динамический интерфейс включает и commandButton

У меня есть страница, которая динамически включает в себя содержимое с другой страницы (это делается с помощью метода в компоненте)

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*
}

CommandButton в secondPage.xhtml не работает.

Любая помощь будет высоко ценится.

1 ответ

Решение

Вы не можете передавать выражения метода через <ui:param>, Они интерпретируются как выражение значения.

У вас есть в основном 3 варианта:

  1. Разделите экземпляр компонента и имя метода на 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}" />
    
Другие вопросы по тегам