Передача параметров в bean-объект вида в JSF
Давайте представим, что у меня есть две страницы в моем приложении JSF 2: первая страница отображает таблицу объектов (автомобили или что-то еще), а другая страница может отображать детали одного конкретного объекта. Страница таблицы находится в области запроса, потому что объекты должны перезагружаться каждый раз, когда пользователь запрашивает ее. Страница сведений находится в поле зрения. Поэтому, когда я нажимаю на объект внутри таблицы, этот объект должен отображаться на странице сведений. С перенаправлением я могу перейти на страницу сведений, но страница сведений пуста, потому что был создан новый vew. Хорошо, я мог бы изменить область действия на сеанс, но это привело бы к другим проблемам, поэтому я хотел бы иметь страницу подробностей в области видимости. Есть ли способ передачи аргумента в недавно сгенерированный bean-объект области видимости?
ОБНОВЛЕНИЕ 1
Вот фрагмент кода с первой попыткой использования параметров просмотра. Как прокомментировал это не работает. Значение передается как параметр запроса, но на целевой странице значение равно нулю.
Страница таблицы:
<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>
Страница с подробностями:
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 перехватите параметр view и загрузите информацию для этого автомобиля:
<f:metadata>
<f:viewParam name="carId" value="#{carDetailBean.carId}" />
<f:event type="preRenderView" listener="#{carDetailBean.loadData}"/>
</f:metadata>
куда CarDetailBean#loadData
просто загружает информацию для вашего автомобиля для отображения с заданным идентификатором, уже установленным в компоненте.
Смотрите также: