Передать объект между компонентами @ViewScoped без использования параметров GET

У меня есть browse.xhtml где я просматриваю список cars и я хочу посмотреть детали автомобиля в details.xhtml когда кнопка "Просмотреть больше" нажата. Их бобы @ViewScoped и называются BrowseBean а также DetailsBeanсоответственно.

Теперь я не хотел бы, чтобы пользователь / клиент видел идентификатор автомобиля в URL, поэтому я хотел бы избегать использования параметров GET, как представлено здесь и здесь.

Есть ли способ добиться этого? Я использую Mojarra 2.2.8 с PrimeFaces 5 и OmniFaces 1.8.1.

1 ответ

Решение

Зависит от того, отправляете ли вы перенаправление или просто навигацию.

Если вы отправляете перенаправление, поместите его во флеш-область:

Faces.setFlashAttribute("car", car);

Это доступно в @PostConstruct следующего боба как:

Car car = Faces.getFlashAttribute("car");

Или, если вы просто перемещаетесь, поместите его в область запроса:

Faces.setRequestAttribute("car", car);

Это доступно в @PostConstruct следующего боба как:

Car car = Faces.getRequestAttribute("car");

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

Обратите внимание, что я предполагаю, что вы очень хорошо знаете о выборе дизайна, когда у вас есть два совершенно отдельных представления, которые не могут существовать (быть идемпотентными) без другого представления, вместо того, чтобы, например, иметь одно представление с условно отображаемым содержимым. И что вы уже знаете, как именно должно вести себя представление, когда оно фактически идемпотентно запрашивается (т.е. через закладку, общую ссылку, поисковым роботом и т. Д.). Если нет, то я настоятельно рекомендую внимательно прочитать ответ на этот вопрос: как ориентироваться в JSF? Как сделать так, чтобы URL отражал текущую страницу (а не предыдущую).


Обновление: если вы не используете OmniFaces, используйте соответственно следующее:

FacesContext.getCurrentInstance().getExternalContext().getFlash().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("car");
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("car", car);
Car car = (Car) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("car");
Другие вопросы по тегам