Вызвать действие в f:viewAction при навигации с помощью p:commandButton

home.xhtml

<p:button outcome="product" value="Login Simple Button"/>
<p:commandButton value="Login" action="#{homeController.validate}" update="logindialog"/>

product.xhtml

<f:metadata> <f:viewAction action="#{productController.readProductGroup}" /> </f:metadata>

Простой p: кнопка навигации и успешно вызывает readProductGroup(); но p:commandButton этого не делает, хотя метод homeController.validate() возвращает "product" и успешно переходит к product.xhtml.

С помощью кнопки p: я не могу гибко вызывать методы сервера, использовать атрибут обновления и т. Д., Что мне нужно.

Что мне нужно, чтобы иметь возможность использовать такие атрибуты, как update, action / actionListener и т. Д. В кнопке страницы home.xhtml, и в то же время при переходе к product.xhtml должна иметь возможность вызывать функцию productController.readProductGroup в f: метаданные во время загрузки страницы.

Пожалуйста, предложите.

1 ответ

Решение

<f:viewAction> предназначен для запуска по запросам GET, а не по запросам POST. Чтобы вызвать действия над запросами POST, вы должны использовать <h:commandXxx>,

Если ты действительно хочешь бежать <f:viewAction> на запросы POST тоже по какой-то причине, тогда просто установите его onPostback приписывать true,

<f:viewAction ... onPostback="true" />

С другой стороны, очень хорошо, что вы не очень понимаете идемпотентность, навигацию и GET по сравнению с POST. Навигация по POST считается плохой практикой. Вы можете применить шаблон POST-redirect-GET, отправив метод redirect в действии, добавив ?faces-redirect=true Строка запроса к результату.

public void validate() {
    // ...

    return "product?faces-redirect=true";
}

Смотрите также Как ориентироваться в JSF? Как сделать так, чтобы URL отражал текущую страницу (а не предыдущую)


Вне зависимости от конкретной проблемы, имя метода действия оставляет у меня впечатление, что вы также не знаете, как правильно использовать валидаторы JSF. В этом случае внимательно прочитайте проверку JSF 2.0 в actionListener или методе действия.

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