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

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

@RequestScoped
@ViewScoped
@FlowScoped
@SessionScoped
@ApplicationScoped

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

Ответ 1

Введение

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


@Request/View/Flow/Session/ApplicationScoped

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

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

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

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

См. также:


@CustomScoped/NoneScoped/Dependent

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

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

См. также:


Объем флэш-памяти

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

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

См. также:

Ответ 2

По состоянию на JSF 2.x есть 4 Bean Области:

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

Сфера охвата сеанса: Сфера действия сеанса сохраняется с момента установления сеанса до завершения сеанса. Сессия завершается если веб-приложение вызывает метод invalidate на HttpSession, или если он истечет.

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

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

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

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

Источник: Core Java Server Faces 3rd Edition Дэвида Гири и Кей Хорстманна [Страница №. 51 - 54] enter image description here