Spring Boot中除Controller外,是否有更优方式向视图层传递变量?
优化Spring Boot视图全局变量传递的方案
不用每个Controller都手动往Model里加变量,有几种更省心的方式,甚至可以直接在@SpringBootApplication所在类里完成全局配置:
1. 用@ControllerAdvice统一注入全局变量
直接把全局变量的注入逻辑加到你的BackendApplication类里就行,所有Controller的视图会自动拿到这个变量:
@SpringBootApplication @ControllerAdvice public class BackendApplication { @Value("${api.url}") private String apiUrl; public static void main(String[] args) { SpringApplication.run(BackendApplication.class, args); } @ModelAttribute("API_URL") public String getApiUrl() { return apiUrl; } }
原理:@ControllerAdvice会对所有Controller生效,被@ModelAttribute标记的方法,它的返回值会自动添加到每个请求的Model中,所有视图都能直接用${API_URL}调用这个变量。
2. 若用Thymeleaf,直接在模板里读配置
如果你的项目用Thymeleaf做模板引擎,甚至不用在Java层传递变量,直接在模板里通过SpringEL读取配置:
<!-- 直接显示配置值 --> <div th:text="${#environment.getProperty('api.url')}"></div> <!-- 给JS变量赋值 --> <script> const apiUrl = [[${@environment.getProperty('api.url')}]]; </script>
这种方式连Config类里的Bean都不用定义,一步到位。
3. 给模板引擎配置全局变量(以Thymeleaf为例)
如果需要更灵活的全局变量配置,可以写个配置类给Thymeleaf设置全局变量:
@Configuration public class ThymeleafGlobalConfig { @Value("${api.url}") private String apiUrl; @Bean public SpringTemplateEngine springTemplateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver); // 添加全局变量到所有视图上下文 engine.addContextInitializer(context -> context.setVariable("API_URL", apiUrl)); return engine; } }
这样所有Thymeleaf视图都会默认包含API_URL变量,不用再手动传递。
内容的提问来源于stack exchange,提问作者pheromix
相关产品推荐
相关产品推荐

