Частичное сохранение состояния JSF 2.0 не работает - PullRequest
8 голосов
/ 08 декабря 2010

Я оцениваю возможность использования JSF на сайте с большим трафиком.Мне сказали, что в JSF 2.0 дерево компонентов не сохраняется в сеансе, и что только изменения дельты сохраняются после изменения дерева компонентов.

Вот страница, которую я просматриваю:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <h:form>
            hello, world
        </h:form>
    </body>
</html>

Каждый раз, когда я просматриваю эту страницу, на сеанс выделяется почти 1 КБ.Если я удаляю тег <form>, в сеансе ничего не сохраняется.

Есть идеи, почему в сеансе хранится дерево компонентов?Я думаю, что это будет вычислено по запросу обратной передачи.

1 Ответ

20 голосов
/ 08 декабря 2010

Частичное сохранение состояния не означает, что состояние не будет сохранено в сеансе.Это означает только то, что часть состояния дерева компонентов будет сохранена вместо всего состояния дерева компонентов.Основная идея частичного сохранения состояния заключается в том, что состояние компонентов, которые не будут изменены клиентской стороной в последующем запросе, не будет сохранено.Вместо этого он получается путем повторного выполнения представления на стороне сервера во время представления восстановления.Будет сохранено только состояние компонента, чувствительное к изменениям со стороны клиента (формы, входы, кнопки и т. Д.).1K, который вы видите в сеансе, - это само частичное состояние.

Чтобы проверить его самостоятельно, включите и выключите состояние с помощью следующего context-param in web.xml:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

Вы увидите, что размер увеличивается, если для параметра установлено значение false, что означает, что вместо него было сохранено полное дерево компонентов.

Оно сохраняется в сеансе, поскольку это толькоServlet API, который имеет большую область, чем область запроса.Хранение в области запроса не будет иметь никакого значения, так как оно не будет доступно для последующего запроса.Servlet API не имеет понятия о области видимости, как в JSF (которая скрывается под косвенным использованием области видимости, кстати, в основном состояние представления является состоянием дерева компонентов).

Вы действительно не понимаетебольше не вижу этого, когда вы удаляете форму, так как на самом деле ничего не осталось, что клиент мог бы изменить (т.е. не было бы обратной передачи).Тогда не было бы смысла спасать государство.Кроме того, нечего было бы передавать ключ сохраненного состояния как скрытое поле ввода (с именем javax.faces.ViewState).

См. Также:

...