2014-01-22 4 views
5

У меня есть вопрос, и проблема, которую мне нужно исправлять в ближайшее время ... Я вытащил свои волосы, перейдя несколько альтернатив, как решить эту проблему.Spring имя контроллера MVC от JSP/страница

См. Раздел «Мне нужно отобразить текущий контроллер Spring Spring с JSP-страницы. Имя не должно анализироваться в самом JSP, я фактически использую другой класс (своего рода taglibrary), чтобы отображать эту информацию в нижней части страницы.

Есть ли способ получить имя контроллера из внешнего класса? (Когда я говорю «снаружи», я имею в виду от другого класса, кроме самого контроллера). Возможно, из запроса как-то? (Или какой-либо атрибут запроса Spring Security?). Возможно, перехватчик?

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

Любые советы априорированы!

+0

Возможный дубликат [Как показать все контроллеры и отображения в представлении] (http://stackoverflow.com/questions/9766800/how-to-show-all-controllers-and-mappings-in-a- view) – NimChimpsky

+0

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

+0

Возможный дубликат [Получить имя контроллера и метода Spring] (http: // stackoverflow.com/questions/17169722/spring-3-web-mvc-get-name-of-controller-and-method-in-view) – andyb

ответ

4

Вы можете реализовать HandlerInterceptor* имеет метод postHandle, который имеет два параметра, нужно:

  • Object handler - что может быть приведен к HandlerMethod, содержит информацию о методе контроллера, который имеет обрабатывающего запрос
  • ModelAndView - там вам нужно добавить новую информацию об обработке методом

полный метод подписи org.springframework.web.servlet.HandlerInterceptor#postHandle:

void postHandle(HttpServletRequest request, 
       HttpServletResponse response, 
       Object handler, 
       ModelAndView modelAndView) 
     throws Exception; 

* Вместо реализации HandlerInterceptor непосредственно, можно расширить HandlerInterceptorAdapter - это удобный абстрактный класс, который реализует все методы HandlerInterceptor с пустым телом, так что один только нужно чтобы переопределить методы, которые необходимы.

* Не запутаться, есть два HandlerInterceptor класса, один для сервлетов, и один для портлетов (org.springframework.web.portlet.HandlerInterceptor). Используйте HandlerInterceptor для сервлетов oorg.springframework.web.servlet.HandlerInterceptor!

+0

Спасибо! Это было именно то, что мне нужно. –

+0

Чтобы выяснить, как это решило мою проблему. Во-первых, я передал 'handler' в' HandlerMethod', затем получил имя класса из 'handlerMethod.getMethod(). GetDeclaringClass(). GetName()' и установил его как атрибут запроса, который затем я могу использовать в своем обычном TagLib. –

1

нормальный ява путь от mwithin контроллер сам, вероятно, выиграл, T работа, как весной создает прокси исходного класса:

String className = this.getClass().getSimpleName(); 

Я думаю, что вам нужно реализовать request mapping handler

+0

Для этого требуется отредактировать BUNCH контроллеров. Я больше думал о том, чтобы заставить его работать в глобальном масштабе с помощью перехватчика или такого –

+0

@RobinJonsson RequestMappingHandlerMapping не требует редактирования существующих контроллеров – NimChimpsky

0

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

+0

+1 для использования AspectJ для задач перекрестной резки – Ralph

+0

Добавление кода примера сделает это намного лучшим ответом – andyb

Смежные вопросы