Не так давно, я познакомился с 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"/>
Вместо заключения
Написать хотелось многое, но, подступаясь к разным аспектам, я осознавал, что для каждого из составляющих требуется своя отдельная статья. Не судите слишком строго, это моя вторая статья на нашем уютном Хабре. Надеюсь, что вам понравилось. И если тема вам интересна, то я продолжу писать отдельные и более детальные статьи.
Автор: matim