Участвуя в разных проектах, в разное время, приходилось сталкиваться с такой задачей как динамическое создание форм, подключение их к данным (bindings) и.т.д. В ADF тоже приходилось делать аналогичные задачи, видимо это особенность больших проектов.
Итак все что раньше делалось в дизайнере JDeveloper, сделаем в коде, динамически в процессе выполнения. Схема HR на Oracle XE.
Код разместим в двух частях в Модели (Model) и Представлении (ViewController). Создание EO, VO - в модели, а создание Iterator, AttrsBinding и Controls - сделаем в Представлении.
В AppModuleImpl разместим код по созданию модели данных, EntityDefImpl, ViewDefImpl и собственно ViewObject.
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
Итак все что раньше делалось в дизайнере 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.htmlDynamic 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
Комментариев нет:
Отправить комментарий