Передача параметров в область видимости bean в JSF

Предположим, что у меня есть две страницы в приложении JSF 2: на первой странице отображается таблица объектов (автомобили или что-то еще), а другая страница может отображать детали одного конкретного объекта. Страница таблицы находится в области запроса, потому что объекты должны быть перезагружены каждый раз, когда пользователь ее запрашивает. Страница сведений находится в области видимости. Поэтому, когда я нажимаю на объект внутри таблицы, этот объект должен отображаться на странице сведений. С переадресацией я могу перейти на страницу сведений, но страница подробностей пуста, потому что было создано новое vew. Хорошо, я могу изменить область действия на сеанс, но это приведет к другим проблемам, поэтому я хотел бы иметь страницу с подробными сведениями. Есть ли способ передать аргумент новой области видимости bean?

ОБНОВЛЕНИЕ 1

Вот фрагмент кода с первой попыткой использования параметров представления. Как прокомментировал это, это не сработает. Значение передается как параметр запроса, но на целевой странице значение равно null.

Таблица:

<h:button value="Go to details" outcome="targetPage">
     <f:param name="carId" value="This is a test" />
</h:button>

Подробная страница:

<f:metadata>
    <f:viewParam name="carId" value="#{bean.id}" />
    <f:event type="preRenderView" listener="#{bean.loadData}"/>
</f:metadata>

Bean страницы сведений:

private String id;

public String getId() {
    return id;
}

public void setId( String id ) {
    this.id = id;
}

public void loadData() {
    System.out.println( "Id: " + id );
}

ОБНОВЛЕНИЕ 2

Я нашел свою ошибку. Часть метаданных находилась внутри файла шаблона. Когда я помещаю тег в основной файл для страницы с подробной информацией, он работает. Большое вам спасибо.

Ответы

Ответ 1

Использование параметров просмотра является наиболее подходящим для вашего случая. Вам действительно не нужно выполнять REDIRECT, но простой запрос GET:

<h:button value="Go to details" outcome="carDetails">
    <f:param name="carId" value="#{currentCar.id}" />
</h:button>

Это приведет вас к следующему: carDetails.xhtml? carId = 1

После этого на странице carDetails.xhtml уловите параметр вида и загрузите информацию для этого автомобиля:

<f:metadata>
    <f:viewParam name="carId" value="#{carDetailBean.carId}" />
    <f:event type="preRenderView" listener="#{carDetailBean.loadData}"/>
</f:metadata>

Где CarDetailBean#loadData просто загружает информацию для вашего автомобиля для отображения с данным идентификатором, уже установленным в bean.

См. также: