Перехватить представление / ответ в Spring MVC 3 - PullRequest
4 голосов
/ 20 июля 2010

Я новичок в Spring MVC 3 и понимаю основные понятия. Я могу делать простые вещи, такие как создание контроллеров, служб и представлений. Однако я не совершил набег на более продвинутую территорию. Поэтому я прошу прощения, если этот вопрос кажется глупым (или невозможным).

Мне интересно, есть ли способ перехватить представление и / или ответ и изменить его до того, как он будет отправлен клиенту? Я предполагаю, что именно так Spring выполняет привязку данных к элементам формы на пути к клиенту. Я хотел бы проверить аннотации к элементам в доменном классе и изменить представление в соответствии с этими аннотациями. Это будет включать введение нового кода (HTML или Javascript) в ответ.

UPDATE

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

Есть ли способ сделать это?

Ответы [ 2 ]

8 голосов
/ 20 июля 2010

Класс, который вы, вероятно, ищете, это org.springframework.web.servlet.HandlerInterceptor Вы можете реализовать метод postHandle в этом интерфейсе и, как подразумевает подпись, иметь доступ как к запросу, так и к ответу, а также к карте объектов модели, которыеваш контроллер создан.(и сам контроллер, вот что такое параметр Object handler.)

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

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <list>
            <bean class="a.package.MyHandlerInterceptor"/>
        </list>
    </property>
</bean>

Кстатина самом деле привязка выполняется внутри HandlerAdapter, который находит методы Controller и вызывает их, это не перехватчик.

Редактирование: чтобы ответить на ваши изменения, да, именно здесь у вас есть шанс получить объект модели и работать с ним.это больше, после того, как контроллер сделан, но прежде, чем он перейдет к рендерингу JSP.Таким образом, вы можете сделать что-то вроде добавления myCustomScript в ModelMap и добавления ${myCustomScript} в <head> вашего jsp, получить вспомогательный объект из ModelMap, проверить его и т. Д. И т. Д.

5 голосов
/ 20 июля 2010

Да, на самом деле существует несколько способов:

  • пружинные перехватчики mvc (найдите их в mvc docs ) - вы можете определить preHandle / postHandleметоды и применить перехватчик к ряду контроллеров
  • spring aop - определить аспект, который будет выполняться до / после методов данного контроллера
  • фильтры сервлета - этонаименее желательный вариант, так как он не интегрирован с пружиной - вы не можете вводить зависимости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...