Какова полезность безгражданства в JSF?

Согласно этому блогу, JSF становится лицом без гражданства. Не весь смысл использования JSF в том, что он делает сохранение и восстановление состояния рутинным делом. Какой смысл JSF стать лицом без гражданства? Можете ли вы привести пример, где это может быть полезно.

2 ответа

Решение

Прежде всего, я хотел бы уточнить, что JSF сама по себе не является "лицом без гражданства". JSF просто добавляет новую функцию, позволяющую разработчикам создавать представления / формы без сохранения состояния по требованию.

Сохранение состояний особенно полезно в динамически манипулируемых формах, например, с помощью условно-визуализированных частей. Он запоминает состояние формы через постбэки на основе ajax. Другими словами, это те формы, в которых вам абсолютно необходим управляемый компонент с областью представления вместо управляемого компонента с запросом. В случае статических форм, привязанных к компоненту области запроса, состояние может быть легко воссоздано для каждого запроса на основе файла представления и, следовательно, не обязательно должно быть сохранено.

Сохранение состояния имеет в случае управления сохранением состояния на стороне сервера, однако стоимость с точки зрения памяти сервера и создания сеанса. Кроме того, он имеет дополнительный недостаток, что ViewExpiredException будет происходить во время обратной передачи, когда сеанс истек. Все это можно решить, установив управление сохранением состояния на стороне клиента. Но это, в свою очередь, требует затрат с точки зрения пропускной способности сети и снижения производительности из-за сериализации.

Например, в случае больших веб-сайтов, охватывающих "общедоступный" и "ограниченный" разделы, вы хотите отложить создание сеанса до фактического входа пользователя в систему. Однако, если у вас есть форма входа в систему JSF в общедоступной части, тогда сеанс будет по-прежнему создаваться простым доступом к этой странице. Это ненужная стоимость, если форма по существу не имеет динамического состояния сама по себе и связана с компонентом, определяемым областью запроса.

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

Следует отметить, что безгражданство имеет дополнительный недостаток, заключающийся в том, что теоретически легче проводить атаку CSRF, если есть открытая дыра в XSS. К счастью, с JSF2/Facelets уже очень трудно иметь дыру в XSS. Единственный способ получить это - использовать <h:outputText escape="false"> повторно отображать контролируемые пользователем данные.

Смотрите также:

Дело только в том, чтобы поддерживать состояние, когда существует реальное состояние для поддержания.

Одна из больших проблем с JSF - масштабирование.

В основном у вас было два варианта с JSF:

  • хранить состояние на сервере - плюсы: быстрое время отклика; минусы: вам нужны загрузочные загрузки памяти, чтобы обрабатывать более 2-300 пользователей, "просто просматривающих", например, прежде чем они войдут в систему или добавят что-либо в корзину

  • состояние хранилища на клиенте - плюсы: убирает лимит памяти; минусы: увеличивает пропускную способность сервера, так как дерево компонентов должно каждый раз отправляться клиенту

Предполагается, что Stateless гарантирует, что JSF может использоваться для эффективного обслуживания контента, в то время как пользователь не должен поддерживать состояние.

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

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