Я бы хотел начать обсуждение разделения чистой модели и модели пользовательского интерфейса в Spring 3.
Под чистой моделью я имею в виду основной объект / объекты, которые я извлекаю из базы данных, скажем, некоторую «учетную запись пользователя».Он содержит достаточно информации, чтобы отобразить ее в виде HTML или передать в веб-службу.
Под моделью пользовательского интерфейса я подразумеваю все вспомогательные материалы, которые необходимы в пользовательском интерфейсе для работы с этим объектом.Например, если «учетная запись пользователя» имеет «состояние», то мне нужно извлечь все «состояния» из базы данных, скажем, для поля со списком.Мнения сложны, и в некоторых случаях они требуют больше информации, в других - меньше.Также было бы неплохо иметь возможность изменять некоторые списки, добавляя такие элементы, как «Выбрать все», что является чисто пользовательским интерфейсом (и не совсем удобно сделать из шаблона представления).
Я слышал, что есть так называемые Model-Шаблон View-ViewModel, который, кажется, решает эти проблемы, но я никогда не пробовал его реализации.
Решение, которое я сейчас использую, состоит в том, чтобы разбить логику на две службы - одну для чистой модели и одну для модели пользовательского интерфейса.Это выглядит так:
@RequestMapping(value="app/user_accounts/{id}")
public String getUserAccount(@PathVariable("id") String id) {
service.getUserAccount(id); // Gets main object and puts it into model
presenter.formUserAccount(); // Gets all classifier for main object's properties
return "user_account";
}
Что мне не нравится в этом, так это то, что представление и его так называемая модель представления не привязаны друг к другу.Я могу вызвать Presenter.formUserAccount () и вернуть полностью несвязанное имя представления.
Другой подход, который я вижу, похож на аннотацию контроллера Spring.У нас есть классы, аннотированные как @ViewModels, и методы, которые отображаются для просмотра имен.Перехватчик находит и выполняет эти методы перед отображением определенного представления.Это кажется достаточно элегантным, но требует много написания кода.
Как бы вы решили эту проблему?