13579 | 24680 | |
---|---|---|
1. | Чем @CustomScoped бины отличаются от @ViewScoped ? |
Чем @NoneScoped бины отличаются от @ApplicationScoped ? |
2. | Чем конструкция ${bean.property} отличается от конструкции #{bean.property} ? |
Какой из этих фрагментов кода не скомпилируется, и почему? (1) #{bean.action} (2) #{bean.action()} |
3. | Код управляемого бина, содержащего метод, возвращающий время с момента рестарта сервера или деплоя приложения. | Код JSF-страницы, показывающей значение параметра user-name из HTTP-запроса. |
@ViewScoped - экземпляр создаётся один раз при обращении к странице, и используется ровно столько, сколько пользователь находится на странице:
- Жизненный Цикл: Существует в течение одного представления (view) JSF.
- Использование: Часто используется для AJAX-взаимодействий в рамках одной страницы.
- Особенности: Уничтожается при переходе на новую страницу.
- Жизненный Цикл: Пользовательский; определяется через
Map
. - Использование: Для специфических требований, не покрываемых стандартными скоупами.
- Особенности: Гибкость в определении жизненного цикла.
В
@CustomScoped
, вы должны предоставитьMap объект
, который определяет характеристики области видимости. Это может включать в себя время жизни, механизмы хранения и другие параметры. Этот Map служит для управления жизненным циклом бина.
В Expression Language (EL) существуют два типа выражений: ${}
(Immediate) и #{}
(Deferred).
-
${bean.property}
(Immediate)- Жизненный Цикл: Вычисляется немедленно на этапе обработки страницы (срабатывают, как только разворачивается представление в 1ой фазе ЖЦ).
- Ограничения: Только чтения, а не для записи данных, не может быть использовано для привязки к компонентам, требующим двустороннего взаимодействия.
-
#{bean.property}
(Deferred)- Жизненный Цикл: Вычисляются в определенный момент жизненного цикла JSF, который может быть управляем. Это может происходить, например, при событиях валидации, обновления модели и так далее.
- Особенности: Поддерживает как чтение, так и запись. Используется для привязки компонентов к бинам.
${}
используется для односторонних операций, в основном чтения, тогда как #{}
используется для двустороннего взаимодействия и поддерживает больше функциональности.
3. Код управляемого бина, содержащего метод, возвращающий время с момента рестарта сервера или деплоя приложения.
@ApplicationScoped
public class ServerStartTimeBean {
private LocalDateTime startTime;
@PostConstruct
public void init() {
startTime = LocalDateTime.now();
}
public String getTimeSinceRestart() {
long totalSeconds = Duration.between(startTime, LocalDateTime.now()).getSeconds();
long hours = totalSeconds / 3600;
long minutes = (totalSeconds % 3600) / 60;
long seconds = totalSeconds % 60;
return String.format("%d hours, %d minutes, %d seconds", hours, minutes, seconds);
}
}
-
Область действия:
@NoneScoped
: Не имеет конкретного скоупа; каждое обращение к бину создает новый экземпляр бина.@ApplicationScoped
: Есть один экземпляр на все время жизни приложения; общий для всех пользователей и сессий.
-
Длительность жизни:
@NoneScoped
: Краткосрочная; живет только во время одного вызова.@ApplicationScoped
: Долгосрочная; живет на протяжении всего времени жизни приложения.
@NoneScoped
: Бины с этой аннотацией не находятся в каком-либо определенном скоупе. Это означает, что каждый раз, когда к бину осуществляется обращение, создается новый экземпляр. Бины с аннотацией @NoneScoped обычно используются в качестве базовых классов для других бинов или когда бин не требует сохранения состояния между запросами.@ApplicationScoped
: Бин с этой аннотацией создается один раз на всё время жизни приложения. Это означает, что все пользователи и все сессии используют один и тот же экземпляр этого бина. Он идеален для хранения данных, которые общие для всех пользователей и сессий.
Оба фрагмента кода являются синтаксически корректными выражениями Expression Language (EL) и могут быть использованы в страницах JSF. Однако их поведение будет разным:
-
#{bean.action}
: Это выражение будет пытаться получить значение свойства или методаaction
вbean
. Если такого свойства или метода нет, будет выброшена ошибка во время выполнения, но не во время компиляции. -
#{bean.action()}
: Это выражение будет пытаться вызвать методaction()
вbean
. Если такого метода нет, будет выброшена ошибка во время выполнения.
Оба эти фрагмента не вызывают ошибок компиляции, потому что они обрабатываются во время выполнения, и JSF/EL отложенно проверяют наличие соответствующих методов или свойств.
@ManagedBean
public class Bean {
// для #{bean.action}
public String getAction() {
return "actionValue";
}
// для #{bean.action()}
public String action() {
return "actionMethodValue";
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>Отображение параметра запроса</title>
</h:head>
<h:body>
<h:outputText value="User Name: " />
<h:outputText value="#{param['user-name']}" />
</h:body>
</html>