如何设置控制器范围的全局变量


问题内容

目前,我使用以下@ModelAttribute命令设置全局变量(例如,页脚的推文)@Controller

public @Controller class MainController {
    public @ModelAttribute void global(ModelMap map) {
        map.addAttribute("tweets", /*...*/null);
    }
}

但是从逻辑上讲,当创建另一个Controller来保持事物清洁和分离时,它们就消失了:

public @Controller class GalleryController {
    // ...
}

在全局范围内设置Controller的最佳实践是什么?


问题答案:

如果要在每个页面上放置一些数据,则很容易使用拦截器:

public class PagePopulationInterceptor extends HandlerInterceptorAdapter {

    @Autowired
    private UserService userService;

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if(modelAndView != null) {
            User user = userService.findOne(request);
            modelAndView.addObject("myUserProfile", user);
        }
    }

}

为此,还需要在webmvc-config.xml(webapp的spring配置)中声明拦截器:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="com.yourcompany.yourapp.util.PagePopulationInterceptor" />
    </mvc:interceptor>
    <!-- other interceptors (locale, theme and so on) -->
</mvc:interceptors>