Как сохранить параметры области видимости JSF при перезагрузке страницы?

Я использую flash scope для передачи объекта настройки между контроллерами @viewscoped. Но если я произвожу перезагрузку страницы на одном из них, то карта флэш-памяти пуста и объект настройки не инициализируется. Можно ли сохранить объем флеш-памяти при перезагрузке страницы?

Мой исходный код для сохранения / получения настроек:

FistPage.xhtml

...
<p:commandButton value="next"
    action="#{firstPageController.transferConfig}"  
    process="@this" />
...

FirstPageController.java

@ManagedBean(name = "firstPageController")
@ViewScoped
public class FirstPageController {
...
public String transferConfig() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("searchConfig",   searchConfig);
return "/secondPage.xhtml?faces-redirect=true";
}
...
}

SecondPage.xhtml

...
<h:outputLabel value="value">
    <f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...

SecondPageController.java

@ManagedBean(name = "secondPageController")
@ViewScoped
public class SecondPageController {
    ...
    public void onPageLoad() 
    {
        flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();

        searchConfig = ((SearchFilterConfig) flash.get("searchConfig"));

        flash.putNow("searchConfig", searchConfig);

        flash.keep("searchConfig");
    }
    ...
}

Я использую Мохарру 2.1.29

Спасибо

1 ответ

Я только что провел несколько тестов в своем игровом проекте и понял, что на самом деле можно сохранить состояние параметров вспышки, даже если вы снова получаете страницу, используя {flash.keep}, Вот как это объясняют документы JSF:

Реализация должна обеспечивать сохранение правильного поведения флэш-памяти даже в случае <navigation-case> который содержит <redirect />, Реализация должна гарантировать, что надлежащее поведение флэш-памяти сохраняется даже в случае смежных запросов GET в одном сеансе. Это позволяет приложениям Faces полностью использовать шаблон проектирования Post/Redirect/Get.

Здесь у вас есть хороший базовый тестовый пример:

page1.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head />
<h:body>
    <h:form>
        <h:button id="nextButton" value="Next (button)" outcome="page2.xhtml" />
        <c:set target="#{flash}" property="foo" value="bar" />
    </h:form>
</h:body>
</html>

page2.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<head />
<body>foo = #{flash.keep.foo}
</body>
</html>

Просто откройте первую страницу и нажмите на кнопку, которая перенаправит вас на вторую. Затем обновите вторую страницу столько раз, сколько захотите, и вы увидите, что параметр сохраняется.


Протестировано в Моджарре 2.2.6

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