Pull to refresh

Oracle ADF (Application Development Framework)

Reading time 4 min
Views 35K
Не так давно, я познакомился с 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"/>


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


Написать хотелось многое, но, подступаясь к разным аспектам, я осознавал, что для каждого из составляющих требуется своя отдельная статья. Не судите слишком строго, это моя вторая статья на нашем уютном Хабре. Надеюсь, что вам понравилось. И если тема вам интересна, то я продолжу писать отдельные и более детальные статьи.
Only registered users can participate in poll. Log in, please.
Нужны ли еще статьи на эту тему?
73.51% Да. 247
26.49% Нет. 89
336 users voted. 66 users abstained.
Tags:
Hubs:
+6
Comments 19
Comments Comments 19

Articles