Java SpringMVC父模板模型组件

Java SpringMVC父模板模型组件,java,spring,spring-mvc,model-view-controller,template-engine,Java,Spring,Spring Mvc,Model View Controller,Template Engine,我正在使用Spring MVC 4,我正在使用一个模板构建一个站点,该模板需要跨页面的几个常见组件,例如登录状态、购物车状态等。控制器功能的一个示例如下: @RequestMapping( path = {"/"}, method=RequestMethod.GET) public ModelAndView index() { ModelAndView mav = new ModelAndView("index"); mav.addObject("

我正在使用Spring MVC 4,我正在使用一个模板构建一个站点,该模板需要跨页面的几个常见组件,例如登录状态、购物车状态等。控制器功能的一个示例如下:

@RequestMapping( path = {"/"}, method=RequestMethod.GET)    
    public ModelAndView index() {
        ModelAndView mav = new ModelAndView("index");
        mav.addObject("listProducts", products );
        mav.addObject("listCategories",  menuCategoriasUtils.obtainCategories());
        return mav;
    }
有什么好的方式/模式可以为这些不属于我们当前调用的控制器的元素提供信息,这样我们就不会在每个控制器的每个方法中重复不相关的操作


谢谢

有几种方法可以在视图中显示公共数据。其中之一是使用
@modelattribute
注释

比方说,您有用户登录,需要在每个页面上显示。此外,您还有安全服务,从中可以获得有关当前登录的安全信息。您必须为所有控制器创建父类,这将添加公共信息

public class CommonController{

    @Autowired
    private SecurityService securityService;

    @ModelAttribute
    public void addSecurityAttributes(Model model){
        User user = securityService.getCurrentUser();
        model.addAttribute("currentLogin", user.getLogin());

        //... add other attributes you need to show
    }

}
注意,您不需要使用
@Controller
注释标记
CommonController
。因为您永远不会直接将其用作控制器。其他控制器必须继承自
CommonController

@Controller
public class ProductController extends CommonController{

    //... controller methods
}
现在,您不应该向模型属性添加
currentLogin
。它将自动添加到每个模型中。您可以在以下视图中访问用户登录:

...
<body>
   <span>Current login: ${currentLogin}</span>
</body>
。。。
当前登录:${currentLogin}

您可以找到有关
@modeldattribute
注释用法的更多详细信息。

非常有用的答案。这正是我想要的。谢谢,这就是我想要的解决方案。其他解决方案(主要使用拦截器)不起作用,但这一个起作用。