从JSP /页面获取Spring MVC控制器类名

5
我有一个问题和一个需要尽快解决的问题...在寻找解决方案时,我已经把头发都拔光了。
我需要在JSP页面上显示当前服务的Spring Controller。名称不必在JSP本身中解析,实际上我正在使用另一个类(一种标签库)在每个页面底部显示此信息。
是否有办法从外部类获取控制器名称?(当我说外部时,我的意思是从控制器本身以外的另一个类中获取。) 也许从请求中获取?(或一些Spring安全请求属性?) 也许是拦截器?
我想避免扩展控制器类来解决此问题。
任何建议都将不胜感激!

可能是如何在视图中显示所有控制器和映射的重复问题。 - NimChimpsky
你所说的当前服务控制器,是指刚刚处理请求并呈现当前加载视图的控制器吗? - Pratik Shelar
可能是获取Spring控制器和视图中方法的名称的重复问题。 - andyb
@Pratik 是的,完全正确。我想从控制器外部获取那些信息。我不想编辑一堆控制器才能让它工作,我想从拦截器或外部类中实现这个功能。 - Robin Jonsson
3个回答

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 类,一个用于 Servlets,另一个用于 Portlets(org.springframework.web.portlet.HandlerInterceptor)。请使用 Servlets 的 HandlerInterceptor,即 org.springframework.web.servlet.HandlerInterceptor


谢谢!这正是我需要的。 - Robin Jonsson
为了澄清这是如何解决我的问题的。首先,我将handler转换为HandlerMethod,然后从handlerMethod.getMethod().getDeclaringClass().getName()中获取类名,并将其设置为请求属性,然后我可以在自定义标签库中使用它。 - Robin Jonsson

1
正常的Java方式,从控制器本身内部开始可能不起作用,因为Spring会创建原始类的代理:
String className = this.getClass().getSimpleName();

我认为你需要实现一个请求映射处理程序


这需要我编辑大量的控制器。我更倾向于通过使用拦截器或类似的方式在全局范围内使其工作。 - Robin Jonsson
@RobinJonsson,RequestMappingHandlerMapping不需要编辑现有的控制器。 - NimChimpsky

0

你可以创建一个后置通知拦截器,在控制器被调用后被调用。在这个拦截器中,你可以获取应用此建议的pointCut方法。一旦你拥有了它,你可以将其作为ModelAndView映射中的属性添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接