我希望视图知道控制器和调用什么操作来生成它。事实上,我想在视图中做这样的事情:
<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中检查StackTrace,但我真的不喜欢这个解决方案...
你有更好的解决方案吗?
答案 0 :(得分:4)
我找到了解决方案。
使用Spring 3.1,我使用那些bean:
<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());
}
}
答案 1 :(得分:-1)
为什么您只能从网址获取此信息?通常,一个url映射到Spring中的控制器和动作。在javascript中为什么不解析网址来获取此信息?如果问题是操作因帖子,获取或标题信息而异,那么您可以将其作为参数附加到网址中。