Мы все любим один из самых мощных списков значений 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 . | 




