Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Распределенные сервис-ориентированные системы..pdf
Скачиваний:
16
Добавлен:
05.02.2023
Размер:
9.2 Mб
Скачать

Таблица 2.1 — (продолжение)

Метод

Описание метода

release

Высвобождает любые ресурсы, связанные с объектом типа

 

FacesContext.

renderResponse

Сигнализирует реализации JSF о том, что текущая фаза

 

обрабатывающего запросы жизненного цикла была закончена,

 

управление должно быть передано фазе «Отрисовать ответ»,

 

минуя любые фазы, которые еще не были выполнены.

responseComplete

Сигнализирует реализации JSF о том, что HTTP-ответ для этого

 

запроса уже был сгенерирован, например, переадресация НТТР, а

 

также о том, что жизненный цикл обработки запросов должен

 

прекратить свою работу, как только завершится текущая фаза.

2.2.3 Модель в виде компонентов-подложек

Компонент-подложка — это объект аннотированного, в соотвествии с требованиями CDI, JavaBeans-класса (POJO-класса), реализующий бизнес-модель запроса.

Прежде всего заметим, что термин компонент в данной главе и далее понимается в различных семантических значениях:

а) термин компонет JSF — обозначение программного модуля, понимаемого в масштабе платформы Java EE (см. подраздел 1.4 первой главы), или как конкретная прикладная библиотека (см. далее пункт 2.2.5);

б) термин компонет-подложка — обозначает отдельный JAVA-класс, где обозначение POJO — «Plain Old Java Object» или «Простой Java-объект в старом стиле»;

в) термин компонет Facelets (см. рисунок 2.11 и пункт 2.2.4) — обозначает XHTML-файл с тегами специального формата.

Каждый компонент-подложка имеет свою область действия.

Область действия — это время жизненного цикла объекта в масштабе функционирования приложения, использующего JSF.

Жизненый цикл компонентов подложек, в общем случае, не совпадает с жизненным циклом запросов, которые они обслуживают.

В таблице 2.2 представлены наиболее значимые области действия компо- нентов-подложек и соотвествующие ис аннотации.

72

Таблица 2.2 — Области действия компонентов-подложек [17]

Область действия/

Описание

Аннотация

 

Приложение

Наименее ограничительный вариант с самой большой

@ApplicationScoped

продолжительностью жизни. Созданные объекты доступны во всех

 

циклах запросов/ответов для всех клиентов, использующих веб-

 

приложение, до тех пор, пока приложение активно. Эти объекты

 

можно вызывать одновременно из нескольких источников, они

 

должны быть потокобезопасными. Объекты с такой областью

 

действия могут использовать другие объекты либо без области

 

действия, либо с такой же областью действия.

Сессия

Объекты доступны для любых циклов запросов/ответов, которые

@SessionScoped

принадлежат сессии клиента. Эти объекты имеют состояние,

 

которое сохраняется между запросами и хранится до тех пор, пока

 

сессия не будет завершена. Объекты с такой областью действия

 

могут использовать и другие объекты либо без области действия,

 

либо с такой же областью действия, либо с областью действия на

 

уровне приложения.

Представление

Объекты доступны в пределах заданного представления, пока оно

@ViewScoped

не изменится, и их состояние сохраняется до тех пор, пока

 

пользователь не перейдет к новому представлению (в этот момент

 

состояние стирается). Объекты с такой областью действия могут

 

использовать и другие объекты либо без области действия, либо с

 

такой же областью действия, либо с областью действия на уровне

 

приложения или сеанса.

Запрос

Объект доступен в начале запроса и до тех пор, пока клиенту не был

@RequestScoped

отправлен ответ. Клиент может выполнять несколько запросов, но

 

остаться на одном и том же представлении. Поэтому

 

продолжительность @ViewScoped больше, чем @RequestScoped.

 

Объекты с такой областью действия могут использовать и другие

 

объекты либо без области действия, либо с такой же областью

 

действия, либо с областью действия на уровне приложения или

 

сеанса.

Поток

Объекты в этой области действия создаются, когда пользователь

@FlowScoped

входит в указанный поток, и освобождаются, когда он выходит из

 

потока.

Чтобы быть управляемым компонентом CDI, компонент-подложка должен иметь аннотацию @Named.

Жизненный цикл компонента-подложки можно контролировать с помощью аннотаций

@PostConstruct и @PreDestroy.

73

На рисунке 2.15 показана схема жизненного цикла любого компонентаподложки, который может быть аннотирован следующим образом:

а) если перед методом компонента поставить аннотацию @PostContruct, то метод будет вызван, когда объект компонента будет создан и готов к использованию;

б) если перед методом компонента поставить аннотацию @PreDestroy, то метод будет вызван, перед тем как объект компонента будет уничтоженконтейнером.

Рисунок 2.15 — Схема жизненного цикла компонента-подложки [17]

Для демонстрации примера компоненты-подложки обратимся к бизнесмодели тестового примера:

1)создадим в Eclipse новый проект типа Dynamic Web Project с именем labs;

2)в этом проекте создадим JAVA-класс asu.rsos.TestTomee.java, содержимое которого показано на листинге 2.1.

Листинг 2.1 — Компонента-подложка TestTomee.java проекта labs

package asu.rsos;

import java.util.Date;

import javax.enterprise.context.ApplicationScoped; import javax.inject.Named;

@Named

@ApplicationScoped public class TestTomee

74

{

// Разделяемый ресурс

private List<String> msgs = new ArrayList<>();

// Строка ввода нового сообщения private String text = "";

/** * Пустой конструктор */

public TestTomee() {}

/**

*Стандартный набор методов Java Beans

*с особыми правилами именования методов */

public String getMsgs() { return msgs; }

/**

* Список msgs - nолько для чтения public void setMsgs(List<String> msgs)

{

this.msgs = msgs;

}

*/

/** * Методы чтения и установки текста */

public String getText() {return "";}

public void setText(String text) {this.text = text;}

/**

*Метод добавления нового сообщения.

*Возвращает:

*- адрес нового ресурса;

*- любое слово, при использовании faces-config.xml;

*- null, если страница не изменяется.

*/

public String addMessage()

{

Date dt = new Date();

String s = dt.toLocaleString() + " " + text; msgs.add(s);

return null;

}

}

В целом, TestTomee.java в таком написании соответствует структуре POJO-класса, в котором методы get*() и set*(...) предназначены для работы с приватными данными. В дальнейшем, такое описание будет автоматически обрабатываться компонентой JSF. В частности, приватная переменная msgs будет доступна «только для чтения».

75