Мы все любим один из самых мощных списков значений ADF. Используя их, мы можем декларативно и легко создавать довольно сложные функции в приложениях ADF. Хорошо, что у нас аналогичный подход и в Oracle MAF. В ADF BC мы определяем LOV, атрибуты UI, правила валидации и т. Д. На уровне бизнес-служб, в основном на уровне Entity или VO. В MAF мы можем сделать то же самое, но на уровне управления данными. Это довольно очевидно, так как кто знает, что такое бизнес-сервис. Это может быть что угодно в Oracle MAF.
Итак, в этом посте я собираюсь показать, как мы можем определять и работать с LOV в Oracle MAF.
Давайте рассмотрим простой вариант использования. Существует форма оплаты, которая выглядит следующим образом:
Конечный пользователь выбирает учетную запись в раскрывающемся списке, и общий баланс будет использоваться в качестве суммы платежа по умолчанию, однако ее можно изменить.
Бизнес-модель основана на паре классов POJO:
1
2
3
4
5
|
public class PaymentBO { private int accountid; private double amount; private String note; |
и
1
2
3
4
5
|
public class AccountBO { private int id; private String accountName; private double balance; |
Существует также класс AccountService, предоставляющий список доступных учетных записей:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
public class AccountService { private final static AccountService accountService = new AccountService(); private AccountBO[] accounts = new AccountBO[] { new AccountBO( 1 , "Main Account" , 1000.89 ), new AccountBO( 2 , "Secondary Account" , 670.78 ), new AccountBO( 3 , "Pocket Account" , 7876.84 ), new AccountBO( 4 , "Emergency Account" , 7885.80 ) }; public AccountBO[] getAccounts() { return accounts; } public static synchronized AccountService getInstance() { return accountService; } |
И есть класс PaymentDC, который выставляется как элемент управления данными:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
public class PaymentDC { private final PaymentBO payment = new PaymentBO(); private final AccountService accountService = AccountService.getInstance(); public PaymentBO getPayment() { return payment; } public AccountBO[] getAccounts() { return accountService.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
|
public void setAccountid( int accountid) { this .accountid = accountid; AccountBO account = AccountService.getInstance().getAccountById(accountid); if (account != null ) { setAmount(account.getBalance()); } } |
А в методе PaymentBO.setAmount мы должны вызвать событие change, чтобы обновить поле количества на странице:
1
2
3
4
5
|
public void setAmount( double amount) { double oldAmount = this .amount; this .amount = amount; propertyChangeSupport.firePropertyChange( "amount" , oldAmount, amount); } |
Это оно! Пример приложения для этого поста можно скачать здесь . Требуется JDeveloper 12.1.3 и MAF 2.1.0.
Ссылка: | Любит в Oracle MAF от нашего партнера JCG Евгения Федоренко в блоге ADF Practice . |