Передача параметров в 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 просто загружает информацию для вашего автомобиля для отображения с заданным идентификатором, уже установленным в компоненте.

Смотрите также:

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