2008-10-03 3 views
3

Я создаю приложение с использованием Spring MVC. Я хочу внести определенные изменения в мою модель для каждого контроллера в приложении. В частности, я хочу вставить некоторые дополнительные данные в модель, которая будет присутствовать на всех страницах приложения.Как лучше всего изменить мою модель в Spring MVC, если меня волнует IOC

Я мог бы сделать это несколькими способами: просто добавить данные в конце каждого контроллера, использовать подкласс модели, который добавляет мои дополнительные данные, использовать подкласс ModelAndView, который обертывает мою модель, использует подкласс VelocityView, который обертывает Модель перед использованием ... Я уверен, что есть другие варианты.

Но у меня есть ограничение «элегантности»: я не хочу писать код в каждом контроллере, я хочу, чтобы это поведение было определено в one-and-only-one. В идеале, это будет контролироваться моим конфигурационным файлом IOC bean.

Есть ли у кого-нибудь рекомендации, как достичь этого элегантно?

ответ

4

Аспекты - хороший подход, но Spring MVC делает это еще проще - вы можете определить HandlerInterceptor, который будет вызываться до или после каждого обращения к запросу. В методе postHandle HandlerInterceptor (в вашем классе, который реализует интерфейс HandlerInterceptor) вы можете добавить свои данные в ModelAndView. Вы определяете, какие обработчики должны быть перехвачены в вашем файле конфигурации.

1

Вы можете взглянуть на использование Аспектов. Весна даже имеет расширение AOP, которое вы могли бы использовать.

Вкратце аспект позволит вам определить код один раз, который затем будет «сплетен» в ваши классы либо при компиляции классов, либо при загрузке загрузчиком классов. Это относительно продвинутый материал и не самый интуитивный для новых программистов, но он предназначен для решения именно той проблемы, о которой вы говорите.

0

Возможно, я ошибаюсь, но подозреваю, что вы неправильно описали свои требования.

Вы, кажется, говорите: «Я хочу, чтобы некоторые данные были добавлены в мою модель для всех контроллеров».

Я подозреваю, что вы имеете в виду «Я хочу, чтобы определенные данные были доступны для всех видов».

Если мои подозрения верны, то добавление данных к вашей модели загрязняет вашу модель и нарушает принцип единой ответственности. Это особенно верно, если одни и те же данные должны быть добавлены к нескольким моделям. Будьте осторожны, что вы не просто используете свою модель в качестве удобной «несущей» данных - там, где данные действительно не имеют ничего общего с моделью.

Понятно, что я не совсем знаком с способом Spring MVC, но более подробный пример того, что вы пытаетесь достичь, может дать более обоснованное обсуждение.

+0

Я не уверен, что я полностью понимаю различие, которое вы делаете - я думал, что «модель» весной была «доступными для просмотра данными». Если есть другой способ сделать данные доступными для представления, что это такое? – mcherm 2008-10-08 19:03:47