Статьи

LOVs в Oracle MAF

Мы все любим один из самых мощных списков значений ADF. Используя их, мы можем декларативно и легко создавать довольно сложные функции в приложениях ADF. Хорошо, что у нас аналогичный подход и в Oracle MAF. В ADF BC мы определяем LOV, атрибуты UI, правила валидации и т. Д. На уровне бизнес-служб, в основном на уровне Entity или VO. В MAF мы можем сделать то же самое, но на уровне управления данными. Это довольно очевидно, так как кто знает, что такое бизнес-сервис. Это может быть что угодно в Oracle MAF.

Итак, в этом посте я собираюсь показать, как мы можем определять и работать с LOV в Oracle MAF.

Давайте рассмотрим простой вариант использования. Существует форма оплаты, которая выглядит следующим образом:

Снимок экрана iOS-симулятора 28 февраля 2015 г., 16.55.55

Конечный пользователь выбирает учетную запись в раскрывающемся списке, и общий баланс будет использоваться в качестве суммы платежа по умолчанию, однако ее можно изменить.

Бизнес-модель основана на паре классов 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 выглядит следующим образом:

Снимок экрана 2015-02-28 в 17.06.48

Чтобы определить параметры атрибутов платежа, такие как подсказки пользовательского интерфейса, правила проверки, LOV и т. Д., Я собираюсь нажать кнопку карандаша, и у меня будет форма, которая выглядит примерно так, как в ADF BC:

Снимок экрана 2015-02-28 в 6.28.36 PM
Те, кто знаком с ADF BC, вряд ли здесь заблудятся. Итак, на странице списка значений мы можем определить LOV для атрибута accountid:

Снимок экрана 2015-02-28 в 5.39.59 вечера

Сделав это, мы можем настроить подсказки пользовательского интерфейса LOV и т. Д. В основном это все. Все, что нам нужно сделать, это добавить атрибут accountid из этой палитры DataControl на страницу в качестве компонента selectOneChoice.

Снимок экрана 2015-02-28 в 17.55.20

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, и это будет решением. Как это:

Снимок экрана 2015-02-28 в 17.41.43

Но в 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 .