понедельник, 17 июня 2013 г.

11й - практикум. Oracle ADF. Динамическая форма. Dynamic EntityDefImpl, ViewDefImpl, JUIteratorDef, JUCtrlAttrsBinding, RichInputText и др.

Участвуя в разных проектах, в разное время, приходилось сталкиваться с такой задачей как динамическое создание форм, подключение их к данным (bindings) и.т.д. В ADF тоже приходилось делать аналогичные задачи, видимо это особенность больших проектов.

Итак все что раньше делалось в дизайнере JDeveloper, сделаем в коде, динамически в процессе выполнения. Схема HR на Oracle XE.


Код разместим в двух частях в Модели (Model) и Представлении (ViewController). Создание EO, VO - в модели, а создание Iterator, AttrsBinding и Controls - сделаем в Представлении.

В AppModuleImpl разместим код по созданию модели данных, EntityDefImpl, ViewDefImpl и собственно ViewObject.

Entity

// ---- Create EO ---------
        EntityDefImpl newEntity = new EntityDefImpl(DYNAMIC_EO);
        newEntity.setSource("EMPLOYEES");
        newEntity.setFullName(DYNAMIC_PACKAGE + "." + DYNAMIC_EO);
        //Create attributes
        AttributeDefImpl newAttrDef1 =
            newEntity.addAttribute("EmployeeId", "EMPLOYEE_ID", BigDecimal.class, false, false, true);
        newAttrDef1.setPrimaryKey(true);
        newAttrDef1 =
                    newEntity.addAttribute("FirstName", "FIRST_NAME", String.class, false, false, true);        
        newAttrDef1 =
                    newEntity.addAttribute("LastName", "LAST_NAME", String.class, false, false, true);                
        //Other attribute defn goes here...
        newEntity.resolveDefObject();
        newEntity.registerDefObject();
 
 ViewObject
// ---- Create VO ---------
        ViewDefImpl newView = new ViewDefImpl(DYNAMIC_VO);
        newView.setFullName(DYNAMIC_PACKAGE + "." + DYNAMIC_VO);
        newView.addEntityUsage("e", newEntity.getFullName(), false, false);
        newView.addAllEntityAttributes("e");
        newView.setFetchSize((short)30);

        newView.setComponentClass(null); // take the default ViewObjectImpl
        newView.setRowClass(null); // take the default ViewRowImpl
        //    newView.setSelectClause("EmpUsage.EMPNO, EmpUsage.ENAME, EmpUsage.JOB, EmpUsage.DEPTNO");
        //    newView.setFromClause("EMP EmpUsage");

        newView.setSelectClauseFlags(ViewDefImpl.CLAUSE_GENERATE_RT);
        newView.setWhereClauseFlags(ViewDefImpl.CLAUSE_GENERATE_RT);
        newView.setFromClauseFlags(ViewDefImpl.CLAUSE_GENERATE_RT);
        newView.resolveDefObject();
        newView.registerDefObject();

        createViewObject(DYNAMIC_VO_INSTANCE_INTERNAL, newView);

После этого у нас появится бизнес объекты для работы с таблицей  "EMPLOYEES".
Затем в Session Bean (eoBuilder) разместим код по генерации UI.

DCBindingContainer dcb = ADFUtils.getDCBindingContainer();
        // Create Iterator - "voIterator"
        DCIteratorBinding itr = getIterator("voIterator", AppModuleImpl.DYNAMIC_VO_INSTANCE_INTERNAL);
        // Create Attrs Binding ...
        dcb.addControlBinding("EmployeeId", new JUCtrlAttrsBinding(null, itr, new String[] { "EmployeeId" }));
        dcb.addControlBinding("FirstName", new JUCtrlAttrsBinding(null, itr, new String[] { "FirstName" }));
        dcb.addControlBinding("LastName", new JUCtrlAttrsBinding(null, itr, new String[] { "LastName" }));

И создание контролов
// Create controls
        RichInputText rt = new RichInputText();
        String theExpression = "#{bindings.EmployeeId.inputValue}";
        rt.setId("rt1");
        rt.setLabel("EmployeeId");
        rt.setValueExpression("value", resolveExpression(theExpression));
        // add to parent form
        form.getChildren().add(rt);


Запускается все это на событии "beforePhase" jsf страницы. Страница практически пустая. Для нее определен  PageDef, panelFormLayout.
Запуск построения интерфейса на событии

public void beforePhase(javax.faces.event.PhaseEvent phaseEvent) {        
        if (phaseEvent.getPhaseId() == PhaseId.RENDER_RESPONSE) {            
            if (createEO()) {
                createUI();
            }
        }
    }


 И вот что получили. Измененные данные можно сохранить

Источники:

Dynamic View Object & Entity Object
http://thirumalaisamyt.blogspot.ru/2013/04/life-of-dynamic-vo-eo-across.html

Dynamic Table Declarative Component
http://adfpractice-fedor.blogspot.ru/2013_02_01_archive.html

ADF Faces - How to create an editable rich table at runtime
https://forums.oracle.com/thread/2292213
 
   

Комментариев нет:

Отправить комментарий