Ответ 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.
См. также:
- Разница между областью просмотра и запроса в управляемом beans
- Преимущества использования JSF Faces Flow вместо обычной навигационной системы
- Связь в JSF2 - управляемые области bean
@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.
См. также:
- Истекает конкретный управляемый экземпляр bean после временного интервала
- что не имеет области bean и когда ее использовать?
- Что представляет собой управляемый по умолчанию объект bean в приложении JSF 2?
Объем флэш-памяти
Как и в прошлом, JSF также поддерживает флэш-область. Он поддерживается коротким живым печеньем, который связан с вводом данных в области сеанса. Перед перенаправлением в ответе HTTP будет установлен файл cookie со значением, которое однозначно связано с вводом данных в области сеанса. После перенаправления будет проверяться наличие куки файла области видимости и запись данных, связанная с файлом cookie, будет удалена из области сеанса и помещена в область запроса перенаправленного запроса. Наконец, cookie будет удален из ответа HTTP. Таким образом, перенаправленный запрос имеет доступ к данным с запросом, которые были подготовлены в первоначальном запросе.
Это фактически недоступно как управляемая область bean, т.е. нет такой вещи, как @FlashScoped
. Область флэш-памяти доступна только в виде карты через ExternalContext#getFlash()
в управляемых beans и #{flash}
в EL.