Вот как я реализовал область Flash на страницах, чтобы гарантировать доступность bean-компонента после перенаправления. Я использую JSF 2.1.19, поставляемый с JBoss EAP 6.
page1.xhtml
<h:commandLink value="#{result.itemVO.number}" action="#{itemBean.goToSecondPage}">
<f:setPropertyActionListener target="#{itemBean.itemVO}" value="#{result.itemVO}" />
</h:commandLink>
ItemBean.Java
Это общий компонент на обеих страницах.
public String goToSecondPage() {
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
flash.put("itemBean", this);
flash.setKeepMessages(true);
flash.keep("itemBean");
return "secondPage";
}
@PostConstruct
public void init() {
Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
ItemBean itemBean = (ItemBean) flash.get("itemBean");
//Number
itemBean.getItemVO.getNumber();
}
Объект itemBean доступен из flash в методе init после перенаправления со страницы1.
Но когда я перезагружаю страницу на странице 2, флэш-память пуста, даже если я вызываю setKeepMessages (true). Есть много полей, которые я загружаю на страницу на основе itemVO, но их нет после перезагрузки, и страница отображается пустой. Либо я хочу перехватить событие перезагрузки и прекратить рендеринг страницы, либо мне нужно найти способ сохранить объект Flash в случае перезагрузки.
Я просмотрел этот пост , чтобы сохранить объект Flash после перезагрузки, но там говорится об использовании EL. Но в моем случае мне нужно получить к нему доступ в методе bean post construct.
Я также попробовал навигационный интерфейс API для захвата события обновления в javascript, как объяснено здесь . Но это вызывается после инициализации bean-компонента, чего я хочу избежать из-за некоторых проблем с унаследованным кодом.