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"/>
    


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


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

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

    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 19
    • +13
      больше ада. Я считаю, самое время для статьи по. EJB 2. Ну, или, 1.1.
      • +6
        Как же мы с ним когда то намучались, багованый, ведет себя странно, в спеках совсем другое написано. Я никому не советовал бы его использовать.
        • 0
          Ну вы по-видимому все-таки отмучались. А я до сих пор работаю на adf 10g. :'(
        • +9
          жирный, лоснящийся ынтырпрайз…
          • +5
            Я не очень люблю всякие EJB, JSF etc тяжелые штуки, ибо это либо не скалируется либо требует больших вложений что бы оно скалировалось. А потом конечно же еще небось понадобится WebLogic или прочий веселый апп-сервер за пару десятков/сотен тысяч килобаксов, т.к. только он поддерживает какие-то фичи.
            Да, кстати и еще не понятно, как вся эта магия работает. Так что рекомендую отказаться от ынтырпрайза головного мозга на раннем этапе, пока он не пророс, и посмотреть на более легковесные вещи, которые позволяют достичь того же результата с меньшим эффортом.

            Вот список в сторону которого я смотрел бы:

            Сервлет контейнер: Tomcat или Jetty.
            Dependency Injection: Spring Core или Guice.
            Доступ к БД: Spring Jdbc Templates и/или Hibernate(Hibernate добавляет дополнительный оверхед, так что я от его использования на начальном этапе отказался бы).
            REST Service: Spring MVC + Jackson для JSON'a или Jersey
            Просто веб: Spring MVC или Struts 2.
            Всю магию с отображениями и т.п. можно достичь при помощи Javascript и сторонних фреймворков.

            Кстати вот отличный пример(на мой взгляд) для того, как начать работать с Jetty: habrahabr.ru/post/126066/.

            • +2
              Спасибо за ценный коментарий. Примерно так я и представлял в своей голове использование менее тяжелых технологий.

              Но есть лишь одно «Но». Заказчик требует. Ну и, как способ раскрасить серые будни, есть возможность закрепить свои знания в виде статей, и заодно поделиться ими с Хабром.

              P.S. Ну очень легкий REST на Java — Spark
              • 0
                Собственно вопрос всегда лежит на чём быстро сделать UI. Вот JSF полноценный UI framework решает все проблемы. Вопрос в том нравится ли как он это делает. А проблемы например такие, как сделать валидацию которую можно легко переносит со слоя server на слой client js — в JSF эта проблема решена. Или как сделать data binding. У EJB тоже есть плюшки, которые не так то просто делаются в Spring. Например полноценное разделение на модули и подключение их на горячую.

                P.S в гробу я видал EJB и JSF. Spring + Vaadin рулит! :)
              • 0
                Это такое толстое сборище энтерпрайзных конструкторов в одном флаконе, которое еще поискать надо. Объединим все в одно — это, видимо, главный девиз oracle. Если заставляют — то куда деваться, а если есть выбор — бежать и подальше от использования оного. Что-то стандартное, типа админки — да, делается сравнительно просто, но на том же Spring — проще. Что-то немного более кастомное — все, приплыли. Слава богу я свое на нем отмучился.
                • +1
                  Доводилось с ним работать несколько лет назад.

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

                  Так что не рекомендую. Даже Richfaces заметно лучше.
                  • 0
                    Да и в целом, на сколько мне известно, этот фреймворк жив исключительно благодаря труду маркетологов Oracle и постоянного его продвижения всем клиентам, использующим другие продукты.
                  • +1
                    А правда что ADF есть бесплатный? А он работает на JBoss?
                    • 0
                      есть
                      но не весь
                    • +1
                      Уже год работаю с ADF 11g. Вся разработка просто сводится к борьбе с фреймворком.
                      • +1
                        А profit от самого framework хоть какой-то есть?
                        • 0
                          Почти на каждый чих, в ADF есть кнопка, визард и т.д. По большей части разработка идет декларативно.
                          Возможно со мной многие не согласятся, но это один из замечательных способов разработки, когда ты «говоришь» системе/программе, что и как нужно сделать, а не пишешь много кода.
                          • 0
                            Вопрос как всегда стоит в том насколько гибкая деларативность, а то как не посмотришь видео про JDeveloper, так такое чувство что в результате бега по этим визардам как минимум Quake должен быть на выходе. Насколько оптимальный код генерится. Можно ли отказатся от части интерфейса JDeveloper, но использовать тот же ADF?
                            • 0
                              Конечно можно, но удобство ручного редактирования xml какое-то сомнительное. В той же intellij idea можно поднять проект, но удобства именно для adf в jdeveloper в разы больше.
                      • 0
                        Индусы дописали этот глючный фреймворк?
                        Лет 5 назад пытался поизучать, но дальше примеров дело не пошло, уж слишком оно привязано к ораклу
                        • 0
                          Самая пичаль — это когда боссы насмотрятся чудо-презентаций таких вещей, где за три клика получается что-то (на первый взгляд) работающее, и начинают требовать использовать это в своих проектах. Озвучиваются фразы вида «У вас проект идёт медленно, потому что вместо JDeveloper на Netbeans пишете». Сталкивался с настойчивым требованием использовать Toplink вместо Hibernate — с той мотивацией, что раз хибер опенсоурсный, значит на коленке в гараже написан.

                          Со сменой места работы такие проблемы пропали :)

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