Руководство по JSF. Управляемые бины (Managed Beans)

Управляемый бин – это стандартный 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>

В результате мы получим следующий результат:

jsfHomeXhtml

На этом мы заканчиваем изучение управляемых бинов.
В следущей статье мы рассмотрим навигацию по страницам в JSF.