Как лучше изменить мою модель в Spring MVC, если я забочусь о IOC - PullRequest
3 голосов
/ 03 октября 2008

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 03 октября 2008

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

1 голос
/ 03 октября 2008

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

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

0 голосов
/ 05 октября 2008

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

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

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

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

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

...