Пользователь
0,0
рейтинг
10 марта 2013 в 04:16

Разработка → 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"/>


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


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

Проголосовал 321 человек. Воздержалось 63 человека.

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

Городилов Максим @matim
карма
3,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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 — с той мотивацией, что раз хибер опенсоурсный, значит на коленке в гараже написан.

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

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