Передача параметров в область видимости 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.
См. также: