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

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

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

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

Ответ 1

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

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

Faces.setFlashAttribute("car", car);

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

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

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

Faces.setRequestAttribute("car", car);

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

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

См. также:

Обратите внимание, что я предполагаю, что вы хорошо знаете о выборе дизайна из двух совершенно разных представлений, которые не могут существовать (быть идемпотентными) без другого представления, вместо того, чтобы иметь, например, один вид с условно визуализированным контентом. И что вы уже знаете, как должно выглядеть представление, когда оно действительно запрашивается idempotently (т.е. Через закладку, общую ссылку, поисковым роботом и т.д.). Если нет, то я настоятельно рекомендую внимательно прочитать ответ на этот вопрос: Как перемещаться в 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");