Как правильно выбрать область бобов?



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



@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped


какова цель каждого из них? Как мне выбрать правильный объем для моего Боба?

710   2  

2 ответов:

введение

он представляет область (время жизни) Боба. Это легче понять, если вы знакомы с работой" под крышками " основного веб-приложения сервлета:как работают сервлеты? Создание экземпляров, сеансы, общие переменные и многопоточность.


@Request/View/Flow/Session/ApplicationScoped

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

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

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

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

Читайте также:


@CustomScoped/NoneScoped/Dependent

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

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

Читайте также:


Flash scope

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

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

Читайте также:

по состоянию на JSF 2.x есть 4 области бобов:

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

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

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

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

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

выберите объем вы основали на вашем требовании.

источник:Core Java Server Faces 3rd Edition David Geary & Cay Horstmann [страница № 51-54] enter image description here

Comments

    Ничего не найдено.