Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > [JSF]@ViewScoped как пережить обновление страницы


Автор: cuvorov 4.7.2012, 20:18
Добрый день.
Есть JSF страница которая обслуживается @ViewScoped бином. На странице есть календарь на котором можно, выставить временной диапазон. Диапаазон хранится в бине в переменных типа Date. Если пользователь обновляет страницу через F5 значения календаря(переменные) сбрасываются на значения по умолчанию. Как сделать так что бы они переживали F5? SessionScope к сожалению не подходит.

Автор: Vasay 5.7.2012, 01:47
cuvorov, 

Сохранить даты в url

Автор: korian 13.7.2012, 13:35
А никак.
При рендеринге странице есть скрытое поле ViewState. И пока это поле присутствует в запросе, JSF понимает, с каким @ViewScoped бином связать запрос.
Если оно отсутствует, то JSF создает новый ViewScoped бин и новый ViewState.
Поэтому тут только или SessionScope, или ConversationScope из CDI может подойти... и не без проблем smile

Автор: Vasay 13.7.2012, 14:45
korian, 

Цитата

При рендеринге странице есть скрытое поле ViewState.


Не обязательно на странице. ViewState может сохраняться на сервере:

web.xml
Код

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>



Цитата

А никак.


Наверно, при желании все же можно засунуть даты в URL. Конечно, это будет некий "костыль". Для GWT я такие "костыли" видел, когда состояния компонентов сохраняется в URL.


Автор: korian 15.7.2012, 01:21
Цитата(Vasay @  13.7.2012,  13:45 Найти цитируемый пост)
Не обязательно на странице. ViewState может сохраняться на сервере:

На сколько я понимаю ViewState сохраняется всегда, при наличае формы и необходимости. Необходимость в данном случае - это существование ViewScoped бина. Разница лишь в виде, в котором он сохраняется.

Вот пример:
Код

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TestClass implements Serializable {
    private String test = "test";
    public String getTest() {
        return test;
    }
    public void setTest(String test) {
        this.test = test;
    }
}


Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

    <h:form>
        <h:outputText value="#{testClass.test}" />
    </h:form>
</html>


Резултат 1:
Код

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>


Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <form id="j_idt3" name="j_idt3" method="post" action="/deployment-portal/faces/index.xhtml"
        enctype="application/x-www-form-urlencoded">
        <input type="hidden" name="j_idt3" value="j_idt3" />
        test
        <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState"
            value="4560357671165955156:1497501622082737167" autocomplete="off" />
    </form>
</html>


Результат 2:
Код

<context-param>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>


Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <form id="j_idt3" name="j_idt3" method="post" action="/deployment-portal/faces/index.xhtml"
        enctype="application/x-www-form-urlencoded">
        <input type="hidden" name="j_idt3" value="j_idt3" />
        test
        <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState"
            value="H4sIAAAAAAAAAG1ST2sUMRR/O91VdxGpFXqyt1L0kqHnRbRUSxemKo6K4kFfZ+JulkwSkze72R4KngURPAm
KX8Cbn0B6EAQFPfod/AyaTFe6oA8mZMj7/Xn55cMv6Bhn4fwYJ8hqEpLtohvtoemc
/vnpaPXJ9yVIdqAnNZY7WJC2A+jSyHI30rL05uo1iHV2eiasy+FLCC4WumKuVuwpFtyx6zOFlSi2ChJauaB14URry1qcZcKRf
/5j7c1nfLcErQG0nTjg3kTiaTuunqAzfizKzTqgH2UNXqIaslv7Y15Q/9W3B++X3WWZhNYIS+JIG7HNz00ES0YrrojlhMR3g3luc5xw+
/DLxyuv337dSyDJoFtIdO4mVpxgpdFJo06akxVq2M+g5wKmbDgIVo87hE5zbgVKcYD7kve9ifKX/i9/b3Bf8OkdrWk9bsJF
/55XAq0MOo5wGKg3GmqfNvAUjZGiwHiB6W2r48x57Ov7Z3AI8E8ILQohcUfbcZrgJY2J8ImWE1ZyI/WsClaMtoQyWFNktZTcsrt
/IS/Sl2ubp8xRY6kdmaJO1xs6/vOHFtYX51swyBYNwrxWQjAWzp0Ed0PV1eJhYO4FYFk3r8T/AYUagB2XAgAA"
            autocomplete="off" />
    </form>
</html>

Автор: Vasay 15.7.2012, 01:54
korian, 

Да, Вы правы.  В случае с "server" он пишет в поле "javax.faces.ViewState" некий id по которому связывает данные сохраненные на сервере с конкретной формой для конкретного запроса. 

Суть не меняется - при обновлении страницы теряем этот id, соответственно теряем ViewScoped бин.

Ну тогда только как-то положить данные в URL. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)