Управляемый бин – это стандартный Java Bean класс, который заргистрирован в JSF. Мы можем сказать, что Managed Bean (далее – MB) это java бин, который используется фреймворком JSF.
Ниже приведены некоторые дынные по данной сущности:
- MB доступен из JSF страницы.
- MB содержит геттеры и сеттеры, бизнес логику или бины, которые содержат все занчения HTML формы.
- MB работает как модель для компонента пользовательского интерфейса (далее – UI компонент).
- До версии JSF 1.2, MB регистрируются в специальном конфигурационном файле (например, faces-config.xml).
- Начиная с версии JSF 2.0, MB могут быть зарегистрированы с помощью аннотаций. Данный подход явялется более удобным и предпочтительным.
Примеры регистрации управляемого бина
С помощью XML конфигурации:
<managed-bean>
<managed-bean-name>helloWorld</managed-bean-name>
<managed-bean-class>net.proselyte.jsftutorial.HelloWorld</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>message</managed-bean-name>
<managed-bean-class>net.proselyte.jsftutorial.Message</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
С помощью аннотаций
@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {
...
@ManagedProperty(value = "#{message}")
private Message message;
...
}
Аннотация @ManagedBean
Аннотация @ManagedBean создаёт управляемый бин с именем, указанным в аттрибуте name. Если имя бина не указано, то по умолчанию ему будет присвоено имя класса. В нашем случае это будет “helloWorld”.
Другим важным аттрибутом является – eager. Если данный параметр равен “true“, то MB созадётся до первого запроса данного бина. С другой стороны, если “eager = false“, то происходит, так называемая, “ленивая” инициализация, при которой бин создаётся только после запроса.
Аннотации Scope
Аннототации Scope устанавливают область видимости, в которую помещается MB. Если область видимости не указана, то данный параметр устанавливается по умолчанию. Все виды обсласти видимости указаны в таблице ниже:
Область видимости | Описание |
---|---|
@RequestScoped | Бин живёт до тех пор, пока существует HTTP запрос-ответ. Он создаётся во время выполнения HTTP – запроса и уничтожается, когда HTTP – ответ, ассоциированный с данным запросом завершается. |
@NoneScoped | Бин живёт так долго, как EL оценка. Созадётся в момент EL оценки и уничтожается сразу после неё. |
@ViewScoped | Бин живёт до тех пор, пока пользователь взаимодействует с JSF представлением в браузере или окне. Создаётся в момент HTTP – запроса и уничтожается после того, как пользователь переходит к другому JSF представлению (например, на другую страницу). |
@SessionScoped | Бин живет до тех пор, пока существует HTTP сессия. Созадётся в момент первого HTTP – запроса, который вводит данный бин в сессию и уничтожается в момент, когда сессия становится не валидной. |
@ApplicationScoped | Бин живет, пока живёт приложение. СОзадётся в момент первого HTTP – запроса, который вводит данный бин в приложение (или когда приложение запускается, в случае “eager = true“) и уничтодается в момент прекращения завершения работы приложения. |
@CustomScoped | Бин живёт, пока входит в указанную Map. |
Аннотация @ManagedProperty
JSF – это простой статический фреймворк внедрения зависимостей (Dependency Injection – DI). Испоьзование аннотации @ManagedProperty позволят внедрить MB в другой управляемый бин.
Пример
Ниже приведён пример простого приложения с использованием аннотаций, казанных выше.
Шаг | Описание |
---|---|
1 | Создать Maven проект с именем JSFTutorial и пакетом net.proselyte.jsftutorial, как указано в статье Создание простого приложения (добавить ссылку) |
2 | Создать класс HelloWorld.java в пакете net.proselyte.jsftutorial |
3 | Создать класс Message в пакете net.proselyte.jsftutorial |
4 | Подключить tomcat. |
5 | Запустить приложение с помощью сервера. |
6 | Перейти на страницу home,jsf в браузере. |
Класс HelloWorld.java
package net.proselyte.jsftutorial;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
/**
* Managed Bean for Hello world page.
*
* @author Eugene Suliemanov <proselytear@yahoo.com>
* @version 1.0
*/
@ManagedBean(name = "helloWorld", eager = true)
@RequestScoped
public class HelloWorld {
@ManagedProperty(value = "#{message}")
private Message messageBean;
private String message;
public HelloWorld() {
System.out.println("Starting HelloWorld...");
}
public String getMessage() {
if (messageBean != null) {
message = messageBean.getMessage();
}
return message;
}
public void setMessageBean(Message messageBean) {
this.messageBean = messageBean;
}
}
Класс Message.java
package net.proselyte.jsftutorial;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
/**
* Simple JavaBean domain object that represents message.
*
* @author Eugene Suleimanov <proselytear@yahoo.com>
* @version 1.0
*/
@ManagedBean(name = "message", eager = true)
@RequestScoped
public class Message {
private String message = "This is test message for JSFTutorial.";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Страница home.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>JSF Tutorial</title>
</head>
<body>
#{helloWorld.message}
</body>
</html>
В результате мы получим следующий результат:
На этом мы заканчиваем изучение управляемых бинов.
В следущей статье мы рассмотрим навигацию по страницам в JSF.