Список форумов forum.alsor.net forum.alsor.net
Форум небольшого круга друзей
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Form&Callback problem

 
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум
Предыдущая тема :: Следующая тема  
Автор Сообщение
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Сб Мар 21, 2009 3:52 pm    Заголовок сообщения: Form&Callback problem Ответить с цитатой

Хочу услышать критику. Уже давно надоела проблема форм и переноса их значений. И вот придумали, как облегчить жизнь.

Есть форма (куча полей). Она биндится, валидируется и потом надо что-то вызвать и создать/изменить объект. Если надо дёрнуть метод дао или сервиса, то это геморой. Передавать форму -- двойной геморой, особенно если дао.

Решение таково. Есть у нас HibernateCallback (стандартный). Там есть
Код:
private Long id;
private String field1;
...

На все эти поля делаем геттеры/сеттеры, превращая наш колбэк в бин. Метод do... там работает со своими полями. А далее берём и используем этот объект в качестве формы, предварительно отсабклассившись, чтобы учесть кастомную валидация, и добавив артефакты, относящиеся к логике конкретного оконного дизайна.
Код:
class UpdateForm extends UpdateHibernateCallback {
public validate(Errors errors) {...}
private boolean customFlag;
...
}

Замечу, что данный подход совершенно круто работает и позволяет реально забыть про все проблемы разграничения слоёв.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Сб Мар 21, 2009 6:23 pm    Заголовок сообщения: Ответить с цитатой

Хм.. даже и не знаю что тут критиковать. Подход выглядит вполне нормальным. Разве что интересно как он покажет себя в более интересных ситуациях нежели форма обновления объекта. Но это надо уже смотреть реальный код. Если есть возможность поделиться - выложи.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Сб Мар 21, 2009 8:00 pm    Заголовок сообщения: Ответить с цитатой

кстати, попалась на глаза хорошая книга
http://www.amazon.com/Productive-Programmer-Theory-Practice-OReilly/dp/0596519788
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
teg



Зарегистрирован: 20.12.2005
Сообщения: 410

СообщениеДобавлено: Сб Мар 21, 2009 9:07 pm    Заголовок сообщения: Ответить с цитатой

Примеры все достаточно просты. Вот совсем простой класс.
Код:
package org.blah.blah.hibernate.edu;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;

/**
 *
 * @author serge
 */
public class GetKeyword implements HibernateCallback {

    private String value;

    private Long id;

    public GetKeyword() {
    }

    public GetKeyword(Long id) {
        this.id = id;
    }

    public GetKeyword(String value) {
        this.value = value;
    }

    @Override
    public Keyword doInHibernate(Session session) {
        assert id != null || value != null;

        if (id != null) {
            Criteria c = session.createCriteria(Keyword.class);
            c.add(Restrictions.eq("id", id));
            return (Keyword) c.uniqueResult();
        } else if (value != null) {
            Criteria c = session.createCriteria(KeywordSynonim.class);
            c.add(Restrictions.eq("value", value));
            KeywordSynonim s = (KeywordSynonim) c.uniqueResult();
            if (s != null) {
                return s.getKeyword();
            }
        }
        return null;
    }

    public Long getId() {
        return id;
    }

    public String getValue() {
        return value;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setValue(String value) {
        this.value = value;
    }

}

Случилась совершенно замечательная ситуация. Этот класс -- совершенно общего пользования, и был таким до того, как я вставил его в качестве mvc-формы. При этом сначала там использовалась загрузка по id. И в самый последний момент выяснилось, что грузить надо по бизнес-ключу. Фигня, но обычно надо копошиться на всех уровнях. И вот я поменял jsp и приготовился идти дальше (забыл, что у меня всё красиво). Обновил экран и оказалось, что всё уже работает.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
alsor



Зарегистрирован: 25.11.2005
Сообщения: 1166
Откуда: Киберпространство

СообщениеДобавлено: Сб Мар 21, 2009 10:43 pm    Заголовок сообщения: Ответить с цитатой

ну действительно нормальный подход.
_________________
JIT happens!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов forum.alsor.net -> IT-форум Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB