如何使模型属性全局?

2022-09-03 09:55:42

我正在使用,并且我希望视图的所有页面都可以访问用户的属性(姓名,性别,年龄...到目前为止,我使用每个控制器中的方法将当前用户的属性传递给 .有没有办法只做一次,避免在每个代码中都有相同的代码?Spring MVC Framework.jspaddAttributeModel(UI)ViewController


答案 1

你可以在一个新的 Controller 类上使用 Spring 的注释,如下所示:@ControllerAdvice

@ControllerAdvice
public class GlobalControllerAdvice {

    @ModelAttribute("user")
    public List<Exercice> populateUser() {
        User user = /* Get your user from service or security context or elsewhere */;
        return user;
    }
}

该方法将在每个请求上执行,并且由于它具有注释,因此方法(对象)的结果将通过名称(在注释上声明)为每个请求放入模型中。populateUser@ModelAttributeUseruser@ModelAttribute

用户将在你的jsp中使用,因为这是给定的名称(例如:${user}@ModelAttribute@ModelAttribute("fooBar") -> ${fooBar} )

您可以将一些参数传递给注释,以指定此全局控制器建议使用哪些控制器。例如:@ControllerAdvice

@ControllerAdvice(assignableTypes={FooController.class,BarController.class})

@ControllerAdvice(basePackages={"foo.bar.web.admin","foo.bar.web.management"}))

答案 2

如果它与 User 的属性有关,则可以将模型 Bean 作为可在每个视图上访问的属性绑定到会话。这只需要做一次。

另一种选择可能是实现一个HandlerInterceptor,并将模型公开给每个请求。


推荐