Spring MVC父模板模型组件

时间:2016-04-21 23:37:18

标签: 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("listProducts", products );
        mav.addObject("listCategories",  menuCategoriasUtils.obtainCategories());
        return mav;
    }

提供不属于我们当前正在调用的控制器的这些元素的好方法/模式是什么,所以我们不要在每种方法中反复重复不相关的操作。每个控制器?

谢谢!

1 个答案:

答案 0 :(得分:3)

有几种方法可以在视图中显示常见数据。其中一个是使用@ModelAttributte注释。

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

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
    }

}

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

@Controller
public class ProductController extends CommonController{

    //... controller methods
}

现在,您无需将currentLogin添加到模型属性。它将自动添加到每个模型中。您可以在视图中访问用户登录:

...
<body>
   <span>Current login: ${currentLogin}</span>
</body>

有关@ModelAttribute注释的使用的更多详细信息,您可以找到here in documentation