2012-02-08 31 views
0

我想让视图知道什么控制器和什么动作被调用来生成它。事实上,我想要做这样的事情的观点:Spring MVC:将控制器+操作名称传递给视图的最佳方法是什么?

<script> 
    var controller = "${controllerName}"; 
    var controllerAction = "${controllerAction}"; 
</script> 

,并在以后包括.js文件,

<script src="/public/script.js"></script> 

...在这个.js文件我想有机会获得两个变量:

if(controller == "UserController" && controllerAction == "Edit") 
{ 
    // ... 
} 
else 
{ 
    // ... 
} 

我的问题:什么是自动将这些控制器和动作名称传递给视图的最佳方式?

我的控制器扩展了一个抽象的“BaseController”,所以我想将这些变量添加到ModelAttribute的最佳位置就在那里。我会优先考虑具体的控制器,无法为这些变量添加。但是父控制器怎么知道孩子具体控制器的名字和动作的名字呢?

我可以检查在BaseController堆栈跟踪,但我真的不喜欢这种解决方案

你有一个更好的解决方案建议?

回答

-1

为什么你不能只从你的网址获得这些信息?通常一个url映射到一个控制器和在Spring中的操作。在JavaScript中,为什么不只是解析URL来获取这些信息?如果问题在于根据帖子,获取或标题信息的不同,操作可能会有所不同,那么您可以将其作为参数追加到url中。

+0

我将您的答案标记为解决方案,谢谢!大多数情况下,解析网址都会起到诀窍的作用!我还发现了一种使用拦截器和Spring 3.1自动传递这两个变量的方法(请参阅我的“下面的解决方案”)。 – electrotype 2012-02-08 12:52:26

4

我找到了解决方案。

使用Spring 3.1,我用这些豆子:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
    <property name="interceptors"> 
     <bean id="baseInterceptor" class="xxx.xxx.xxx.BaseInterceptor" /> 
    </property> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> 

而且在BaseInterceptor的的postHandle()方法, “对象处理” 变成了HandlerMethod实例,它包含了我需要的所有信息!然后我只需将这些信息添加到ModelAndView对象。

public class BaseInterceptor extends HandlerInterceptorAdapter 
{ 
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 
    { 
     HandlerMethod handlerMethod = (HandlerMethod)handler; 

     modelAndView.addObject("controllerName", handlerMethod.getBean().getClass().getName()); 
     modelAndView.addObject("controllerAction", handlerMethod.getMethod().getName()); 
    } 
} 
+0

感谢您分享。这可能也是做应用程序可能需要做的任何日志记录的好方法。我可以想到这个的几个用途! – Ali 2012-02-08 13:27:54

相关问题