Мы все любим один из самых мощных списков значений ADF. Используя их, мы можем декларативно и легко создавать довольно сложные функции в приложениях ADF. Хорошо, что у нас аналогичный подход и в Oracle MAF. В ADF BC мы определяем LOV, атрибуты UI, правила валидации и т. Д. На уровне бизнес-служб, в основном на уровне Entity или VO. В MAF мы можем сделать то же самое, но на уровне управления данными. Это довольно очевидно, так как кто знает, что такое бизнес-сервис. Это может быть что угодно в Oracle MAF.
Итак, в этом посте я собираюсь показать, как мы можем определять и работать с LOV в Oracle MAF.
Давайте рассмотрим простой вариант использования. Существует форма оплаты, которая выглядит следующим образом:
Конечный пользователь выбирает учетную запись в раскрывающемся списке, и общий баланс будет использоваться в качестве суммы платежа по умолчанию, однако ее можно изменить.
Бизнес-модель основана на паре классов POJO:
| 1 2 3 4 5 | publicclassPaymentBO {    privateintaccountid;    privatedoubleamount;    privateString note; | 
и
| 1 2 3 4 5 | publicclassAccountBO {    privateintid;    privateString accountName;    privatedoublebalance; | 
Существует также класс AccountService, предоставляющий список доступных учетных записей:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | publicclassAccountService {    privatefinalstaticAccountService accountService = newAccountService();    privateAccountBO[] accounts = newAccountBO[] {        newAccountBO(1, "Main Account", 1000.89),        newAccountBO(2, "Secondary Account", 670.78),        newAccountBO(3, "Pocket Account", 7876.84),        newAccountBO(4, "Emergency Account", 7885.80)    };    publicAccountBO[] getAccounts() {        returnaccounts;    }    publicstaticsynchronizedAccountService getInstance() {        returnaccountService;    } | 
И есть класс PaymentDC, который выставляется как элемент управления данными:
| 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | publicclassPaymentDC {    privatefinalPaymentBO payment = newPaymentBO();    privatefinalAccountService accountService = AccountService.getInstance();    publicPaymentBO getPayment() {        returnpayment;    }    publicAccountBO[] getAccounts() {        returnaccountService.getAccounts();    }} | 
Структура DataControl выглядит следующим образом:
Чтобы определить параметры атрибутов платежа, такие как подсказки пользовательского интерфейса, правила проверки, LOV и т. Д., Я собираюсь нажать кнопку карандаша, и у меня будет форма, которая выглядит примерно так, как в ADF BC:
 
  Те, кто знаком с ADF BC, вряд ли здесь заблудятся.  Итак, на странице списка значений мы можем определить LOV для атрибута accountid: 
Сделав это, мы можем настроить подсказки пользовательского интерфейса LOV и т. Д. В основном это все. Все, что нам нужно сделать, это добавить атрибут accountid из этой палитры DataControl на страницу в качестве компонента selectOneChoice.
| 1 2 3 4 | <amx:selectOneChoice value="#{bindings.accountid.inputValue}"                     label="#{bindings.accountid.label}"id="soc1">    <amx:selectItems value="#{bindings.accountid.items}"id="si1"/></amx:selectOneChoice> | 
Фреймворк сделает остальное, определив определение привязки списка в файле pageDef:
| 1 2 3 |  <list IterBinding="paymentIterator"StaticList="false"        Uses="LOV_accountid"id="accountid"DTSupportsMRU="true"        SelectItemValueMode="ListObject"/> | 
Но мы должны как-то реализовать настройку суммы платежа с балансом счета при его выборе. В ADF мы сможем определить несколько сопоставлений атрибутов в определении LOV, и это будет решением. Как это:
Но в MAF это не работает. К несчастью. Работает только первичное отображение. Итак, мы собираемся сделать это вручную в методе PaymentBO.setAccountid:
| 1 2 3 4 5 6 7 8 | publicvoidsetAccountid(intaccountid) {    this.accountid = accountid;    AccountBO account = AccountService.getInstance().getAccountById(accountid);    if(account != null) {        setAmount(account.getBalance());    }} | 
А в методе PaymentBO.setAmount мы должны вызвать событие change, чтобы обновить поле количества на странице:
| 1 2 3 4 5 | publicvoidsetAmount(doubleamount) {    doubleoldAmount = this.amount;    this.amount = amount;    propertyChangeSupport.firePropertyChange("amount", oldAmount, amount);} | 
Это оно! Пример приложения для этого поста можно скачать здесь . Требуется JDeveloper 12.1.3 и MAF 2.1.0.
| Ссылка: | Любит в Oracle MAF от нашего партнера JCG Евгения Федоренко в блоге ADF Practice . | 




