2010-07-20 2 views
4

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

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

UPDATE

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

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

ответ

7

Класса вы, вероятно, ищете это 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, который находит методы контроллера и вызывает их, это не перехватчик.

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

+0

Спасибо! Это то, что я искал. –

4

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

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