Oracle ADF (Application Development Framework)

от автора

Не так давно, я познакомился с Java фреймворком, созданный компанией Oracle. Я был удивлен, что на Хабре не нашлось информации о нем, поэтому решил написать небольшую обозревательную статью.

Введение

Когда я только начинал познание сего чуда (хотя, если быть откровенным, для меня он до сих пор, как чертик в табакерке), первая же pdf’ка порадовала меня следующей картиной.


Как видно из архитектуры, ADF является MVC фреймворком для разработки, как web приложений, так и mobile и desktop. Так как я занимался только web частью, то к сожалению рассказать про mobile и desktop, не могу.

И так, что же мы имеем в руках, используя ADF, в качестве web фреймворка.

В качестве UI слоя, выступают JSF страницы. ADF Faces, в свою очередь, предоставляет набор готовых UI компонентов.

Глобальный контроллер для JSF – это Faces Servlet, но по сути своей, обработка событий с UI компонентов происходит в managed beans. Под ADF Controller понимаются task flows. Это специальные компоненты, декларативно описывающие последовательность действий, для выполнения какой-либо задачи.

ADF Binding совместно с Data Controls являют собой слой содержащий в себе бизнес логику, предоставляющий единый интерфейс, что в свою очередь позволяет не задумываться о том, какой внешний источник используется.

Также в ADF предоставляет пользователям возможность кастомизации уровня представления, результат которого может быть сохранен на время сессии, либо с помощью Metadata Services в специальном репозитории (В БД или на файловой системе)

IDE

Для работы с ADF необходим JDeveloper. Рассказывать о нем можно много, поэтому я лишь оставлю скрин с изображением этого «комбайна».

Теперь рассмотрим компоненты ADF более подробно.

View

Многие, наверняка подумают, что же тут особого: «Это просто jspx страницы». И будут правы. Единственное, что я хочу добавить – это то, что ADF предоставляет большое количество готовых UI компонентов. От стандартных кнопок и всплывающих модальных окон, до компонентов визуализации данных.

Пара примеров:

Вывод текста, кнопка, richText

Календарик

Графики

Controller

В слой контроллера ADF привнес компонент, называемый task flow.

ADF Task flows предоставляют модульное разделение приложения. Например, вместо использования в приложении одного большого JSF пространства, можно разбить его на переиспользуемые составляющие, которые и называются task flow.

Каждый task flow являет собой граф, в котором вершины, называемые activities – это некие простые логические операции, такие как показ страницы, выполнение какого-то метода или вызов другого task flow, а правила перехода (control flow) могут быть как безусловными, так и по неким событиям.

Task flows делятся на два типа:

  • Unbounded
  • Bounded

Unbounded task flow имеет множество точек вхождения, поэтому может быть вызван в любом месте приложения и не имеет входных параметров.

Небольшой пример

Именно так выглядит диаграмма task flow в JDeveloper IDE. Данная диаграмма говорит о том, что в любом месте приложения по генерации события «hello», пользователя перенаправят на hello page, а по событию checkout произойдет вызов bounded task flow makeOrder.

Bounded task flow всегда имеет только одну точку входа и может содержать входные параметры.

Пример makeOrder task flow

Зеленым кругом обозначена входная точка, а серым – выходная.

В данном task flow мы можем декларативно задать и разбить процедуру создания заказа, на под задачи. К примеру вначале пользователь попадает на orderPage, из которой он может вернуться в место вызова task flow или пройти на страницу оплаты. На странице оплаты генерируется событие «pay», в следствии чего срабатывает метод managed bean’а payForOrder. Далее в checkPayment проверяется операция оплаты, после чего пользователя переводят либо на страницу с поздравлениями о совершенном заказе, либо на страницу с причиной неудачи заказа. В итоге происходит возврат в точку вызова task flow.

Стандартная комбинация работы с task flows обычно представляет из себя один unbounded и множество bounded task flows.

Очень хотелось написать о task flows как можно больше, но данная тема требует отдельной статьи, поэтому для введения, пожалуй, можно ограничиться этим.

Model

Data Controls – слой абстракций для работы с бизнес моделью, которой могут являться:

  • ADF Business Components
  • JavaBeans
  • EJB session beans
  • Web services

Благодаря Data Controls имеется единый интерфейс для работы с перечисленными выше источниками, а благодаря ADF Bindings мы можем связать UI компоненты напрямую с ними.

Все познается лучше на примере. Допустим имеется некий веб-сервис, который имеет всего один метод, возвращающий список строк (пусть к примеру гаджетов).

@WebService(...), @BindingType(...) public class HabraService {     public List<String> getGadgets() {         List<String> gadgets = new ArrayList<String>(             Arrays.asList("smartphone", "laptop", "tablet", "PC", "iPod")         );         return gadgets;     } } 

В JDeveloper’е можно получить Data Control для этого веб-сервиса по wsdl.


Перенеся с помощью drag-n-drop’ ярко-красный элемент «Return», можно получить на jspx странице форму, в которой будет возможность просмотреть список полученных гаджетов.

Если заглянуть в описание страницы (отдельный xml файл), можно увидеть созданные ADF Bindings для нее.

Если внимательно сравнить Bindings и Data Control можно заметить, что в Bindings добавились необходимые операции (зеленые шестеренки), метод getGadgets и один единственный атрибут item. Все они ссылаются на созданный iterator, который в свою очередь ссылается на Data Control. В данном случае Iterator будет содержать коллекцию строк вернувшихся из метода getGadgets.

Присутствие элементов в Bindings позволяет, c помощью EL выражений, применять их к UI компонентам.

Так, например, ADF компонент af:outputText может показать название гаджета

<af:outputText value="#{bindings.item.inputValue}" id="ot1"/> 

А кнопка «Last» выполнить операцию показа последнего гаджета.

<af:commandButton actionListener="#{bindings.Last.execute}" text="Last" disabled="#{!bindings.Last.enabled}" partialSubmit="true" id="cb4"/> 

Вместо заключения

Написать хотелось многое, но, подступаясь к разным аспектам, я осознавал, что для каждого из составляющих требуется своя отдельная статья. Не судите слишком строго, это моя вторая статья на нашем уютном Хабре. Надеюсь, что вам понравилось. И если тема вам интересна, то я продолжу писать отдельные и более детальные статьи.

Нужны ли еще статьи на эту тему?

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Никто ещё не голосовал. Воздержавшихся нет.

ссылка на оригинал статьи http://habrahabr.ru/post/172123/