我正在使用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;
}
提供不属于我们当前正在调用的控制器的这些元素的好方法/模式是什么,所以我们不要在每种方法中反复重复不相关的操作。每个控制器?
谢谢!
答案 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。