2

目前我@ModelAttribute用来设置全局变量(例如页脚的推文)@Controller

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

但是当创建另一个控制器以保持干净和分离时,它们在逻辑上已经消失了:

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

在控制器范围内设置全局变量的最佳做法是什么?

4

2 回答 2

6

如果你想把一些数据放到每个页面上,使用拦截器很容易:

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 的弹簧配置):

<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>
于 2013-08-13T15:19:05.237 回答
1

您可以扩展 HandlerInterceptorAdapter 并添加通用 modelAttributes thr

于 2013-08-13T14:05:40.563 回答