пятница, 1 февраля 2013 г.

Managed beans(программное управление компонентами) в JDeveloper 11.1.1.6.0

                  При помощи drag-n-drop технологий в JDeveloper можно с легкостью создать приложение, которое будет отображать и редактировать  Master-detail связи,списки,графики. Но часто для реализации необходимых требований приложения требуется программное управление компонентами и выполнение определенных Java методов. Для этого в ADF существуют конфигурационные файлы называемые "Bean"(Бины). Бины представляют из себя Java классы со своей областью жизни(scope) экземпляров методов и переменных.
                 
                  Области жизни Managed bean-ов бывают следующих видов:

  • Application scope - экземпляр bean-a существует на протяжении работы приложения;
  • Session scope - экземпляр bean-a создается один раз при обращении пользователя к приложению, и используется на протяжении жизни сессии;
  • Page flow scope  - эта область используется для взаимосвязи между страниц в TaskFlow и существует ;
  • Request scope - экземпляр bean-a создается на каждый запрос до тех пор пока не отправится обратно клиенту;
  • Backing bean scope  - это область используется для декларативных компонентов и page fragment(region) и существует так же как и request scope  ;
  • View scope - экземпляр bean-a создается один раз при обращении к странице, и используется ровно столько, сколько пользователь находится на странице (включая ajax запросы). 


Для демонстрации работы  bean-ов  создадим простое приложение которое в OutputText напишет значения выбранной строки в таблице.

Использовать будем как обычно схему Scott.
1. Создайте Entity Object Dept,View Object DeptView и добавьте DeptView в Application Module; 
2. Cоздайте страницу MyBeans.jspx;
3. Добавьте на страницу panelStretchLayout;
4. Добавьте  из Data control DeptView на страницу и создайте read-only таблицу (Row Selection: Single row) в фасетку  center компонента  panelStretchLayout;
5. Добавьте  OutputText в фасетку top и установите значение value="";
6. Добавьте PanelGroupLayout в фасетку start;
7. Добавьте Button в PanelGroupLayout  и назовите ее "Выполнить"
Подготовительный этап готов
Теперь  собственно перейдем к созданию manage bean-a. Для  этого нажмите два раза по кнопке  "Выполнить".Появится окно "Bind Action Property"  в котором в "Managed Bean" нажмите "New". Этим вы вызовите окно создания Managed Bean-a. Введите данные, такие же как на следующей картинке
После нажатия кнопки "ОК" автоматически создается файл MyBean.java в котором мы и будем программно работать с нашей страницей. Далее назовите как то наш метод(Method) который будет обрабатывать действия нашей кнопки, например setOt  и жмите "ОК". В MyBean.java сформируется следующий код:
    public String SetOt() {
        // Add event code here...
        return null;
    }
Созданные нами bean-ы отображаются в adfc-config.xml во вкладке "Managed Beans"
Теперь нам надо связать наш Output text  на странице с переменной в нашем bean-e, для этого вернитесь на страницу MyBeans.jspx  и найдите созданный нам Output text и измените свойство как показано на картинке ниже(Property name:ot1)
В MyBean.javа создастся  переменная private RichOutputText ot1;  и сформируются get и set методы :

    public void setOt1(RichOutputText ot1) {
        this.ot1 = ot1;
    }

    public RichOutputText getOt1() {
        return ot1;
    }
Итак, в нашем MyBean.javа есть метод для обработки события при нажатии на кнопку и методы для работы с нашим Output text. Осталось в обработке события обратиться к нашей таблице что бы взять данные из выбранной строки. Для этого в  метод setOt перед "returned null;" введите следующий код:


          //Получаем bindings, связанные с текущей scope, а затем получаем доступ к  итератору  с которым связана наша таблица : DeptView1Iterator
           DCBindingContainer bindings =
               (DCBindingContainer)BindingContext.getCurrent().getCurrentBindingsEntry();
           DCIteratorBinding dcItteratorBindings =
               bindings.findIteratorBinding("DeptView1Iterator");
           // Получаем доступ к ViewObject нашей таблицы
           ViewObject voTableData = dcItteratorBindings.getViewObject();
           // Получаем выбранную строку
           Row rowSelected = voTableData.getCurrentRow();
           // Устанавливаем значение Value компонента Outputtext
           ot1.setValue("Вы выбрали  отдел : "+rowSelected.getAttribute("Dname")+" который находится в "+rowSelected.getAttribute("Loc"));
           setOt1(ot1);

Приложение, готово.Запускайте :)