Можно ли вызвать setPropertyActionListener до actionListener

В настоящее время я испытываю проблему с порядком выполнения JSF.

Глядя на мой пример кода:

<p:commandButton action="update.xhtml" ajax="false"
                        icon="ui-icon-pencil"
                        actionListener="#{marketingCodeBean.initForUpdate}">
    <f:setPropertyActionListener
        target="#{marketingCodeBean.marketingCode}" value="#{code}"></f:setPropertyActionListener>
</p:commandButton>

Я хотел бы установить свойство bean, используя setPropertyActionListener, и выполнить некоторую обработку на actionListener = initForUpdate. Но последовательность выполнения JSF по умолчанию является противоположной, actionListener сначала перед setPropertyActionListener. Есть ли чистая работа для решения этой проблемы?

Я думаю, что у меня есть actionListener и передаю ему параметр bean, но я не уверен, что это лучший подход.

Ответы

Ответ 1

Это действительно ожидаемое поведение. Слушатели действий (actionListener, <f:actionListener> и <f:setPropertyActionListener>) все вызывается в том порядке, в котором они зарегистрированы на компоненте, сначала с атрибутом actionListener. Невозможно изменить порядок таким образом, кроме добавления метода actionListener в качестве <f:actionListener> (который должен ссылаться на конкретный класс реализации actionListener).

<p:commandButton ...>
    <f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
    <f:actionListener type="com.example.InitForUpdate" />
</p:commandButton>

Лучше всего использовать action вместо actionListener. Он вызывается после всех прослушивателей действий. Экшн-слушатели намерены "подготовить" действие, и использовать их для деловых действий на самом деле является плохой практикой.

<p:commandButton ... action="#{marketingCodeBean.initForUpdate}">
    <f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
</p:commandButton>

с

public String initForUpdate() {
    // ...

    return "update.xhtml";
}

См. также: