пятница, 17 мая 2013 г.

10й - практикум. Oracle ADF. Проверки (Validation rules)

Без проверок в бизнес приложениях пожалуй точно не обойтись и в ADF для их реализации  достаточно возможностей. Покажу лишь некоторые из них.


Примеры делаются на схеме HR базы XE.

Самые доступные проверки - декларативные, доступны на сущности (EO)
Они понятны из названий.

Рассмотрю вид проверки Method. Это java метод в котором можно выполнить различные проверки и вернуть результат.
Реализация метода находится в одноименном Impl классе сущности. Для этого примера покажу более гибкий способ формирования сообщения об ошибке.

В сообщение используется шаблон, который в свою очередь заполняется из метода getErrMessage(), Impl класса. Обратите внимание на prefix "source", так можно получить доступ из Groovy выражения к java объекту.

Вот так выглядит реализация этих методов в Impl классе.
public class EmployeesImpl extends EntityImpl {

    private String errMessage;

    private static String emailTempl = "^([a-z0-9_\\-]+\\.)*[a-z0-9_\\-]+@([a-z0-9][a-z0-9\\-]*[a-z0-9]\\.)+[a-z]{2,4}$";
    private static Pattern emailPtr = Pattern.compile(emailTempl);

    /**
     * Validation method for Email.
     */
    public boolean validateEmail(String email) {
        Matcher m = emailPtr.matcher(email);
        boolean mt = m.matches();
        if (!mt) {
            errMessage = "Не верный email адрес";
        }
        return mt;
    }

    public String getErrMessage() {
        return errMessage;
    }


 А вот так обработка на форме

Вообще для регулярных выражений может хватить и декларативного подхода, да и для многих других простых случаев.
Но в примере показана возможность для реализации сложной логики. Этот способ проверок происходит в с слое Model, а в другом примере покажу как можно проводить контроль в слое ViewController.
Для поля Salary создается метод validateSalary для Validator. Реализация метода делается в бине.

В коде 
public void validateSalary(FacesContext facesContext, UIComponent uIComponent, Object object) {
        String clientId = uIComponent.getClientId(facesContext);
        boolean fatal = false;

        if ((object == null) || (object.toString().isEmpty())) {
            fatal = true;
        } else if (!isDigit(object.toString())) {
            fatal = true;
        } else if (Integer.parseInt(object.toString()) <= 0) {
            fatal = true;
        }

        if (fatal) {
            facesContext.addMessage(clientId,
                                    new FacesMessage(FacesMessage.SEVERITY_FATAL, "Ошибка", "Заработная плата должна быть > 0"));
        }
    }


Обработка на форме


Проверки в модели могут быть полезны когда они не зависят он состояния слоя View, повторно используются между разными клиентами, ViewController - ми. Проверки в слое View полезны когда надо использовать состояние и другие зависимости в UI. Некоторые декларативные проверки будут транслированы в javascript и отрабатывать на клиенте.

Источники:

Using Validation in the ADF Model Layer
http://docs.oracle.com/cd/E16162_01/web.1112/e16182/validation_model.htm

Custom Validator in Oracle ADF (JSF Validator)
http://oracleadf-java.blogspot.ru/2012/11/custom-validator-in-oracle-adf-jsf_20.html

Исходный код




 


Комментариев нет:

Отправить комментарий