Несколько actionlisteners в JSF

Я хочу использовать слушатель множественных действий, чтобы установить состояние двух базовых компонентов перед дальнейшей обработкой

1-й способ:

<p:commandButton process="@this" >
   <f:attribute name="key" value="#{node.getIdTestGroup()}" />
   <f:actionListener binding="#{testController.nodeListener}" />
<f:actionListener binding="#{testDeviceGroupController.prepareCreate}" />
</p:commandButton>

Это дает исключение:

ВНИМАНИЕ: /testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": метод nodeListener не найден javax.el.ELException: /testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": метод nodeListener не найден

2-й способ:

<p:commandButton process="@this" >
    <f:attribute name="key" value="#{node.getIdTestGroup()}" />
    <f:actionListener binding="#{testController.nodeListener(event)}" />
    <f:actionListener binding="#{testDeviceGroupController.prepareCreate(event)}" />
</p:commandButton>

Событие равно null в методах nodeListener и prepareCreate

Как это сделать правильно?

2 ответа

Решение

Я вижу, вы облегчаете традиционный подход " угадай, как это работает, используя голые интуитивные и случайные ассоциации, а затем действуй удивлен":-)

f:actionListener позволяет только добавить весь объект в качестве наблюдателя, а не произвольный метод. Вы можете использовать type атрибут для указания имени класса (будет создан JSF) или binding атрибут, чтобы дать экземпляр объекта, который вы создали сами (не метод!). Объект должен реализовать javax.faces.event.ActionListener,

Твоя вторая попытка (testDeviceGroupController.prepareCreate(event)) неверно на многих уровнях, но суть в том, что методы вызываются не для обработки ваших действий, а для создания Actionlistener пример.

У вас есть несколько вариантов:

  • самый разумный: просто создайте метод, который вызывает каждый из целевых методов. Поскольку они находятся на разных бобах, вы можете вводить одно в другое.
  • если это не работает для вас, вы можете создать метод, который создает объект слушателя.

Как это:

public ActionListener createActionListener() {
    return new ActionListener() {
        @Override
        public void processAction(ActionEvent event) throws AbortProcessingException {
            System.out.println("here I have both the event object, and access to the enclosing bean");
        }
    };
}

и используйте это так:

<h:commandButton>
    <f:actionListener binding="#{whateverBean.createActionListener()}"/>            
</h:commandButton>

binding значение атрибута должно указывать на реализацию объекта ActionListener интерфейс, а не метод.

Из документации f:actionListener"s bindig атрибут:

Выражение привязки значения, которое оценивает объект, который реализует javax.faces.event.ActionListener.

Подобная проблема обсуждалась здесь.

Другие вопросы по тегам