Я использую Spring MVC Framework
, и мне бы хотелось, чтобы все страницы .jsp
в представлении имели доступ к атрибутам пользователя (имя, пол, возраст...). До сих пор я использовал метод addAttribute
Model(UI)
в каждом контроллере для передачи текущих атрибутов пользователя в View
. Есть ли способ сделать это только один раз и избежать того же кода в каждом Controller
?
Как сделать атрибут Model глобальным?
Ответ 1
Вы можете использовать аннотацию 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" будет выполняться по каждому запросу, и поскольку он имеет аннотацию @ModelAttribute, результат метода (пользователя) будет помещен в модель для каждого запроса.
Пользователь будет доступен в вашем jsp, используя ${user}, поскольку это имя было присвоено @ModelAttribute (пример: @ModelAttribute ( "fooBar" ) → ${fooBar})
Вы можете передать некоторые аргументы в аннотацию @ControllerAdvice, чтобы указать, какие контроллеры рекомендуются этим глобальным контроллером. Например:
@ControllerAdvice(assignableTypes=FooController.class,BarController.class})
or
@ControllerAdvice(basePackages="foo.bar.web.admin","foo.bar.web.management"}))
Ответ 2
Если речь идет об пользовательских атрибутах, вы можете привязать модель bean к сеансу как к атрибуту, доступ к которому можно получить на каждом представлении. Это нужно сделать только один раз.
Другой вариант может заключаться в том, чтобы реализовать HandlerInterceptor и разоблачить модель для каждого запроса.