Метод Spring Framework MVC Base Controller - PullRequest
7 голосов
/ 08 ноября 2011

У меня есть несколько методов контроллера, распределенных по нескольким классам. Каждый метод принимает объект Model, и все мои методы заполняют некоторые общие свойства в модели (главным образом управляют отображением панели навигации). Есть ли способ для меня, чтобы подключить «базовый» метод в Spring? Я хочу один метод, который может заполнить мои общие свойства, а затем перейти к конкретному методу контроллера (или наоборот). Кто-нибудь знает, как это сделать?

Ответы [ 3 ]

3 голосов
/ 08 ноября 2011

Похоже, HandlerIntercepto r может быть хорошим подходом.

Это немного похоже на АОП - вы можете определить класс, который имеет метод PreHandle или PostHandle, и настроить, какие запросы он будет выполнять. В вашем случае вы, вероятно, захотите PostHandle, поскольку это даст вам доступ к ModelAndView, так что вы можете заполнить его общими элементами.

2 голосов
/ 08 ноября 2011

Существует несколько точек расширения в Spring и Spring MVC, которые вы можете взять:

  • HandlerInterceptor - простой способ перехвата каждого метода обработчика
  • Spring AOP - совет до и после, соответствующий всем вашим контроллерам
  • WebArgumentResolver - может быть, вы можете как-то настроить разрешающие аргументы и обработать их перед вызовом контроллера?
1 голос
/ 08 ноября 2011

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

org.springframework.web.servlet.HandlerInterceptor имеет метод 'postHandle', который дает вам доступ к запросу, контроллер, обработавший запрос, и ModelMap. Это должно быть все, что вам нужно. Если вам нужен какой-то контроль со стороны контроллера, вы всегда можете добавить к нему метаданные, указывающие, например, какой класс заголовка он использует (затем в будущем, когда вам придется это изменить, это будет одна строка в XML или аннотации, вместо того, чтобы менять класс, от которого вы наследуете, и все, что с этим связано.)

Вы включаете их так:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <bean class="a.package.MyHandlerInterceptor"/>
        </list>
    </property>
</bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...