Ответ 1
Вызов методов getter и setter выражениями #{}
не является частью JSF, а Язык выражений (наиболее известен как EL). JSF использует EL для привязки данных компонентов HTML к полям bean через правильные геттеры и сеттеры. Это:
- Если существует bean, Expression Language будет выполнять правильный приемник зарегистрированного bean в правильной области.
- Если клиент выполняет отправку формы или запрос ajax, то компоненты, которые отправляются на сервер (обычно все компоненты в
<h:form>
, в случае запросов ajax вы можете указать, какие компоненты отправлять на сервер) будет содержать новое значение, и это значение будет установлено в поле с помощью соответствующего метода настройки.
Например, у вас есть SayHelloBean
, который относится к области запроса:
@RequestScoped
@ManagedBean
public class LoginBean {
private String name;
//proper getter
public String getName() {
return this.name;
}
//proper setter
public void setName(String name) {
this.name = name;
}
}
И эти две страницы facelets (так как это пример, я избегаю объявления <html>
, <h:head>
, <h:body>
и других элементов, просто фокусируясь на соответствующем коде)
Page1.xhtml:
<h:form>
Please tell me your name
<h:inputText value="#{loginBean.name}" />
<h:commandButton action="page2" />
</h:form>
Page2.xhtml:
Hello #{loginBean.name}
Вот что происходит за кулисами:
-
Когда загружается файл Page1.xhtml, новый экземпляр
LoginBean
, который мы можем назватьLoginBean
, будет создан JSF и зарегистрирован в области запроса JSP. Поскольку значение<h:inputText />
привязано кLoginBean#name
(которое читается как полеname
классаLoginBean
), тогда EL отобразит значениеLoginBean#name
(которое читается как полеname
экземпляраLoginBean
), и поскольку это не инициализировано, EL отобразитnull
как пустую строку. -
Когда вы отправляете форму Page1.xhtml, так как
LoginBean
is@RequestScoped
, то JSF создаст новый экземплярLoginBean
, который мы можем назвать егоloginBean2
(добавление2
в конец, потому что этот экземпляр полностью отличается от ранее созданногоLoginBean
) и зарегистрирует его в области запросов JSP. Поскольку значение<h:inputText />
привязано кLoginBean#name
, JSF будет проверять и устанавливать данные, вызывая правильный сеттер. Это сделаетloginBean2#name
значение<input type="text">
, которое было показано<h:inputText/>
. -
Наконец, JSF обязательно перейдет к Page2.xhtml через forward, где при его обработке он найдет
#{loginBean.name}
, а EL проверит значениеloginBean2#name
и заменит его.
Шаги, объясненные здесь, являются очень небольшим объяснением (и с множеством элементов, которые не объясняются) жизненного цикла JSF, и как JSF использует геттеры и сеттеры.
Дополнительная информация:
- Как передать параметр jsp: include через c: set? Каковы области переменных в JSP?
- Как правильно выбрать область bean?
- Жизненный цикл приложения JavaServer Faces
- Различия между Forward и Redirect
Дополнительное примечание: поскольку вы изучаете JSF, избегайте ввода кода бизнес-логики в getters/seters. Это объясняется здесь: Почему JSF вызывает геттеры несколько раз