Что такое параметр STATE_SAVING_METHOD в JSF 2.0

Я не могу понять, что является функцией этой строки в web.xml

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

Я прочитал, что по умолчанию NetBeans является клиентом. Я только что столкнулся с проблемой, что у меня есть много beans в моем приложении, а <param-value> - клиенту, поэтому я получаю

java.io.NotSerializableException

хотя мои beans были Serializable (т.е. они реализовали интерфейс Serializable). Мои beans были в @ViewScope. Но когда я сменил его на сервер, все будет работать. Зачем? В чем разница, когда я использую клиент и сервер. Может ли кто-нибудь объяснить мне с помощью примера.

Спасибо

Ответ 1

java.io.NotSerializableException

Такое исключение обычно представляет собой сообщение в корневой причине, которое показывает полное имя класса, которое не реализует Serializable. Вы должны обратить пристальное внимание на это сообщение, чтобы узнать, о каком классе он говорит, а затем позволить ему реализовать Serializable соответственно.

Зачастую создание только упорядоченных классов bean сериализуется не всегда. Вам также необходимо убедиться, что каждый из его свойств также сериализуем. Большинство стандартных типов, таких как String, Long и т.д., Реализуют все уже Serializable. Но (настраиваемые) сложные типы, такие как вложенные beans, сущности или EJB, должны также быть сериализуемыми. Если что-то не реализуется как Serializable, например InputStream, то вы должны либо перепроектировать модель, либо сделать ее transient (и помните, что после десериализации она будет null).


В чем разница, когда я использую клиент и сервер

Вначале некоторая справочная информация: Почему JSF сохраняет состояние компонентов пользовательского интерфейса на сервере?

Основное техническое отличие состоит в том, что параметр client сохраняет все состояние представления как значение скрытого поля ввода javax.faces.ViewState в сгенерированном HTML-выходе и что параметр server сохраняет его в сеансе вместе с уникальный идентификатор, который в свою очередь упоминается как значение скрытого поля ввода javax.faces.ViewState.

Таким образом, установка на client увеличивает использование пропускной способности сети, но уменьшает использование памяти сервера, а настройка на server выполняется наоборот. Тем не менее, установка в client имеет дополнительное функциональное преимущество: она предотвращает ViewExpiredException, когда сессия истекла или когда клиент открывает слишком много просмотров.

Ответ 2

Параметр

javax.faces.STATE_SAVING_METHOD используется для указания места сохранения состояния.

Если вы хотите сохранить состояние на сервере (которое по умолчанию используется в эталонной реализации JavaServer Faces), укажите значение param-value как server.

В противном случае для сохранения состояния на стороне клиента мы можем указать client в param-value.

Если состояние сохранено на клиенте, состояние всего представления отображается в скрытое поле на странице.