Как правильно выбрать сферу применения бобов? - PullRequest
366 голосов
/ 11 августа 2011

Я заметил, что существуют разные области применения бобов, такие как:

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

Какова цель каждого? Как выбрать правильную область применения для моего боба?

Ответы [ 2 ]

466 голосов
/ 11 августа 2011

Введение

Представляет область действия (время жизни) компонента.Это легче понять, если вы знакомы с работой «под прикрытием» основного веб-приложения с сервлетами: Как работают сервлеты?Экземпляр, сеансы, общие переменные и многопоточность .


@Request/View/Flow/Session/ApplicationScoped

A @RequestScoped bean живет столько же, сколько один HTTP-запрос.Цикл ответа (обратите внимание, что Ajax-запрос также считается одним HTTP-запросом).Бин @ViewScoped живет до тех пор, пока вы взаимодействуете с тем же представлением JSF с помощью обратных передач, которые вызывают методы действия, возвращающие null / void без какой-либо навигации / перенаправления.Бин @FlowScoped живет до тех пор, пока вы перемещаетесь по указанной коллекции представлений, зарегистрированных в файле конфигурации потока.Компонент @SessionScoped живет столько времени, сколько установлен HTTP-сеанс.Бин @ApplicationScoped живет до тех пор, пока работает веб-приложение.Обратите внимание, что CDI @Model в основном является стереотипом для @Named @RequestScoped, поэтому применяются те же правила.

Выбор области действия зависит только от данных (состояния), которые содержит компонент, ипредставляет собой.Используйте @RequestScoped для простых и не AJAX форм / презентаций.Используйте @ViewScoped для расширенных динамических представлений с поддержкой ajax (проверка на основе ajax, рендеринг, диалоги и т. Д.).Используйте @FlowScoped для шаблона "мастера" ("вопросника") сбора входных данных, распределенных по нескольким страницам.Используйте @SessionScoped для специфических данных клиента, таких как зарегистрированный пользователь и пользовательские настройки (язык и т. Д.).Используйте @ApplicationScoped для данных / констант всего приложения, таких как выпадающие списки, которые являются одинаковыми для всех, или управляемые bean-компоненты без каких-либо переменных экземпляра и имеющие только методы.

Злоупотребление bean-компонентом @ApplicationScoped для сеанса / представления/ Запрос данных в области сделал бы его доступным для всех пользователей, так что любой может увидеть данные друг друга, что просто неправильно.Злоупотребление bean-компонентом @SessionScoped для данных области просмотра / запроса сделало бы его доступным для всех вкладок / окон в одном сеансе браузера, поэтому конечный пользователь может испытывать неудобства при взаимодействии с каждым представлением после переключения между вкладками, что плохо для пользовательского опыта,Злоупотребление bean-компонентом @RequestScoped для данных в области просмотра приведет к повторной инициализации данных в области просмотра в значения по умолчанию при каждой обратной передаче (ajax), что может привести к нерабочим формам ( см. Также пункты 4 и 5 здесь ).Злоупотребление компонентом @ViewScoped для запроса, данных сеанса или области приложения и использование компонента @SessionScoped для данных области приложения не влияет на клиента, но излишне занимает память сервера и просто неэффективна.

Обратите внимание, что область видимости не должна выбираться исходя из факторов, влияющих на производительность, если только у действительно недостаточно места в памяти и вы хотите полностью отказаться от состояния;вам нужно было бы использовать исключительно @RequestScoped bean-компоненты и скрипту с параметрами запроса для поддержания состояния клиента.Также обратите внимание, что если у вас есть одна JSF-страница с данными различной области, то вполне допустимо поместить их в отдельные компоненты поддержки в области, соответствующей области данных.Бины могут просто обращаться друг к другу через @ManagedProperty в случае управляемых бинов JSF или @Inject в случае управляемых бинов CDI.

См. Также:


@CustomScoped/NoneScoped/Dependent

Это не упоминается в вашем вопросе, но (устаревшая версия) JSF также поддерживает @CustomScoped и @NoneScoped, которые редко используются в реальном мире.@CustomScoped должен ссылаться на пользовательскую реализацию Map<K, Bean> в более широкой области действия, которая переопределяет Map#put() и / или Map#get(), чтобы иметь более точный контроль над созданием и / или уничтожением bean-компонента.

JSF @NoneScoped и CDI @Dependent в основном живут столько же, сколько и одна EL-оценка на бобе. Представьте себе форму входа в систему с двумя полями ввода, относящимися к свойству bean-компонента, и командную кнопку, относящуюся к действию bean-компонента, таким образом, в общей сложности с тремя выражениями EL, тогда фактически будут созданы три экземпляра. Один с установленным именем пользователя, один с установленным паролем и один, для которого вызывается действие. Обычно вы хотите использовать эту область только для bean-компонентов, которые должны существовать столько, сколько bean-компонент, в который он вводится. Так что если @NoneScoped или @Dependent вводится в @SessionScoped, то он будет жить так же долго, как боб @SessionScoped.

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


Фотовспышка

Как и в прошлый раз, JSF также поддерживает объем флеш-памяти. Он поддерживается недолговечным cookie-файлом, который связан с вводом данных в область сеанса. Перед перенаправлением в ответе HTTP будет установлен cookie со значением, которое однозначно связано с вводом данных в область сеанса. После перенаправления будет проверено наличие файла cookie области флеш-памяти, а запись данных, связанная с файлом cookie, будет удалена из области сеанса и помещена в область запроса перенаправленного запроса. Наконец, cookie будет удален из ответа HTTP. Таким образом, перенаправленный запрос имеет доступ к данным области запроса, которые были подготовлены в начальном запросе.

На самом деле это недоступно как управляемая область действия bean, т. Е. Нет такой вещи, как @FlashScoped. Область действия флэш-памяти доступна только в виде карты через ExternalContext#getFlash() в управляемых компонентах и ​​#{flash} в EL.

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

121 голосов
/ 16 июля 2013

Начиная с JSF 2.x существует 4 области действия бобов:

  • @ SessionScoped
  • @ RequestScoped
  • @ ApplicationScoped
  • @ ViewScoped

Область сеанса: Область сеанса сохраняется с момента установления сеанса до его завершения. Сеанс заканчивается если веб-приложение вызывает метод invalidate на Объект HttpSession или время ожидания.

RequestScope: Область запроса недолговечна. Он начинается при отправке HTTP-запроса и заканчивается после отправки ответа клиенту. Если вы помещаете управляемый бин в область запроса, новый Экземпляр создается с каждым запросом. Стоит рассмотреть запрос scope, если вас беспокоит стоимость хранения области сеанса.

ApplicationScope: Область действия приложения сохраняется в течение всего срока действия веб-приложения. Эта область является общей для всех запросы и все сеансы. Вы помещаете управляемые бобы в область применения, если один бин должен быть общим для всех экземпляры веб-приложения. Боб создается, когда он сначала запрашивается любым пользователем приложения, и оно остается в живых пока веб-приложение не будет удалено с сервера приложений.

ViewScope: В JSF 2.0 была добавлена ​​область просмотра. Область видимости компонента сохраняется, пока отображается та же страница JSF. (JSF спецификация использует термин view для страницы JSF.) Как только пользователь переход на другую страницу, бин выходит из области видимости.

Выберите область действия, исходя из ваших требований.

Источник: Core Java Server Faces, 3-е издание , автор David Geary & Cay Horstmann [Страница №. 51 - 54] enter image description here

...