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